blob: fe00a71a4dbadce3137dacf5df2e044e60726621 [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
139 peer->keys[i] = arvif->wep_keys[i];
140 }
141
142 return 0;
143}
144
145static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
146 const u8 *addr)
147{
148 struct ath10k *ar = arvif->ar;
149 struct ath10k_peer *peer;
150 int first_errno = 0;
151 int ret;
152 int i;
153
154 lockdep_assert_held(&ar->conf_mutex);
155
156 spin_lock_bh(&ar->data_lock);
157 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
158 spin_unlock_bh(&ar->data_lock);
159
160 if (!peer)
161 return -ENOENT;
162
163 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
164 if (peer->keys[i] == NULL)
165 continue;
166
167 ret = ath10k_install_key(arvif, peer->keys[i],
168 DISABLE_KEY, addr);
169 if (ret && first_errno == 0)
170 first_errno = ret;
171
172 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200173 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300174 i, ret);
175
176 peer->keys[i] = NULL;
177 }
178
179 return first_errno;
180}
181
182static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
183 struct ieee80211_key_conf *key)
184{
185 struct ath10k *ar = arvif->ar;
186 struct ath10k_peer *peer;
187 u8 addr[ETH_ALEN];
188 int first_errno = 0;
189 int ret;
190 int i;
191
192 lockdep_assert_held(&ar->conf_mutex);
193
194 for (;;) {
195 /* since ath10k_install_key we can't hold data_lock all the
196 * time, so we try to remove the keys incrementally */
197 spin_lock_bh(&ar->data_lock);
198 i = 0;
199 list_for_each_entry(peer, &ar->peers, list) {
200 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
201 if (peer->keys[i] == key) {
Kalle Valob25f32c2014-09-14 12:50:49 +0300202 ether_addr_copy(addr, peer->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300203 peer->keys[i] = NULL;
204 break;
205 }
206 }
207
208 if (i < ARRAY_SIZE(peer->keys))
209 break;
210 }
211 spin_unlock_bh(&ar->data_lock);
212
213 if (i == ARRAY_SIZE(peer->keys))
214 break;
215
216 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr);
217 if (ret && first_errno == 0)
218 first_errno = ret;
219
220 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200221 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +0200222 addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300223 }
224
225 return first_errno;
226}
227
Kalle Valo5e3dd152013-06-12 20:52:10 +0300228/*********************/
229/* General utilities */
230/*********************/
231
232static inline enum wmi_phy_mode
233chan_to_phymode(const struct cfg80211_chan_def *chandef)
234{
235 enum wmi_phy_mode phymode = MODE_UNKNOWN;
236
237 switch (chandef->chan->band) {
238 case IEEE80211_BAND_2GHZ:
239 switch (chandef->width) {
240 case NL80211_CHAN_WIDTH_20_NOHT:
241 phymode = MODE_11G;
242 break;
243 case NL80211_CHAN_WIDTH_20:
244 phymode = MODE_11NG_HT20;
245 break;
246 case NL80211_CHAN_WIDTH_40:
247 phymode = MODE_11NG_HT40;
248 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400249 case NL80211_CHAN_WIDTH_5:
250 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300251 case NL80211_CHAN_WIDTH_80:
252 case NL80211_CHAN_WIDTH_80P80:
253 case NL80211_CHAN_WIDTH_160:
254 phymode = MODE_UNKNOWN;
255 break;
256 }
257 break;
258 case IEEE80211_BAND_5GHZ:
259 switch (chandef->width) {
260 case NL80211_CHAN_WIDTH_20_NOHT:
261 phymode = MODE_11A;
262 break;
263 case NL80211_CHAN_WIDTH_20:
264 phymode = MODE_11NA_HT20;
265 break;
266 case NL80211_CHAN_WIDTH_40:
267 phymode = MODE_11NA_HT40;
268 break;
269 case NL80211_CHAN_WIDTH_80:
270 phymode = MODE_11AC_VHT80;
271 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400272 case NL80211_CHAN_WIDTH_5:
273 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300274 case NL80211_CHAN_WIDTH_80P80:
275 case NL80211_CHAN_WIDTH_160:
276 phymode = MODE_UNKNOWN;
277 break;
278 }
279 break;
280 default:
281 break;
282 }
283
284 WARN_ON(phymode == MODE_UNKNOWN);
285 return phymode;
286}
287
288static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
289{
290/*
291 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
292 * 0 for no restriction
293 * 1 for 1/4 us
294 * 2 for 1/2 us
295 * 3 for 1 us
296 * 4 for 2 us
297 * 5 for 4 us
298 * 6 for 8 us
299 * 7 for 16 us
300 */
301 switch (mpdudensity) {
302 case 0:
303 return 0;
304 case 1:
305 case 2:
306 case 3:
307 /* Our lower layer calculations limit our precision to
308 1 microsecond */
309 return 1;
310 case 4:
311 return 2;
312 case 5:
313 return 4;
314 case 6:
315 return 8;
316 case 7:
317 return 16;
318 default:
319 return 0;
320 }
321}
322
323static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
324{
325 int ret;
326
327 lockdep_assert_held(&ar->conf_mutex);
328
329 ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800330 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200331 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200332 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300333 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800334 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300335
336 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800337 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200338 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200339 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300340 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800341 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100342 spin_lock_bh(&ar->data_lock);
343 ar->num_peers++;
344 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300345
346 return 0;
347}
348
Kalle Valo5a13e762014-01-20 11:01:46 +0200349static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
350{
351 struct ath10k *ar = arvif->ar;
352 u32 param;
353 int ret;
354
355 param = ar->wmi.pdev_param->sta_kickout_th;
356 ret = ath10k_wmi_pdev_set_param(ar, param,
357 ATH10K_KICKOUT_THRESHOLD);
358 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200359 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200360 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200361 return ret;
362 }
363
364 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
365 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
366 ATH10K_KEEPALIVE_MIN_IDLE);
367 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200368 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200369 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200370 return ret;
371 }
372
373 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
374 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
375 ATH10K_KEEPALIVE_MAX_IDLE);
376 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200377 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200378 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200379 return ret;
380 }
381
382 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
383 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
384 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
385 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200386 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200387 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200388 return ret;
389 }
390
391 return 0;
392}
393
Michal Kazior424121c2013-07-22 14:13:31 +0200394static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
395{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200396 struct ath10k *ar = arvif->ar;
397 u32 vdev_param;
398
Michal Kazior424121c2013-07-22 14:13:31 +0200399 if (value != 0xFFFFFFFF)
400 value = min_t(u32, arvif->ar->hw->wiphy->rts_threshold,
401 ATH10K_RTS_MAX);
402
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200403 vdev_param = ar->wmi.vdev_param->rts_threshold;
404 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200405}
406
407static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
408{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200409 struct ath10k *ar = arvif->ar;
410 u32 vdev_param;
411
Michal Kazior424121c2013-07-22 14:13:31 +0200412 if (value != 0xFFFFFFFF)
413 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
414 ATH10K_FRAGMT_THRESHOLD_MIN,
415 ATH10K_FRAGMT_THRESHOLD_MAX);
416
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200417 vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
418 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200419}
420
Kalle Valo5e3dd152013-06-12 20:52:10 +0300421static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
422{
423 int ret;
424
425 lockdep_assert_held(&ar->conf_mutex);
426
427 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
428 if (ret)
429 return ret;
430
431 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
432 if (ret)
433 return ret;
434
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100435 spin_lock_bh(&ar->data_lock);
436 ar->num_peers--;
437 spin_unlock_bh(&ar->data_lock);
438
Kalle Valo5e3dd152013-06-12 20:52:10 +0300439 return 0;
440}
441
442static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
443{
444 struct ath10k_peer *peer, *tmp;
445
446 lockdep_assert_held(&ar->conf_mutex);
447
448 spin_lock_bh(&ar->data_lock);
449 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
450 if (peer->vdev_id != vdev_id)
451 continue;
452
Michal Kazior7aa7a722014-08-25 12:09:38 +0200453 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300454 peer->addr, vdev_id);
455
456 list_del(&peer->list);
457 kfree(peer);
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100458 ar->num_peers--;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300459 }
460 spin_unlock_bh(&ar->data_lock);
461}
462
Michal Kaziora96d7742013-07-16 09:38:56 +0200463static void ath10k_peer_cleanup_all(struct ath10k *ar)
464{
465 struct ath10k_peer *peer, *tmp;
466
467 lockdep_assert_held(&ar->conf_mutex);
468
469 spin_lock_bh(&ar->data_lock);
470 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
471 list_del(&peer->list);
472 kfree(peer);
473 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100474 ar->num_peers = 0;
Michal Kaziora96d7742013-07-16 09:38:56 +0200475 spin_unlock_bh(&ar->data_lock);
476}
477
Kalle Valo5e3dd152013-06-12 20:52:10 +0300478/************************/
479/* Interface management */
480/************************/
481
Michal Kazior64badcb2014-09-18 11:18:02 +0300482void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
483{
484 struct ath10k *ar = arvif->ar;
485
486 lockdep_assert_held(&ar->data_lock);
487
488 if (!arvif->beacon)
489 return;
490
491 if (!arvif->beacon_buf)
492 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
493 arvif->beacon->len, DMA_TO_DEVICE);
494
495 dev_kfree_skb_any(arvif->beacon);
496
497 arvif->beacon = NULL;
498 arvif->beacon_sent = false;
499}
500
501static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
502{
503 struct ath10k *ar = arvif->ar;
504
505 lockdep_assert_held(&ar->data_lock);
506
507 ath10k_mac_vif_beacon_free(arvif);
508
509 if (arvif->beacon_buf) {
510 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
511 arvif->beacon_buf, arvif->beacon_paddr);
512 arvif->beacon_buf = NULL;
513 }
514}
515
Kalle Valo5e3dd152013-06-12 20:52:10 +0300516static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
517{
518 int ret;
519
Michal Kazior548db542013-07-05 16:15:15 +0300520 lockdep_assert_held(&ar->conf_mutex);
521
Kalle Valo5e3dd152013-06-12 20:52:10 +0300522 ret = wait_for_completion_timeout(&ar->vdev_setup_done,
523 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
524 if (ret == 0)
525 return -ETIMEDOUT;
526
527 return 0;
528}
529
Michal Kazior1bbc0972014-04-08 09:45:47 +0300530static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300531{
Michal Kaziorc930f742014-01-23 11:38:25 +0100532 struct cfg80211_chan_def *chandef = &ar->chandef;
533 struct ieee80211_channel *channel = chandef->chan;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300534 struct wmi_vdev_start_request_arg arg = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300535 int ret = 0;
536
537 lockdep_assert_held(&ar->conf_mutex);
538
Kalle Valo5e3dd152013-06-12 20:52:10 +0300539 arg.vdev_id = vdev_id;
540 arg.channel.freq = channel->center_freq;
Michal Kaziorc930f742014-01-23 11:38:25 +0100541 arg.channel.band_center_freq1 = chandef->center_freq1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300542
543 /* TODO setup this dynamically, what in case we
544 don't have any vifs? */
Michal Kaziorc930f742014-01-23 11:38:25 +0100545 arg.channel.mode = chan_to_phymode(chandef);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200546 arg.channel.chan_radar =
547 !!(channel->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300548
Michal Kazior89c5c842013-10-23 04:02:13 -0700549 arg.channel.min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -0700550 arg.channel.max_power = channel->max_power * 2;
551 arg.channel.max_reg_power = channel->max_reg_power * 2;
552 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300553
554 ret = ath10k_wmi_vdev_start(ar, &arg);
555 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200556 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200557 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300558 return ret;
559 }
560
561 ret = ath10k_vdev_setup_sync(ar);
562 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200563 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200564 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300565 return ret;
566 }
567
568 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
569 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200570 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200571 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300572 goto vdev_stop;
573 }
574
575 ar->monitor_vdev_id = vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300576
Michal Kazior7aa7a722014-08-25 12:09:38 +0200577 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300578 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300579 return 0;
580
581vdev_stop:
582 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
583 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200584 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200585 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300586
587 return ret;
588}
589
Michal Kazior1bbc0972014-04-08 09:45:47 +0300590static int ath10k_monitor_vdev_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300591{
592 int ret = 0;
593
594 lockdep_assert_held(&ar->conf_mutex);
595
Marek Puzyniak52fa0192013-09-24 14:06:24 +0200596 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
597 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200598 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200599 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300600
601 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
602 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200603 ath10k_warn(ar, "failed to to request monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200604 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300605
606 ret = ath10k_vdev_setup_sync(ar);
607 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200608 ath10k_warn(ar, "failed to synchronise monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200609 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300610
Michal Kazior7aa7a722014-08-25 12:09:38 +0200611 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
Michal Kazior1bbc0972014-04-08 09:45:47 +0300612 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300613 return ret;
614}
615
Michal Kazior1bbc0972014-04-08 09:45:47 +0300616static int ath10k_monitor_vdev_create(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300617{
618 int bit, ret = 0;
619
620 lockdep_assert_held(&ar->conf_mutex);
621
Ben Greeara9aefb32014-08-12 11:02:19 +0300622 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200623 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300624 return -ENOMEM;
625 }
626
Ben Greeara9aefb32014-08-12 11:02:19 +0300627 bit = ffs(ar->free_vdev_map);
628
Kalle Valo5e3dd152013-06-12 20:52:10 +0300629 ar->monitor_vdev_id = bit - 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300630
631 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
632 WMI_VDEV_TYPE_MONITOR,
633 0, ar->mac_addr);
634 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200635 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200636 ar->monitor_vdev_id, ret);
Ben Greeara9aefb32014-08-12 11:02:19 +0300637 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300638 }
639
Ben Greeara9aefb32014-08-12 11:02:19 +0300640 ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200641 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300642 ar->monitor_vdev_id);
643
Kalle Valo5e3dd152013-06-12 20:52:10 +0300644 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300645}
646
Michal Kazior1bbc0972014-04-08 09:45:47 +0300647static int ath10k_monitor_vdev_delete(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300648{
649 int ret = 0;
650
651 lockdep_assert_held(&ar->conf_mutex);
652
Kalle Valo5e3dd152013-06-12 20:52:10 +0300653 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
654 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200655 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200656 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300657 return ret;
658 }
659
Ben Greeara9aefb32014-08-12 11:02:19 +0300660 ar->free_vdev_map |= 1 << ar->monitor_vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300661
Michal Kazior7aa7a722014-08-25 12:09:38 +0200662 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300663 ar->monitor_vdev_id);
664 return ret;
665}
666
Michal Kazior1bbc0972014-04-08 09:45:47 +0300667static int ath10k_monitor_start(struct ath10k *ar)
668{
669 int ret;
670
671 lockdep_assert_held(&ar->conf_mutex);
672
Michal Kazior1bbc0972014-04-08 09:45:47 +0300673 ret = ath10k_monitor_vdev_create(ar);
674 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200675 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300676 return ret;
677 }
678
679 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
680 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200681 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300682 ath10k_monitor_vdev_delete(ar);
683 return ret;
684 }
685
686 ar->monitor_started = true;
Michal Kazior7aa7a722014-08-25 12:09:38 +0200687 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
Michal Kazior1bbc0972014-04-08 09:45:47 +0300688
689 return 0;
690}
691
Michal Kazior19337472014-08-28 12:58:16 +0200692static int ath10k_monitor_stop(struct ath10k *ar)
Michal Kazior1bbc0972014-04-08 09:45:47 +0300693{
694 int ret;
695
696 lockdep_assert_held(&ar->conf_mutex);
697
Michal Kazior1bbc0972014-04-08 09:45:47 +0300698 ret = ath10k_monitor_vdev_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +0200699 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200700 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +0200701 return ret;
702 }
Michal Kazior1bbc0972014-04-08 09:45:47 +0300703
704 ret = ath10k_monitor_vdev_delete(ar);
Michal Kazior19337472014-08-28 12:58:16 +0200705 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200706 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
Michal Kazior19337472014-08-28 12:58:16 +0200707 return ret;
708 }
Michal Kazior1bbc0972014-04-08 09:45:47 +0300709
710 ar->monitor_started = false;
Michal Kazior7aa7a722014-08-25 12:09:38 +0200711 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
Michal Kazior19337472014-08-28 12:58:16 +0200712
713 return 0;
714}
715
716static int ath10k_monitor_recalc(struct ath10k *ar)
717{
718 bool should_start;
719
720 lockdep_assert_held(&ar->conf_mutex);
721
722 should_start = ar->monitor ||
723 ar->filter_flags & FIF_PROMISC_IN_BSS ||
724 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
725
726 ath10k_dbg(ar, ATH10K_DBG_MAC,
727 "mac monitor recalc started? %d should? %d\n",
728 ar->monitor_started, should_start);
729
730 if (should_start == ar->monitor_started)
731 return 0;
732
733 if (should_start)
734 return ath10k_monitor_start(ar);
Kalle Valod8bb26b2014-09-14 12:50:33 +0300735
736 return ath10k_monitor_stop(ar);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300737}
738
Marek Kwaczynskie81bd102014-03-11 12:58:00 +0200739static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
740{
741 struct ath10k *ar = arvif->ar;
742 u32 vdev_param, rts_cts = 0;
743
744 lockdep_assert_held(&ar->conf_mutex);
745
746 vdev_param = ar->wmi.vdev_param->enable_rtscts;
747
748 if (arvif->use_cts_prot || arvif->num_legacy_stations > 0)
749 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
750
751 if (arvif->num_legacy_stations > 0)
752 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
753 WMI_RTSCTS_PROFILE);
754
755 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
756 rts_cts);
757}
758
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200759static int ath10k_start_cac(struct ath10k *ar)
760{
761 int ret;
762
763 lockdep_assert_held(&ar->conf_mutex);
764
765 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
766
Michal Kazior19337472014-08-28 12:58:16 +0200767 ret = ath10k_monitor_recalc(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200768 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200769 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200770 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
771 return ret;
772 }
773
Michal Kazior7aa7a722014-08-25 12:09:38 +0200774 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200775 ar->monitor_vdev_id);
776
777 return 0;
778}
779
780static int ath10k_stop_cac(struct ath10k *ar)
781{
782 lockdep_assert_held(&ar->conf_mutex);
783
784 /* CAC is not running - do nothing */
785 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
786 return 0;
787
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200788 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300789 ath10k_monitor_stop(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200790
Michal Kazior7aa7a722014-08-25 12:09:38 +0200791 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200792
793 return 0;
794}
795
Michal Kaziord6500972014-04-08 09:56:09 +0300796static void ath10k_recalc_radar_detection(struct ath10k *ar)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200797{
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200798 int ret;
799
800 lockdep_assert_held(&ar->conf_mutex);
801
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200802 ath10k_stop_cac(ar);
803
Michal Kaziord6500972014-04-08 09:56:09 +0300804 if (!ar->radar_enabled)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200805 return;
806
Michal Kaziord6500972014-04-08 09:56:09 +0300807 if (ar->num_started_vdevs > 0)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200808 return;
809
810 ret = ath10k_start_cac(ar);
811 if (ret) {
812 /*
813 * Not possible to start CAC on current channel so starting
814 * radiation is not allowed, make this channel DFS_UNAVAILABLE
815 * by indicating that radar was detected.
816 */
Michal Kazior7aa7a722014-08-25 12:09:38 +0200817 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200818 ieee80211_radar_detected(ar->hw);
819 }
820}
821
Michal Kaziordc55e302014-07-29 12:53:36 +0300822static int ath10k_vdev_start_restart(struct ath10k_vif *arvif, bool restart)
Michal Kazior72654fa2014-04-08 09:56:09 +0300823{
824 struct ath10k *ar = arvif->ar;
825 struct cfg80211_chan_def *chandef = &ar->chandef;
826 struct wmi_vdev_start_request_arg arg = {};
827 int ret = 0;
828
829 lockdep_assert_held(&ar->conf_mutex);
830
831 reinit_completion(&ar->vdev_setup_done);
832
833 arg.vdev_id = arvif->vdev_id;
834 arg.dtim_period = arvif->dtim_period;
835 arg.bcn_intval = arvif->beacon_interval;
836
837 arg.channel.freq = chandef->chan->center_freq;
838 arg.channel.band_center_freq1 = chandef->center_freq1;
839 arg.channel.mode = chan_to_phymode(chandef);
840
841 arg.channel.min_power = 0;
842 arg.channel.max_power = chandef->chan->max_power * 2;
843 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
844 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
845
846 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
847 arg.ssid = arvif->u.ap.ssid;
848 arg.ssid_len = arvif->u.ap.ssid_len;
849 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
850
851 /* For now allow DFS for AP mode */
852 arg.channel.chan_radar =
853 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
854 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
855 arg.ssid = arvif->vif->bss_conf.ssid;
856 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
857 }
858
Michal Kazior7aa7a722014-08-25 12:09:38 +0200859 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior72654fa2014-04-08 09:56:09 +0300860 "mac vdev %d start center_freq %d phymode %s\n",
861 arg.vdev_id, arg.channel.freq,
862 ath10k_wmi_phymode_str(arg.channel.mode));
863
Michal Kaziordc55e302014-07-29 12:53:36 +0300864 if (restart)
865 ret = ath10k_wmi_vdev_restart(ar, &arg);
866 else
867 ret = ath10k_wmi_vdev_start(ar, &arg);
868
Michal Kazior72654fa2014-04-08 09:56:09 +0300869 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200870 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +0300871 arg.vdev_id, ret);
872 return ret;
873 }
874
875 ret = ath10k_vdev_setup_sync(ar);
876 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200877 ath10k_warn(ar, "failed to synchronise setup for vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +0300878 arg.vdev_id, ret);
879 return ret;
880 }
881
Michal Kaziord6500972014-04-08 09:56:09 +0300882 ar->num_started_vdevs++;
883 ath10k_recalc_radar_detection(ar);
884
Michal Kazior72654fa2014-04-08 09:56:09 +0300885 return ret;
886}
887
Michal Kaziordc55e302014-07-29 12:53:36 +0300888static int ath10k_vdev_start(struct ath10k_vif *arvif)
889{
890 return ath10k_vdev_start_restart(arvif, false);
891}
892
893static int ath10k_vdev_restart(struct ath10k_vif *arvif)
894{
895 return ath10k_vdev_start_restart(arvif, true);
896}
897
Michal Kazior72654fa2014-04-08 09:56:09 +0300898static int ath10k_vdev_stop(struct ath10k_vif *arvif)
899{
900 struct ath10k *ar = arvif->ar;
901 int ret;
902
903 lockdep_assert_held(&ar->conf_mutex);
904
905 reinit_completion(&ar->vdev_setup_done);
906
907 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
908 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200909 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +0300910 arvif->vdev_id, ret);
911 return ret;
912 }
913
914 ret = ath10k_vdev_setup_sync(ar);
915 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200916 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n",
Michal Kazior72654fa2014-04-08 09:56:09 +0300917 arvif->vdev_id, ret);
918 return ret;
919 }
920
Michal Kaziord6500972014-04-08 09:56:09 +0300921 WARN_ON(ar->num_started_vdevs == 0);
922
923 if (ar->num_started_vdevs != 0) {
924 ar->num_started_vdevs--;
925 ath10k_recalc_radar_detection(ar);
926 }
927
Michal Kazior72654fa2014-04-08 09:56:09 +0300928 return ret;
929}
930
Kalle Valo5e3dd152013-06-12 20:52:10 +0300931static void ath10k_control_beaconing(struct ath10k_vif *arvif,
Kalle Valo5b07e072014-09-14 12:50:06 +0300932 struct ieee80211_bss_conf *info)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300933{
Michal Kazior7aa7a722014-08-25 12:09:38 +0200934 struct ath10k *ar = arvif->ar;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300935 int ret = 0;
936
Michal Kazior548db542013-07-05 16:15:15 +0300937 lockdep_assert_held(&arvif->ar->conf_mutex);
938
Kalle Valo5e3dd152013-06-12 20:52:10 +0300939 if (!info->enable_beacon) {
940 ath10k_vdev_stop(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +0100941
942 arvif->is_started = false;
943 arvif->is_up = false;
944
Michal Kazior748afc42014-01-23 12:48:21 +0100945 spin_lock_bh(&arvif->ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +0300946 ath10k_mac_vif_beacon_free(arvif);
Michal Kazior748afc42014-01-23 12:48:21 +0100947 spin_unlock_bh(&arvif->ar->data_lock);
948
Kalle Valo5e3dd152013-06-12 20:52:10 +0300949 return;
950 }
951
952 arvif->tx_seq_no = 0x1000;
953
954 ret = ath10k_vdev_start(arvif);
955 if (ret)
956 return;
957
Michal Kaziorc930f742014-01-23 11:38:25 +0100958 arvif->aid = 0;
Kalle Valob25f32c2014-09-14 12:50:49 +0300959 ether_addr_copy(arvif->bssid, info->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +0100960
961 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
962 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300963 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200964 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200965 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +0100966 ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300967 return;
968 }
Michal Kaziorc930f742014-01-23 11:38:25 +0100969
970 arvif->is_started = true;
971 arvif->is_up = true;
972
Michal Kazior7aa7a722014-08-25 12:09:38 +0200973 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300974}
975
976static void ath10k_control_ibss(struct ath10k_vif *arvif,
977 struct ieee80211_bss_conf *info,
978 const u8 self_peer[ETH_ALEN])
979{
Michal Kazior7aa7a722014-08-25 12:09:38 +0200980 struct ath10k *ar = arvif->ar;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200981 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300982 int ret = 0;
983
Michal Kazior548db542013-07-05 16:15:15 +0300984 lockdep_assert_held(&arvif->ar->conf_mutex);
985
Kalle Valo5e3dd152013-06-12 20:52:10 +0300986 if (!info->ibss_joined) {
987 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
988 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +0200989 ath10k_warn(ar, "failed to delete IBSS self peer %pM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300990 self_peer, arvif->vdev_id, ret);
991
Michal Kaziorc930f742014-01-23 11:38:25 +0100992 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +0300993 return;
994
995 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id,
Michal Kaziorc930f742014-01-23 11:38:25 +0100996 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 delete IBSS BSSID peer %pM for vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +0100999 arvif->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001000 return;
1001 }
1002
Michal Kaziorc930f742014-01-23 11:38:25 +01001003 memset(arvif->bssid, 0, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001004
1005 return;
1006 }
1007
1008 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
1009 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001010 ath10k_warn(ar, "failed to create IBSS self peer %pM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001011 self_peer, arvif->vdev_id, ret);
1012 return;
1013 }
1014
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001015 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1016 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001017 ATH10K_DEFAULT_ATIM);
1018 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001019 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001020 arvif->vdev_id, ret);
1021}
1022
1023/*
1024 * Review this when mac80211 gains per-interface powersave support.
1025 */
Michal Kaziorad088bf2013-10-16 15:44:46 +03001026static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001027{
Michal Kaziorad088bf2013-10-16 15:44:46 +03001028 struct ath10k *ar = arvif->ar;
1029 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001030 enum wmi_sta_powersave_param param;
1031 enum wmi_sta_ps_mode psmode;
1032 int ret;
1033
Michal Kazior548db542013-07-05 16:15:15 +03001034 lockdep_assert_held(&arvif->ar->conf_mutex);
1035
Michal Kaziorad088bf2013-10-16 15:44:46 +03001036 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1037 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001038
1039 if (conf->flags & IEEE80211_CONF_PS) {
1040 psmode = WMI_STA_PS_MODE_ENABLED;
1041 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1042
Michal Kaziorad088bf2013-10-16 15:44:46 +03001043 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001044 conf->dynamic_ps_timeout);
1045 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001046 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001047 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001048 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001049 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001050 } else {
1051 psmode = WMI_STA_PS_MODE_DISABLED;
1052 }
1053
Michal Kazior7aa7a722014-08-25 12:09:38 +02001054 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001055 arvif->vdev_id, psmode ? "enable" : "disable");
1056
Michal Kaziorad088bf2013-10-16 15:44:46 +03001057 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1058 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001059 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001060 psmode, arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001061 return ret;
1062 }
1063
1064 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001065}
1066
1067/**********************/
1068/* Station management */
1069/**********************/
1070
1071static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
1072 struct ath10k_vif *arvif,
1073 struct ieee80211_sta *sta,
1074 struct ieee80211_bss_conf *bss_conf,
1075 struct wmi_peer_assoc_complete_arg *arg)
1076{
Michal Kazior548db542013-07-05 16:15:15 +03001077 lockdep_assert_held(&ar->conf_mutex);
1078
Kalle Valob25f32c2014-09-14 12:50:49 +03001079 ether_addr_copy(arg->addr, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001080 arg->vdev_id = arvif->vdev_id;
1081 arg->peer_aid = sta->aid;
1082 arg->peer_flags |= WMI_PEER_AUTH;
1083
1084 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
1085 /*
1086 * Seems FW have problems with Power Save in STA
1087 * mode when we setup this parameter to high (eg. 5).
1088 * Often we see that FW don't send NULL (with clean P flags)
1089 * frame even there is info about buffered frames in beacons.
1090 * Sometimes we have to wait more than 10 seconds before FW
1091 * will wakeup. Often sending one ping from AP to our device
1092 * just fail (more than 50%).
1093 *
1094 * Seems setting this FW parameter to 1 couse FW
1095 * will check every beacon and will wakup immediately
1096 * after detection buffered data.
1097 */
1098 arg->peer_listen_intval = 1;
1099 else
1100 arg->peer_listen_intval = ar->hw->conf.listen_interval;
1101
1102 arg->peer_num_spatial_streams = 1;
1103
1104 /*
1105 * The assoc capabilities are available only in managed mode.
1106 */
1107 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && bss_conf)
1108 arg->peer_caps = bss_conf->assoc_capability;
1109}
1110
1111static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1112 struct ath10k_vif *arvif,
1113 struct wmi_peer_assoc_complete_arg *arg)
1114{
1115 struct ieee80211_vif *vif = arvif->vif;
1116 struct ieee80211_bss_conf *info = &vif->bss_conf;
1117 struct cfg80211_bss *bss;
1118 const u8 *rsnie = NULL;
1119 const u8 *wpaie = NULL;
1120
Michal Kazior548db542013-07-05 16:15:15 +03001121 lockdep_assert_held(&ar->conf_mutex);
1122
Kalle Valo5e3dd152013-06-12 20:52:10 +03001123 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1124 info->bssid, NULL, 0, 0, 0);
1125 if (bss) {
1126 const struct cfg80211_bss_ies *ies;
1127
1128 rcu_read_lock();
1129 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1130
1131 ies = rcu_dereference(bss->ies);
1132
1133 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
Kalle Valo5b07e072014-09-14 12:50:06 +03001134 WLAN_OUI_TYPE_MICROSOFT_WPA,
1135 ies->data,
1136 ies->len);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001137 rcu_read_unlock();
1138 cfg80211_put_bss(ar->hw->wiphy, bss);
1139 }
1140
1141 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1142 if (rsnie || wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001143 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001144 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1145 }
1146
1147 if (wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001148 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001149 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1150 }
1151}
1152
1153static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
1154 struct ieee80211_sta *sta,
1155 struct wmi_peer_assoc_complete_arg *arg)
1156{
1157 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1158 const struct ieee80211_supported_band *sband;
1159 const struct ieee80211_rate *rates;
1160 u32 ratemask;
1161 int i;
1162
Michal Kazior548db542013-07-05 16:15:15 +03001163 lockdep_assert_held(&ar->conf_mutex);
1164
Kalle Valo5e3dd152013-06-12 20:52:10 +03001165 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1166 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1167 rates = sband->bitrates;
1168
1169 rateset->num_rates = 0;
1170
1171 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1172 if (!(ratemask & 1))
1173 continue;
1174
1175 rateset->rates[rateset->num_rates] = rates->hw_value;
1176 rateset->num_rates++;
1177 }
1178}
1179
1180static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1181 struct ieee80211_sta *sta,
1182 struct wmi_peer_assoc_complete_arg *arg)
1183{
1184 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001185 int i, n;
Kalle Valoaf762c02014-09-14 12:50:17 +03001186 u32 stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001187
Michal Kazior548db542013-07-05 16:15:15 +03001188 lockdep_assert_held(&ar->conf_mutex);
1189
Kalle Valo5e3dd152013-06-12 20:52:10 +03001190 if (!ht_cap->ht_supported)
1191 return;
1192
1193 arg->peer_flags |= WMI_PEER_HT;
1194 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1195 ht_cap->ampdu_factor)) - 1;
1196
1197 arg->peer_mpdu_density =
1198 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1199
1200 arg->peer_ht_caps = ht_cap->cap;
1201 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1202
1203 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1204 arg->peer_flags |= WMI_PEER_LDPC;
1205
1206 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1207 arg->peer_flags |= WMI_PEER_40MHZ;
1208 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1209 }
1210
1211 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1212 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1213
1214 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1215 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1216
1217 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1218 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1219 arg->peer_flags |= WMI_PEER_STBC;
1220 }
1221
1222 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001223 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1224 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1225 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1226 arg->peer_rate_caps |= stbc;
1227 arg->peer_flags |= WMI_PEER_STBC;
1228 }
1229
Kalle Valo5e3dd152013-06-12 20:52:10 +03001230 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1231 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1232 else if (ht_cap->mcs.rx_mask[1])
1233 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1234
1235 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1236 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1237 arg->peer_ht_rates.rates[n++] = i;
1238
Bartosz Markowskifd71f802014-02-10 13:12:55 +01001239 /*
1240 * This is a workaround for HT-enabled STAs which break the spec
1241 * and have no HT capabilities RX mask (no HT RX MCS map).
1242 *
1243 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1244 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1245 *
1246 * Firmware asserts if such situation occurs.
1247 */
1248 if (n == 0) {
1249 arg->peer_ht_rates.num_rates = 8;
1250 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1251 arg->peer_ht_rates.rates[i] = i;
1252 } else {
1253 arg->peer_ht_rates.num_rates = n;
1254 arg->peer_num_spatial_streams = sta->rx_nss;
1255 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001256
Michal Kazior7aa7a722014-08-25 12:09:38 +02001257 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001258 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001259 arg->peer_ht_rates.num_rates,
1260 arg->peer_num_spatial_streams);
1261}
1262
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001263static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1264 struct ath10k_vif *arvif,
1265 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001266{
1267 u32 uapsd = 0;
1268 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001269 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001270
Michal Kazior548db542013-07-05 16:15:15 +03001271 lockdep_assert_held(&ar->conf_mutex);
1272
Kalle Valo5e3dd152013-06-12 20:52:10 +03001273 if (sta->wme && sta->uapsd_queues) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001274 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001275 sta->uapsd_queues, sta->max_sp);
1276
Kalle Valo5e3dd152013-06-12 20:52:10 +03001277 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1278 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1279 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1280 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1281 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1282 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1283 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1284 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1285 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1286 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1287 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1288 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1289
Kalle Valo5e3dd152013-06-12 20:52:10 +03001290 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1291 max_sp = sta->max_sp;
1292
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001293 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1294 sta->addr,
1295 WMI_AP_PS_PEER_PARAM_UAPSD,
1296 uapsd);
1297 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001298 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001299 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001300 return ret;
1301 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001302
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001303 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1304 sta->addr,
1305 WMI_AP_PS_PEER_PARAM_MAX_SP,
1306 max_sp);
1307 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001308 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001309 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001310 return ret;
1311 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001312
1313 /* TODO setup this based on STA listen interval and
1314 beacon interval. Currently we don't know
1315 sta->listen_interval - mac80211 patch required.
1316 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001317 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
Kalle Valo5b07e072014-09-14 12:50:06 +03001318 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
1319 10);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001320 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001321 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001322 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001323 return ret;
1324 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001325 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001326
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001327 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001328}
1329
1330static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1331 struct ieee80211_sta *sta,
1332 struct wmi_peer_assoc_complete_arg *arg)
1333{
1334 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001335 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001336
1337 if (!vht_cap->vht_supported)
1338 return;
1339
1340 arg->peer_flags |= WMI_PEER_VHT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001341 arg->peer_vht_caps = vht_cap->cap;
1342
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001343 ampdu_factor = (vht_cap->cap &
1344 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1345 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1346
1347 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1348 * zero in VHT IE. Using it would result in degraded throughput.
1349 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1350 * it if VHT max_mpdu is smaller. */
1351 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1352 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1353 ampdu_factor)) - 1);
1354
Kalle Valo5e3dd152013-06-12 20:52:10 +03001355 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1356 arg->peer_flags |= WMI_PEER_80MHZ;
1357
1358 arg->peer_vht_rates.rx_max_rate =
1359 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1360 arg->peer_vht_rates.rx_mcs_set =
1361 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1362 arg->peer_vht_rates.tx_max_rate =
1363 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1364 arg->peer_vht_rates.tx_mcs_set =
1365 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1366
Michal Kazior7aa7a722014-08-25 12:09:38 +02001367 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001368 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001369}
1370
1371static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1372 struct ath10k_vif *arvif,
1373 struct ieee80211_sta *sta,
1374 struct ieee80211_bss_conf *bss_conf,
1375 struct wmi_peer_assoc_complete_arg *arg)
1376{
1377 switch (arvif->vdev_type) {
1378 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001379 if (sta->wme)
1380 arg->peer_flags |= WMI_PEER_QOS;
1381
1382 if (sta->wme && sta->uapsd_queues) {
1383 arg->peer_flags |= WMI_PEER_APSD;
1384 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1385 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001386 break;
1387 case WMI_VDEV_TYPE_STA:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001388 if (bss_conf->qos)
1389 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001390 break;
1391 default:
1392 break;
1393 }
1394}
1395
1396static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1397 struct ath10k_vif *arvif,
1398 struct ieee80211_sta *sta,
1399 struct wmi_peer_assoc_complete_arg *arg)
1400{
1401 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1402
Kalle Valo5e3dd152013-06-12 20:52:10 +03001403 switch (ar->hw->conf.chandef.chan->band) {
1404 case IEEE80211_BAND_2GHZ:
1405 if (sta->ht_cap.ht_supported) {
1406 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1407 phymode = MODE_11NG_HT40;
1408 else
1409 phymode = MODE_11NG_HT20;
1410 } else {
1411 phymode = MODE_11G;
1412 }
1413
1414 break;
1415 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03001416 /*
1417 * Check VHT first.
1418 */
1419 if (sta->vht_cap.vht_supported) {
1420 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1421 phymode = MODE_11AC_VHT80;
1422 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1423 phymode = MODE_11AC_VHT40;
1424 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1425 phymode = MODE_11AC_VHT20;
1426 } else if (sta->ht_cap.ht_supported) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001427 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1428 phymode = MODE_11NA_HT40;
1429 else
1430 phymode = MODE_11NA_HT20;
1431 } else {
1432 phymode = MODE_11A;
1433 }
1434
1435 break;
1436 default:
1437 break;
1438 }
1439
Michal Kazior7aa7a722014-08-25 12:09:38 +02001440 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
Kalle Valo38a1d472013-09-08 17:56:14 +03001441 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03001442
Kalle Valo5e3dd152013-06-12 20:52:10 +03001443 arg->peer_phymode = phymode;
1444 WARN_ON(phymode == MODE_UNKNOWN);
1445}
1446
Kalle Valob9ada652013-10-16 15:44:46 +03001447static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1448 struct ath10k_vif *arvif,
1449 struct ieee80211_sta *sta,
1450 struct ieee80211_bss_conf *bss_conf,
1451 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001452{
Michal Kazior548db542013-07-05 16:15:15 +03001453 lockdep_assert_held(&ar->conf_mutex);
1454
Kalle Valob9ada652013-10-16 15:44:46 +03001455 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03001456
Kalle Valob9ada652013-10-16 15:44:46 +03001457 ath10k_peer_assoc_h_basic(ar, arvif, sta, bss_conf, arg);
1458 ath10k_peer_assoc_h_crypto(ar, arvif, arg);
1459 ath10k_peer_assoc_h_rates(ar, sta, arg);
1460 ath10k_peer_assoc_h_ht(ar, sta, arg);
1461 ath10k_peer_assoc_h_vht(ar, sta, arg);
1462 ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, arg);
1463 ath10k_peer_assoc_h_phymode(ar, arvif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001464
Kalle Valob9ada652013-10-16 15:44:46 +03001465 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001466}
1467
Michal Kazior90046f52014-02-14 14:45:51 +01001468static const u32 ath10k_smps_map[] = {
1469 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
1470 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
1471 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
1472 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
1473};
1474
1475static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1476 const u8 *addr,
1477 const struct ieee80211_sta_ht_cap *ht_cap)
1478{
1479 int smps;
1480
1481 if (!ht_cap->ht_supported)
1482 return 0;
1483
1484 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1485 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1486
1487 if (smps >= ARRAY_SIZE(ath10k_smps_map))
1488 return -EINVAL;
1489
1490 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
1491 WMI_PEER_SMPS_STATE,
1492 ath10k_smps_map[smps]);
1493}
1494
Kalle Valo5e3dd152013-06-12 20:52:10 +03001495/* can be called only in mac80211 callbacks due to `key_count` usage */
1496static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1497 struct ieee80211_vif *vif,
1498 struct ieee80211_bss_conf *bss_conf)
1499{
1500 struct ath10k *ar = hw->priv;
1501 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01001502 struct ieee80211_sta_ht_cap ht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03001503 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001504 struct ieee80211_sta *ap_sta;
1505 int ret;
1506
Michal Kazior548db542013-07-05 16:15:15 +03001507 lockdep_assert_held(&ar->conf_mutex);
1508
Kalle Valo5e3dd152013-06-12 20:52:10 +03001509 rcu_read_lock();
1510
1511 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1512 if (!ap_sta) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001513 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001514 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001515 rcu_read_unlock();
1516 return;
1517 }
1518
Michal Kazior90046f52014-02-14 14:45:51 +01001519 /* ap_sta must be accessed only within rcu section which must be left
1520 * before calling ath10k_setup_peer_smps() which might sleep. */
1521 ht_cap = ap_sta->ht_cap;
1522
Kalle Valob9ada652013-10-16 15:44:46 +03001523 ret = ath10k_peer_assoc_prepare(ar, arvif, ap_sta,
1524 bss_conf, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001525 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001526 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001527 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001528 rcu_read_unlock();
1529 return;
1530 }
1531
1532 rcu_read_unlock();
1533
Kalle Valob9ada652013-10-16 15:44:46 +03001534 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1535 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001536 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001537 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001538 return;
1539 }
1540
Michal Kazior90046f52014-02-14 14:45:51 +01001541 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
1542 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001543 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001544 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01001545 return;
1546 }
1547
Michal Kazior7aa7a722014-08-25 12:09:38 +02001548 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03001549 "mac vdev %d up (associated) bssid %pM aid %d\n",
1550 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1551
Michal Kaziorc930f742014-01-23 11:38:25 +01001552 arvif->aid = bss_conf->aid;
Kalle Valob25f32c2014-09-14 12:50:49 +03001553 ether_addr_copy(arvif->bssid, bss_conf->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01001554
1555 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1556 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001557 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001558 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001559 return;
1560 }
1561
1562 arvif->is_up = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001563}
1564
1565/*
1566 * FIXME: flush TIDs
1567 */
1568static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1569 struct ieee80211_vif *vif)
1570{
1571 struct ath10k *ar = hw->priv;
1572 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1573 int ret;
1574
Michal Kazior548db542013-07-05 16:15:15 +03001575 lockdep_assert_held(&ar->conf_mutex);
1576
Kalle Valo5e3dd152013-06-12 20:52:10 +03001577 /*
1578 * For some reason, calling VDEV-DOWN before VDEV-STOP
1579 * makes the FW to send frames via HTT after disassociation.
1580 * No idea why this happens, even though VDEV-DOWN is supposed
1581 * to be analogous to link down, so just stop the VDEV.
1582 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02001583 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d stop (disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001584 arvif->vdev_id);
1585
1586 /* FIXME: check return value */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001587 ret = ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001588
1589 /*
1590 * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1591 * report beacons from previously associated network through HTT.
1592 * This in turn would spam mac80211 WARN_ON if we bring down all
1593 * interfaces as it expects there is no rx when no interface is
1594 * running.
1595 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02001596 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d down\n", arvif->vdev_id);
Kalle Valo60c3daa2013-09-08 17:56:07 +03001597
1598 /* FIXME: why don't we print error if wmi call fails? */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001599 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001600
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001601 arvif->def_wep_key_idx = 0;
Michal Kaziorc930f742014-01-23 11:38:25 +01001602
1603 arvif->is_started = false;
1604 arvif->is_up = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001605}
1606
1607static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02001608 struct ieee80211_sta *sta, bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001609{
Kalle Valob9ada652013-10-16 15:44:46 +03001610 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001611 int ret = 0;
1612
Michal Kazior548db542013-07-05 16:15:15 +03001613 lockdep_assert_held(&ar->conf_mutex);
1614
Kalle Valob9ada652013-10-16 15:44:46 +03001615 ret = ath10k_peer_assoc_prepare(ar, arvif, sta, NULL, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001616 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001617 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001618 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001619 return ret;
1620 }
1621
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02001622 peer_arg.peer_reassoc = reassoc;
Kalle Valob9ada652013-10-16 15:44:46 +03001623 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1624 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001625 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001626 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001627 return ret;
1628 }
1629
Michal Kazior90046f52014-02-14 14:45:51 +01001630 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr, &sta->ht_cap);
1631 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001632 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001633 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01001634 return ret;
1635 }
1636
Michal Kaziora4841eb2014-08-28 09:59:39 +02001637 if (!sta->wme && !reassoc) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001638 arvif->num_legacy_stations++;
1639 ret = ath10k_recalc_rtscts_prot(arvif);
1640 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001641 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001642 arvif->vdev_id, ret);
1643 return ret;
1644 }
1645 }
1646
Kalle Valo5e3dd152013-06-12 20:52:10 +03001647 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1648 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001649 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001650 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001651 return ret;
1652 }
1653
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001654 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
1655 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001656 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001657 sta->addr, arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001658 return ret;
1659 }
1660
Kalle Valo5e3dd152013-06-12 20:52:10 +03001661 return ret;
1662}
1663
1664static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
1665 struct ieee80211_sta *sta)
1666{
1667 int ret = 0;
1668
Michal Kazior548db542013-07-05 16:15:15 +03001669 lockdep_assert_held(&ar->conf_mutex);
1670
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001671 if (!sta->wme) {
1672 arvif->num_legacy_stations--;
1673 ret = ath10k_recalc_rtscts_prot(arvif);
1674 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001675 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001676 arvif->vdev_id, ret);
1677 return ret;
1678 }
1679 }
1680
Kalle Valo5e3dd152013-06-12 20:52:10 +03001681 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1682 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001683 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001684 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001685 return ret;
1686 }
1687
1688 return ret;
1689}
1690
1691/**************/
1692/* Regulatory */
1693/**************/
1694
1695static int ath10k_update_channel_list(struct ath10k *ar)
1696{
1697 struct ieee80211_hw *hw = ar->hw;
1698 struct ieee80211_supported_band **bands;
1699 enum ieee80211_band band;
1700 struct ieee80211_channel *channel;
1701 struct wmi_scan_chan_list_arg arg = {0};
1702 struct wmi_channel_arg *ch;
1703 bool passive;
1704 int len;
1705 int ret;
1706 int i;
1707
Michal Kazior548db542013-07-05 16:15:15 +03001708 lockdep_assert_held(&ar->conf_mutex);
1709
Kalle Valo5e3dd152013-06-12 20:52:10 +03001710 bands = hw->wiphy->bands;
1711 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1712 if (!bands[band])
1713 continue;
1714
1715 for (i = 0; i < bands[band]->n_channels; i++) {
1716 if (bands[band]->channels[i].flags &
1717 IEEE80211_CHAN_DISABLED)
1718 continue;
1719
1720 arg.n_channels++;
1721 }
1722 }
1723
1724 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1725 arg.channels = kzalloc(len, GFP_KERNEL);
1726 if (!arg.channels)
1727 return -ENOMEM;
1728
1729 ch = arg.channels;
1730 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1731 if (!bands[band])
1732 continue;
1733
1734 for (i = 0; i < bands[band]->n_channels; i++) {
1735 channel = &bands[band]->channels[i];
1736
1737 if (channel->flags & IEEE80211_CHAN_DISABLED)
1738 continue;
1739
1740 ch->allow_ht = true;
1741
1742 /* FIXME: when should we really allow VHT? */
1743 ch->allow_vht = true;
1744
1745 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001746 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001747
1748 ch->ht40plus =
1749 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1750
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001751 ch->chan_radar =
1752 !!(channel->flags & IEEE80211_CHAN_RADAR);
1753
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001754 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001755 ch->passive = passive;
1756
1757 ch->freq = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07001758 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07001759 ch->max_power = channel->max_power * 2;
1760 ch->max_reg_power = channel->max_reg_power * 2;
1761 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001762 ch->reg_class_id = 0; /* FIXME */
1763
1764 /* FIXME: why use only legacy modes, why not any
1765 * HT/VHT modes? Would that even make any
1766 * difference? */
1767 if (channel->band == IEEE80211_BAND_2GHZ)
1768 ch->mode = MODE_11G;
1769 else
1770 ch->mode = MODE_11A;
1771
1772 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1773 continue;
1774
Michal Kazior7aa7a722014-08-25 12:09:38 +02001775 ath10k_dbg(ar, ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03001776 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1777 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001778 ch->freq, ch->max_power, ch->max_reg_power,
1779 ch->max_antenna_gain, ch->mode);
1780
1781 ch++;
1782 }
1783 }
1784
1785 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1786 kfree(arg.channels);
1787
1788 return ret;
1789}
1790
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001791static enum wmi_dfs_region
1792ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
1793{
1794 switch (dfs_region) {
1795 case NL80211_DFS_UNSET:
1796 return WMI_UNINIT_DFS_DOMAIN;
1797 case NL80211_DFS_FCC:
1798 return WMI_FCC_DFS_DOMAIN;
1799 case NL80211_DFS_ETSI:
1800 return WMI_ETSI_DFS_DOMAIN;
1801 case NL80211_DFS_JP:
1802 return WMI_MKK4_DFS_DOMAIN;
1803 }
1804 return WMI_UNINIT_DFS_DOMAIN;
1805}
1806
Michal Kaziorf7843d72013-07-16 09:38:52 +02001807static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001808{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001809 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001810 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001811 enum wmi_dfs_region wmi_dfs_reg;
1812 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001813
Michal Kaziorf7843d72013-07-16 09:38:52 +02001814 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001815
1816 ret = ath10k_update_channel_list(ar);
1817 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001818 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001819
1820 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001821
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001822 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1823 nl_dfs_reg = ar->dfs_detector->region;
1824 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
1825 } else {
1826 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
1827 }
1828
Kalle Valo5e3dd152013-06-12 20:52:10 +03001829 /* Target allows setting up per-band regdomain but ath_common provides
1830 * a combined one only */
1831 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02001832 regpair->reg_domain,
1833 regpair->reg_domain, /* 2ghz */
1834 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001835 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001836 regpair->reg_5ghz_ctl,
1837 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001838 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001839 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02001840}
Michal Kazior548db542013-07-05 16:15:15 +03001841
Michal Kaziorf7843d72013-07-16 09:38:52 +02001842static void ath10k_reg_notifier(struct wiphy *wiphy,
1843 struct regulatory_request *request)
1844{
1845 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1846 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001847 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001848
1849 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1850
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001851 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001852 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001853 request->dfs_region);
1854 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1855 request->dfs_region);
1856 if (!result)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001857 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001858 request->dfs_region);
1859 }
1860
Michal Kaziorf7843d72013-07-16 09:38:52 +02001861 mutex_lock(&ar->conf_mutex);
1862 if (ar->state == ATH10K_STATE_ON)
1863 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03001864 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001865}
1866
1867/***************/
1868/* TX handlers */
1869/***************/
1870
Michal Kazior42c3aa62013-10-02 11:03:38 +02001871static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1872{
1873 if (ieee80211_is_mgmt(hdr->frame_control))
1874 return HTT_DATA_TX_EXT_TID_MGMT;
1875
1876 if (!ieee80211_is_data_qos(hdr->frame_control))
1877 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1878
1879 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1880 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1881
1882 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1883}
1884
Michal Kazior2b37c292014-09-02 11:00:22 +03001885static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001886{
Michal Kazior2b37c292014-09-02 11:00:22 +03001887 if (vif)
1888 return ath10k_vif_to_arvif(vif)->vdev_id;
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001889
Michal Kazior1bbc0972014-04-08 09:45:47 +03001890 if (ar->monitor_started)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001891 return ar->monitor_vdev_id;
1892
Michal Kazior7aa7a722014-08-25 12:09:38 +02001893 ath10k_warn(ar, "failed to resolve vdev id\n");
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001894 return 0;
1895}
1896
Michal Kazior4b604552014-07-21 21:03:09 +03001897/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
1898 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03001899 */
Michal Kazior4b604552014-07-21 21:03:09 +03001900static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001901{
1902 struct ieee80211_hdr *hdr = (void *)skb->data;
Michal Kaziorc21c64d2014-07-21 21:03:10 +03001903 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001904 u8 *qos_ctl;
1905
1906 if (!ieee80211_is_data_qos(hdr->frame_control))
1907 return;
1908
1909 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02001910 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1911 skb->data, (void *)qos_ctl - (void *)skb->data);
1912 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Michal Kaziorc21c64d2014-07-21 21:03:10 +03001913
1914 /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc
1915 * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are
1916 * used only for CQM purposes (e.g. hostapd station keepalive ping) so
1917 * it is safe to downgrade to NullFunc.
1918 */
1919 if (ieee80211_is_qos_nullfunc(hdr->frame_control)) {
1920 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
1921 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1922 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001923}
1924
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001925static void ath10k_tx_wep_key_work(struct work_struct *work)
1926{
1927 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1928 wep_key_work);
Michal Kazior7aa7a722014-08-25 12:09:38 +02001929 struct ath10k *ar = arvif->ar;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001930 int ret, keyidx = arvif->def_wep_key_newidx;
1931
Michal Kazior911e6c02014-05-26 12:46:03 +03001932 mutex_lock(&arvif->ar->conf_mutex);
1933
1934 if (arvif->ar->state != ATH10K_STATE_ON)
1935 goto unlock;
1936
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001937 if (arvif->def_wep_key_idx == keyidx)
Michal Kazior911e6c02014-05-26 12:46:03 +03001938 goto unlock;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001939
Michal Kazior7aa7a722014-08-25 12:09:38 +02001940 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001941 arvif->vdev_id, keyidx);
1942
1943 ret = ath10k_wmi_vdev_set_param(arvif->ar,
1944 arvif->vdev_id,
1945 arvif->ar->wmi.vdev_param->def_keyid,
1946 keyidx);
1947 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001948 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001949 arvif->vdev_id,
1950 ret);
Michal Kazior911e6c02014-05-26 12:46:03 +03001951 goto unlock;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001952 }
1953
1954 arvif->def_wep_key_idx = keyidx;
Michal Kazior911e6c02014-05-26 12:46:03 +03001955
1956unlock:
1957 mutex_unlock(&arvif->ar->conf_mutex);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001958}
1959
Michal Kazior4b604552014-07-21 21:03:09 +03001960static void ath10k_tx_h_update_wep_key(struct ieee80211_vif *vif,
1961 struct ieee80211_key_conf *key,
1962 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001963{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001964 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1965 struct ath10k *ar = arvif->ar;
1966 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001967
Kalle Valo5e3dd152013-06-12 20:52:10 +03001968 if (!ieee80211_has_protected(hdr->frame_control))
1969 return;
1970
1971 if (!key)
1972 return;
1973
1974 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1975 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1976 return;
1977
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001978 if (key->keyidx == arvif->def_wep_key_idx)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001979 return;
1980
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001981 /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1982 * queueing frames until key index is updated is not an option because
1983 * sk_buff may need more processing to be done, e.g. offchannel */
1984 arvif->def_wep_key_newidx = key->keyidx;
1985 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001986}
1987
Michal Kazior4b604552014-07-21 21:03:09 +03001988static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
1989 struct ieee80211_vif *vif,
1990 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001991{
1992 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001993 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1994
1995 /* This is case only for P2P_GO */
1996 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1997 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1998 return;
1999
2000 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
2001 spin_lock_bh(&ar->data_lock);
2002 if (arvif->u.ap.noa_data)
2003 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
2004 GFP_ATOMIC))
2005 memcpy(skb_put(skb, arvif->u.ap.noa_len),
2006 arvif->u.ap.noa_data,
2007 arvif->u.ap.noa_len);
2008 spin_unlock_bh(&ar->data_lock);
2009 }
2010}
2011
2012static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
2013{
2014 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002015 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002016
Michal Kazior961d4c32013-08-09 10:13:34 +02002017 if (ar->htt.target_version_major >= 3) {
2018 /* Since HTT 3.0 there is no separate mgmt tx command */
2019 ret = ath10k_htt_tx(&ar->htt, skb);
2020 goto exit;
2021 }
2022
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002023 if (ieee80211_is_mgmt(hdr->frame_control)) {
2024 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2025 ar->fw_features)) {
2026 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
2027 ATH10K_MAX_NUM_MGMT_PENDING) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002028 ath10k_warn(ar, "reached WMI management transmit queue limit\n");
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002029 ret = -EBUSY;
2030 goto exit;
2031 }
2032
2033 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
2034 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
2035 } else {
2036 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2037 }
2038 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2039 ar->fw_features) &&
2040 ieee80211_is_nullfunc(hdr->frame_control)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002041 /* FW does not report tx status properly for NullFunc frames
2042 * unless they are sent through mgmt tx path. mac80211 sends
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002043 * those frames when it detects link/beacon loss and depends
2044 * on the tx status to be correct. */
Michal Kazioredb82362013-07-05 16:15:14 +03002045 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002046 } else {
Michal Kazioredb82362013-07-05 16:15:14 +03002047 ret = ath10k_htt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002048 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002049
Michal Kazior961d4c32013-08-09 10:13:34 +02002050exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03002051 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002052 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
2053 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002054 ieee80211_free_txskb(ar->hw, skb);
2055 }
2056}
2057
2058void ath10k_offchan_tx_purge(struct ath10k *ar)
2059{
2060 struct sk_buff *skb;
2061
2062 for (;;) {
2063 skb = skb_dequeue(&ar->offchan_tx_queue);
2064 if (!skb)
2065 break;
2066
2067 ieee80211_free_txskb(ar->hw, skb);
2068 }
2069}
2070
2071void ath10k_offchan_tx_work(struct work_struct *work)
2072{
2073 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
2074 struct ath10k_peer *peer;
2075 struct ieee80211_hdr *hdr;
2076 struct sk_buff *skb;
2077 const u8 *peer_addr;
2078 int vdev_id;
2079 int ret;
2080
2081 /* FW requirement: We must create a peer before FW will send out
2082 * an offchannel frame. Otherwise the frame will be stuck and
2083 * never transmitted. We delete the peer upon tx completion.
2084 * It is unlikely that a peer for offchannel tx will already be
2085 * present. However it may be in some rare cases so account for that.
2086 * Otherwise we might remove a legitimate peer and break stuff. */
2087
2088 for (;;) {
2089 skb = skb_dequeue(&ar->offchan_tx_queue);
2090 if (!skb)
2091 break;
2092
2093 mutex_lock(&ar->conf_mutex);
2094
Michal Kazior7aa7a722014-08-25 12:09:38 +02002095 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002096 skb);
2097
2098 hdr = (struct ieee80211_hdr *)skb->data;
2099 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002100 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002101
2102 spin_lock_bh(&ar->data_lock);
2103 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
2104 spin_unlock_bh(&ar->data_lock);
2105
2106 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03002107 /* FIXME: should this use ath10k_warn()? */
Michal Kazior7aa7a722014-08-25 12:09:38 +02002108 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002109 peer_addr, vdev_id);
2110
2111 if (!peer) {
2112 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
2113 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002114 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002115 peer_addr, vdev_id, ret);
2116 }
2117
2118 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08002119 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002120 ar->offchan_tx_skb = skb;
2121 spin_unlock_bh(&ar->data_lock);
2122
2123 ath10k_tx_htt(ar, skb);
2124
2125 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
2126 3 * HZ);
2127 if (ret <= 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002128 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002129 skb);
2130
2131 if (!peer) {
2132 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
2133 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002134 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002135 peer_addr, vdev_id, ret);
2136 }
2137
2138 mutex_unlock(&ar->conf_mutex);
2139 }
2140}
2141
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002142void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
2143{
2144 struct sk_buff *skb;
2145
2146 for (;;) {
2147 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2148 if (!skb)
2149 break;
2150
2151 ieee80211_free_txskb(ar->hw, skb);
2152 }
2153}
2154
2155void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
2156{
2157 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
2158 struct sk_buff *skb;
2159 int ret;
2160
2161 for (;;) {
2162 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2163 if (!skb)
2164 break;
2165
2166 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002167 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002168 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02002169 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002170 ieee80211_free_txskb(ar->hw, skb);
2171 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002172 }
2173}
2174
Kalle Valo5e3dd152013-06-12 20:52:10 +03002175/************/
2176/* Scanning */
2177/************/
2178
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002179void __ath10k_scan_finish(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002180{
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002181 lockdep_assert_held(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002182
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002183 switch (ar->scan.state) {
2184 case ATH10K_SCAN_IDLE:
2185 break;
2186 case ATH10K_SCAN_RUNNING:
2187 case ATH10K_SCAN_ABORTING:
2188 if (ar->scan.is_roc)
2189 ieee80211_remain_on_channel_expired(ar->hw);
2190 else
2191 ieee80211_scan_completed(ar->hw,
2192 (ar->scan.state ==
2193 ATH10K_SCAN_ABORTING));
2194 /* fall through */
2195 case ATH10K_SCAN_STARTING:
2196 ar->scan.state = ATH10K_SCAN_IDLE;
2197 ar->scan_channel = NULL;
2198 ath10k_offchan_tx_purge(ar);
2199 cancel_delayed_work(&ar->scan.timeout);
2200 complete_all(&ar->scan.completed);
2201 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002202 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002203}
Kalle Valo5e3dd152013-06-12 20:52:10 +03002204
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002205void ath10k_scan_finish(struct ath10k *ar)
2206{
2207 spin_lock_bh(&ar->data_lock);
2208 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002209 spin_unlock_bh(&ar->data_lock);
2210}
2211
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002212static int ath10k_scan_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002213{
2214 struct wmi_stop_scan_arg arg = {
2215 .req_id = 1, /* FIXME */
2216 .req_type = WMI_SCAN_STOP_ONE,
2217 .u.scan_id = ATH10K_SCAN_ID,
2218 };
2219 int ret;
2220
2221 lockdep_assert_held(&ar->conf_mutex);
2222
Kalle Valo5e3dd152013-06-12 20:52:10 +03002223 ret = ath10k_wmi_stop_scan(ar, &arg);
2224 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002225 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002226 goto out;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002227 }
2228
Kalle Valo5e3dd152013-06-12 20:52:10 +03002229 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002230 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002231 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002232 ret = -ETIMEDOUT;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002233 } else if (ret > 0) {
2234 ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002235 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002236
2237out:
2238 /* Scan state should be updated upon scan completion but in case
2239 * firmware fails to deliver the event (for whatever reason) it is
2240 * desired to clean up scan state anyway. Firmware may have just
2241 * dropped the scan completion event delivery due to transport pipe
2242 * being overflown with data and/or it can recover on its own before
2243 * next scan request is submitted.
2244 */
2245 spin_lock_bh(&ar->data_lock);
2246 if (ar->scan.state != ATH10K_SCAN_IDLE)
2247 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002248 spin_unlock_bh(&ar->data_lock);
2249
2250 return ret;
2251}
2252
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002253static void ath10k_scan_abort(struct ath10k *ar)
2254{
2255 int ret;
2256
2257 lockdep_assert_held(&ar->conf_mutex);
2258
2259 spin_lock_bh(&ar->data_lock);
2260
2261 switch (ar->scan.state) {
2262 case ATH10K_SCAN_IDLE:
2263 /* This can happen if timeout worker kicked in and called
2264 * abortion while scan completion was being processed.
2265 */
2266 break;
2267 case ATH10K_SCAN_STARTING:
2268 case ATH10K_SCAN_ABORTING:
Michal Kazior7aa7a722014-08-25 12:09:38 +02002269 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002270 ath10k_scan_state_str(ar->scan.state),
2271 ar->scan.state);
2272 break;
2273 case ATH10K_SCAN_RUNNING:
2274 ar->scan.state = ATH10K_SCAN_ABORTING;
2275 spin_unlock_bh(&ar->data_lock);
2276
2277 ret = ath10k_scan_stop(ar);
2278 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002279 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002280
2281 spin_lock_bh(&ar->data_lock);
2282 break;
2283 }
2284
2285 spin_unlock_bh(&ar->data_lock);
2286}
2287
2288void ath10k_scan_timeout_work(struct work_struct *work)
2289{
2290 struct ath10k *ar = container_of(work, struct ath10k,
2291 scan.timeout.work);
2292
2293 mutex_lock(&ar->conf_mutex);
2294 ath10k_scan_abort(ar);
2295 mutex_unlock(&ar->conf_mutex);
2296}
2297
Kalle Valo5e3dd152013-06-12 20:52:10 +03002298static int ath10k_start_scan(struct ath10k *ar,
2299 const struct wmi_start_scan_arg *arg)
2300{
2301 int ret;
2302
2303 lockdep_assert_held(&ar->conf_mutex);
2304
2305 ret = ath10k_wmi_start_scan(ar, arg);
2306 if (ret)
2307 return ret;
2308
Kalle Valo5e3dd152013-06-12 20:52:10 +03002309 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2310 if (ret == 0) {
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002311 ret = ath10k_scan_stop(ar);
2312 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002313 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002314
2315 return -ETIMEDOUT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002316 }
2317
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002318 /* Add a 200ms margin to account for event/command processing */
2319 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
2320 msecs_to_jiffies(arg->max_scan_time+200));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002321 return 0;
2322}
2323
2324/**********************/
2325/* mac80211 callbacks */
2326/**********************/
2327
2328static void ath10k_tx(struct ieee80211_hw *hw,
2329 struct ieee80211_tx_control *control,
2330 struct sk_buff *skb)
2331{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002332 struct ath10k *ar = hw->priv;
Michal Kazior4b604552014-07-21 21:03:09 +03002333 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2334 struct ieee80211_vif *vif = info->control.vif;
2335 struct ieee80211_key_conf *key = info->control.hw_key;
2336 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002337
2338 /* We should disable CCK RATE due to P2P */
2339 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002340 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002341
Michal Kazior4b604552014-07-21 21:03:09 +03002342 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2343 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
Michal Kazior2b37c292014-09-02 11:00:22 +03002344 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002345
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002346 /* it makes no sense to process injected frames like that */
Michal Kazior4b604552014-07-21 21:03:09 +03002347 if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
2348 ath10k_tx_h_nwifi(hw, skb);
2349 ath10k_tx_h_update_wep_key(vif, key, skb);
2350 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
2351 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002352 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002353
Kalle Valo5e3dd152013-06-12 20:52:10 +03002354 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2355 spin_lock_bh(&ar->data_lock);
2356 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002357 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002358 spin_unlock_bh(&ar->data_lock);
2359
Michal Kazior7aa7a722014-08-25 12:09:38 +02002360 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
2361 skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002362
2363 skb_queue_tail(&ar->offchan_tx_queue, skb);
2364 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2365 return;
2366 }
2367
2368 ath10k_tx_htt(ar, skb);
2369}
2370
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002371/* Must not be called with conf_mutex held as workers can use that also. */
2372static void ath10k_drain_tx(struct ath10k *ar)
2373{
2374 /* make sure rcu-protected mac80211 tx path itself is drained */
2375 synchronize_net();
2376
2377 ath10k_offchan_tx_purge(ar);
2378 ath10k_mgmt_over_wmi_tx_purge(ar);
2379
2380 cancel_work_sync(&ar->offchan_tx_work);
2381 cancel_work_sync(&ar->wmi_mgmt_tx_work);
2382}
2383
Michal Kazioraffd3212013-07-16 09:54:35 +02002384void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02002385{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03002386 struct ath10k_vif *arvif;
2387
Michal Kazior818bdd12013-07-16 09:38:57 +02002388 lockdep_assert_held(&ar->conf_mutex);
2389
Michal Kazior19337472014-08-28 12:58:16 +02002390 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
2391 ar->filter_flags = 0;
2392 ar->monitor = false;
2393
2394 if (ar->monitor_started)
Michal Kazior1bbc0972014-04-08 09:45:47 +03002395 ath10k_monitor_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02002396
2397 ar->monitor_started = false;
Michal Kazior1bbc0972014-04-08 09:45:47 +03002398
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002399 ath10k_scan_finish(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02002400 ath10k_peer_cleanup_all(ar);
2401 ath10k_core_stop(ar);
2402 ath10k_hif_power_down(ar);
2403
2404 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03002405 list_for_each_entry(arvif, &ar->arvifs, list)
2406 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kazior818bdd12013-07-16 09:38:57 +02002407 spin_unlock_bh(&ar->data_lock);
2408}
2409
Ben Greear46acf7bb2014-05-16 17:15:38 +03002410static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
2411{
2412 struct ath10k *ar = hw->priv;
2413
2414 mutex_lock(&ar->conf_mutex);
2415
2416 if (ar->cfg_tx_chainmask) {
2417 *tx_ant = ar->cfg_tx_chainmask;
2418 *rx_ant = ar->cfg_rx_chainmask;
2419 } else {
2420 *tx_ant = ar->supp_tx_chainmask;
2421 *rx_ant = ar->supp_rx_chainmask;
2422 }
2423
2424 mutex_unlock(&ar->conf_mutex);
2425
2426 return 0;
2427}
2428
2429static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
2430{
2431 int ret;
2432
2433 lockdep_assert_held(&ar->conf_mutex);
2434
2435 ar->cfg_tx_chainmask = tx_ant;
2436 ar->cfg_rx_chainmask = rx_ant;
2437
2438 if ((ar->state != ATH10K_STATE_ON) &&
2439 (ar->state != ATH10K_STATE_RESTARTED))
2440 return 0;
2441
2442 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
2443 tx_ant);
2444 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002445 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7bb2014-05-16 17:15:38 +03002446 ret, tx_ant);
2447 return ret;
2448 }
2449
2450 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
2451 rx_ant);
2452 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002453 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7bb2014-05-16 17:15:38 +03002454 ret, rx_ant);
2455 return ret;
2456 }
2457
2458 return 0;
2459}
2460
2461static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
2462{
2463 struct ath10k *ar = hw->priv;
2464 int ret;
2465
2466 mutex_lock(&ar->conf_mutex);
2467 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
2468 mutex_unlock(&ar->conf_mutex);
2469 return ret;
2470}
2471
Kalle Valo5e3dd152013-06-12 20:52:10 +03002472static int ath10k_start(struct ieee80211_hw *hw)
2473{
2474 struct ath10k *ar = hw->priv;
Michal Kazior818bdd12013-07-16 09:38:57 +02002475 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002476
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002477 /*
2478 * This makes sense only when restarting hw. It is harmless to call
2479 * uncoditionally. This is necessary to make sure no HTT/WMI tx
2480 * commands will be submitted while restarting.
2481 */
2482 ath10k_drain_tx(ar);
2483
Michal Kazior548db542013-07-05 16:15:15 +03002484 mutex_lock(&ar->conf_mutex);
2485
Michal Kaziorc5058f52014-05-26 12:46:03 +03002486 switch (ar->state) {
2487 case ATH10K_STATE_OFF:
2488 ar->state = ATH10K_STATE_ON;
2489 break;
2490 case ATH10K_STATE_RESTARTING:
2491 ath10k_halt(ar);
2492 ar->state = ATH10K_STATE_RESTARTED;
2493 break;
2494 case ATH10K_STATE_ON:
2495 case ATH10K_STATE_RESTARTED:
2496 case ATH10K_STATE_WEDGED:
2497 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02002498 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03002499 goto err;
Kalle Valo43d2a302014-09-10 18:23:30 +03002500 case ATH10K_STATE_UTF:
2501 ret = -EBUSY;
2502 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02002503 }
2504
2505 ret = ath10k_hif_power_up(ar);
2506 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002507 ath10k_err(ar, "Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002508 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02002509 }
2510
Kalle Valo43d2a302014-09-10 18:23:30 +03002511 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
Michal Kazior818bdd12013-07-16 09:38:57 +02002512 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002513 ath10k_err(ar, "Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002514 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02002515 }
2516
Bartosz Markowski226a3392013-09-26 17:47:16 +02002517 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03002518 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002519 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002520 goto err_core_stop;
2521 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002522
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01002523 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03002524 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002525 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002526 goto err_core_stop;
2527 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002528
Ben Greear46acf7bb2014-05-16 17:15:38 +03002529 if (ar->cfg_tx_chainmask)
2530 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
2531 ar->cfg_rx_chainmask);
2532
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002533 /*
2534 * By default FW set ARP frames ac to voice (6). In that case ARP
2535 * exchange is not working properly for UAPSD enabled AP. ARP requests
2536 * which arrives with access category 0 are processed by network stack
2537 * and send back with access category 0, but FW changes access category
2538 * to 6. Set ARP frames access category to best effort (0) solves
2539 * this problem.
2540 */
2541
2542 ret = ath10k_wmi_pdev_set_param(ar,
2543 ar->wmi.pdev_param->arp_ac_override, 0);
2544 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002545 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002546 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002547 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002548 }
2549
Michal Kaziord6500972014-04-08 09:56:09 +03002550 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002551 ath10k_regd_update(ar);
2552
Simon Wunderlich855aed12014-08-02 09:12:54 +03002553 ath10k_spectral_start(ar);
2554
Michal Kaziorae254432014-05-26 12:46:02 +03002555 mutex_unlock(&ar->conf_mutex);
2556 return 0;
2557
2558err_core_stop:
2559 ath10k_core_stop(ar);
2560
2561err_power_down:
2562 ath10k_hif_power_down(ar);
2563
2564err_off:
2565 ar->state = ATH10K_STATE_OFF;
2566
2567err:
Michal Kazior548db542013-07-05 16:15:15 +03002568 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01002569 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002570}
2571
2572static void ath10k_stop(struct ieee80211_hw *hw)
2573{
2574 struct ath10k *ar = hw->priv;
2575
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002576 ath10k_drain_tx(ar);
2577
Michal Kazior548db542013-07-05 16:15:15 +03002578 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03002579 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02002580 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03002581 ar->state = ATH10K_STATE_OFF;
2582 }
Michal Kazior548db542013-07-05 16:15:15 +03002583 mutex_unlock(&ar->conf_mutex);
2584
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002585 cancel_delayed_work_sync(&ar->scan.timeout);
Michal Kazioraffd3212013-07-16 09:54:35 +02002586 cancel_work_sync(&ar->restart_work);
2587}
2588
Michal Kaziorad088bf2013-10-16 15:44:46 +03002589static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02002590{
Michal Kaziorad088bf2013-10-16 15:44:46 +03002591 struct ath10k_vif *arvif;
2592 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02002593
2594 lockdep_assert_held(&ar->conf_mutex);
2595
Michal Kaziorad088bf2013-10-16 15:44:46 +03002596 list_for_each_entry(arvif, &ar->arvifs, list) {
2597 ret = ath10k_mac_vif_setup_ps(arvif);
2598 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002599 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03002600 break;
2601 }
2602 }
Michal Kazioraffd3212013-07-16 09:54:35 +02002603
Michal Kaziorad088bf2013-10-16 15:44:46 +03002604 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002605}
2606
Michal Kaziorc930f742014-01-23 11:38:25 +01002607static const char *chandef_get_width(enum nl80211_chan_width width)
2608{
2609 switch (width) {
2610 case NL80211_CHAN_WIDTH_20_NOHT:
2611 return "20 (noht)";
2612 case NL80211_CHAN_WIDTH_20:
2613 return "20";
2614 case NL80211_CHAN_WIDTH_40:
2615 return "40";
2616 case NL80211_CHAN_WIDTH_80:
2617 return "80";
2618 case NL80211_CHAN_WIDTH_80P80:
2619 return "80+80";
2620 case NL80211_CHAN_WIDTH_160:
2621 return "160";
2622 case NL80211_CHAN_WIDTH_5:
2623 return "5";
2624 case NL80211_CHAN_WIDTH_10:
2625 return "10";
2626 }
2627 return "?";
2628}
2629
2630static void ath10k_config_chan(struct ath10k *ar)
2631{
2632 struct ath10k_vif *arvif;
Michal Kaziorc930f742014-01-23 11:38:25 +01002633 int ret;
2634
2635 lockdep_assert_held(&ar->conf_mutex);
2636
Michal Kazior7aa7a722014-08-25 12:09:38 +02002637 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kaziorc930f742014-01-23 11:38:25 +01002638 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2639 ar->chandef.chan->center_freq,
2640 ar->chandef.center_freq1,
2641 ar->chandef.center_freq2,
2642 chandef_get_width(ar->chandef.width));
2643
2644 /* First stop monitor interface. Some FW versions crash if there's a
2645 * lone monitor interface. */
Michal Kazior1bbc0972014-04-08 09:45:47 +03002646 if (ar->monitor_started)
Michal Kazior19337472014-08-28 12:58:16 +02002647 ath10k_monitor_stop(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002648
2649 list_for_each_entry(arvif, &ar->arvifs, list) {
2650 if (!arvif->is_started)
2651 continue;
2652
Michal Kaziordc55e302014-07-29 12:53:36 +03002653 if (!arvif->is_up)
2654 continue;
2655
Michal Kaziorc930f742014-01-23 11:38:25 +01002656 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2657 continue;
2658
Michal Kaziordc55e302014-07-29 12:53:36 +03002659 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kaziorc930f742014-01-23 11:38:25 +01002660 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002661 ath10k_warn(ar, "failed to down vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002662 arvif->vdev_id, ret);
2663 continue;
2664 }
2665 }
2666
Michal Kaziordc55e302014-07-29 12:53:36 +03002667 /* all vdevs are downed now - attempt to restart and re-up them */
Michal Kaziorc930f742014-01-23 11:38:25 +01002668
2669 list_for_each_entry(arvif, &ar->arvifs, list) {
2670 if (!arvif->is_started)
2671 continue;
2672
2673 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2674 continue;
2675
Michal Kaziordc55e302014-07-29 12:53:36 +03002676 ret = ath10k_vdev_restart(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +01002677 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002678 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002679 arvif->vdev_id, ret);
2680 continue;
2681 }
2682
2683 if (!arvif->is_up)
2684 continue;
2685
2686 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
2687 arvif->bssid);
2688 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002689 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002690 arvif->vdev_id, ret);
2691 continue;
2692 }
2693 }
2694
Michal Kazior19337472014-08-28 12:58:16 +02002695 ath10k_monitor_recalc(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002696}
2697
Kalle Valo5e3dd152013-06-12 20:52:10 +03002698static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2699{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002700 struct ath10k *ar = hw->priv;
2701 struct ieee80211_conf *conf = &hw->conf;
2702 int ret = 0;
Michal Kazior5474efe2013-10-23 04:02:15 -07002703 u32 param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002704
2705 mutex_lock(&ar->conf_mutex);
2706
2707 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002708 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kaziord6500972014-04-08 09:56:09 +03002709 "mac config channel %dMHz flags 0x%x radar %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002710 conf->chandef.chan->center_freq,
Michal Kaziord6500972014-04-08 09:56:09 +03002711 conf->chandef.chan->flags,
2712 conf->radar_enabled);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002713
Kalle Valo5e3dd152013-06-12 20:52:10 +03002714 spin_lock_bh(&ar->data_lock);
2715 ar->rx_channel = conf->chandef.chan;
2716 spin_unlock_bh(&ar->data_lock);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002717
Michal Kaziord6500972014-04-08 09:56:09 +03002718 ar->radar_enabled = conf->radar_enabled;
2719 ath10k_recalc_radar_detection(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002720
2721 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
2722 ar->chandef = conf->chandef;
2723 ath10k_config_chan(ar);
2724 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002725 }
2726
Michal Kazior5474efe2013-10-23 04:02:15 -07002727 if (changed & IEEE80211_CONF_CHANGE_POWER) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002728 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac config power %d\n",
Michal Kazior5474efe2013-10-23 04:02:15 -07002729 hw->conf.power_level);
2730
2731 param = ar->wmi.pdev_param->txpower_limit2g;
2732 ret = ath10k_wmi_pdev_set_param(ar, param,
2733 hw->conf.power_level * 2);
2734 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002735 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
Michal Kazior5474efe2013-10-23 04:02:15 -07002736 hw->conf.power_level, ret);
2737
2738 param = ar->wmi.pdev_param->txpower_limit5g;
2739 ret = ath10k_wmi_pdev_set_param(ar, param,
2740 hw->conf.power_level * 2);
2741 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002742 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
Michal Kazior5474efe2013-10-23 04:02:15 -07002743 hw->conf.power_level, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002744 }
2745
Michal Kazioraffd3212013-07-16 09:54:35 +02002746 if (changed & IEEE80211_CONF_CHANGE_PS)
2747 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002748
2749 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior19337472014-08-28 12:58:16 +02002750 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
2751 ret = ath10k_monitor_recalc(ar);
2752 if (ret)
2753 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002754 }
2755
2756 mutex_unlock(&ar->conf_mutex);
2757 return ret;
2758}
2759
2760/*
2761 * TODO:
2762 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2763 * because we will send mgmt frames without CCK. This requirement
2764 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2765 * in the TX packet.
2766 */
2767static int ath10k_add_interface(struct ieee80211_hw *hw,
2768 struct ieee80211_vif *vif)
2769{
2770 struct ath10k *ar = hw->priv;
2771 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2772 enum wmi_sta_powersave_param param;
2773 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02002774 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002775 int bit;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002776 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002777
2778 mutex_lock(&ar->conf_mutex);
2779
Michal Kazior0dbd09e2013-07-31 10:55:14 +02002780 memset(arvif, 0, sizeof(*arvif));
2781
Kalle Valo5e3dd152013-06-12 20:52:10 +03002782 arvif->ar = ar;
2783 arvif->vif = vif;
2784
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002785 INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
Ben Greeare63b33f2013-10-22 14:54:14 -07002786 INIT_LIST_HEAD(&arvif->list);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002787
Ben Greeara9aefb32014-08-12 11:02:19 +03002788 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002789 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002790 ret = -EBUSY;
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002791 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002792 }
Ben Greeara9aefb32014-08-12 11:02:19 +03002793 bit = ffs(ar->free_vdev_map);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002794
2795 arvif->vdev_id = bit - 1;
2796 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002797
2798 if (ar->p2p)
2799 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2800
2801 switch (vif->type) {
2802 case NL80211_IFTYPE_UNSPECIFIED:
2803 case NL80211_IFTYPE_STATION:
2804 arvif->vdev_type = WMI_VDEV_TYPE_STA;
2805 if (vif->p2p)
2806 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2807 break;
2808 case NL80211_IFTYPE_ADHOC:
2809 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2810 break;
2811 case NL80211_IFTYPE_AP:
2812 arvif->vdev_type = WMI_VDEV_TYPE_AP;
2813
2814 if (vif->p2p)
2815 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2816 break;
2817 case NL80211_IFTYPE_MONITOR:
2818 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2819 break;
2820 default:
2821 WARN_ON(1);
2822 break;
2823 }
2824
Michal Kazior64badcb2014-09-18 11:18:02 +03002825 /* Some firmware revisions don't wait for beacon tx completion before
2826 * sending another SWBA event. This could lead to hardware using old
2827 * (freed) beacon data in some cases, e.g. tx credit starvation
2828 * combined with missed TBTT. This is very very rare.
2829 *
2830 * On non-IOMMU-enabled hosts this could be a possible security issue
2831 * because hw could beacon some random data on the air. On
2832 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
2833 * device would crash.
2834 *
2835 * Since there are no beacon tx completions (implicit nor explicit)
2836 * propagated to host the only workaround for this is to allocate a
2837 * DMA-coherent buffer for a lifetime of a vif and use it for all
2838 * beacon tx commands. Worst case for this approach is some beacons may
2839 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
2840 */
2841 if (vif->type == NL80211_IFTYPE_ADHOC ||
2842 vif->type == NL80211_IFTYPE_AP) {
2843 arvif->beacon_buf = dma_zalloc_coherent(ar->dev,
2844 IEEE80211_MAX_FRAME_LEN,
2845 &arvif->beacon_paddr,
2846 GFP_KERNEL);
2847 if (!arvif->beacon_buf) {
2848 ret = -ENOMEM;
2849 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
2850 ret);
2851 goto err;
2852 }
2853 }
2854
2855 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
2856 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
2857 arvif->beacon_buf ? "single-buf" : "per-skb");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002858
2859 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2860 arvif->vdev_subtype, vif->addr);
2861 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002862 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002863 arvif->vdev_id, ret);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002864 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002865 }
2866
Ben Greeara9aefb32014-08-12 11:02:19 +03002867 ar->free_vdev_map &= ~(1 << arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002868 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002869
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002870 vdev_param = ar->wmi.vdev_param->def_keyid;
2871 ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002872 arvif->def_wep_key_idx);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002873 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002874 ath10k_warn(ar, "failed to set vdev %i default key id: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002875 arvif->vdev_id, ret);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002876 goto err_vdev_delete;
2877 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002878
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002879 vdev_param = ar->wmi.vdev_param->tx_encap_type;
2880 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002881 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02002882 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002883 if (ret && ret != -EOPNOTSUPP) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002884 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002885 arvif->vdev_id, ret);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002886 goto err_vdev_delete;
2887 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002888
2889 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2890 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
2891 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002892 ath10k_warn(ar, "failed to create vdev %i peer for AP: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002893 arvif->vdev_id, ret);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002894 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002895 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01002896
Kalle Valo5a13e762014-01-20 11:01:46 +02002897 ret = ath10k_mac_set_kickout(arvif);
2898 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002899 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002900 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02002901 goto err_peer_delete;
2902 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002903 }
2904
2905 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
2906 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
2907 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2908 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2909 param, value);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002910 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002911 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002912 arvif->vdev_id, ret);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002913 goto err_peer_delete;
2914 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002915
2916 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
2917 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
2918 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2919 param, value);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002920 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002921 ath10k_warn(ar, "failed to set vdev %i TX wake thresh: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002922 arvif->vdev_id, ret);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002923 goto err_peer_delete;
2924 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002925
2926 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
2927 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
2928 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2929 param, value);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002930 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002931 ath10k_warn(ar, "failed to set vdev %i PSPOLL count: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002932 arvif->vdev_id, ret);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002933 goto err_peer_delete;
2934 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002935 }
2936
Michal Kazior424121c2013-07-22 14:13:31 +02002937 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002938 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002939 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03002940 arvif->vdev_id, ret);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002941 goto err_peer_delete;
2942 }
Michal Kazior679c54a2013-07-05 16:15:04 +03002943
Michal Kazior424121c2013-07-22 14:13:31 +02002944 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002945 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002946 ath10k_warn(ar, "failed to set frag threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03002947 arvif->vdev_id, ret);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002948 goto err_peer_delete;
2949 }
Michal Kazior679c54a2013-07-05 16:15:04 +03002950
Kalle Valo5e3dd152013-06-12 20:52:10 +03002951 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002952 return 0;
2953
2954err_peer_delete:
2955 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
2956 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
2957
2958err_vdev_delete:
2959 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
Ben Greeara9aefb32014-08-12 11:02:19 +03002960 ar->free_vdev_map |= 1 << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03002961 list_del(&arvif->list);
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002962
2963err:
Michal Kazior64badcb2014-09-18 11:18:02 +03002964 if (arvif->beacon_buf) {
2965 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
2966 arvif->beacon_buf, arvif->beacon_paddr);
2967 arvif->beacon_buf = NULL;
2968 }
2969
Michal Kazior9dad14ae2013-10-16 15:44:45 +03002970 mutex_unlock(&ar->conf_mutex);
2971
Kalle Valo5e3dd152013-06-12 20:52:10 +03002972 return ret;
2973}
2974
2975static void ath10k_remove_interface(struct ieee80211_hw *hw,
2976 struct ieee80211_vif *vif)
2977{
2978 struct ath10k *ar = hw->priv;
2979 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2980 int ret;
2981
2982 mutex_lock(&ar->conf_mutex);
2983
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002984 cancel_work_sync(&arvif->wep_key_work);
2985
Michal Kaziored543882013-09-13 14:16:56 +02002986 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03002987 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kaziored543882013-09-13 14:16:56 +02002988 spin_unlock_bh(&ar->data_lock);
2989
Simon Wunderlich855aed12014-08-02 09:12:54 +03002990 ret = ath10k_spectral_vif_stop(arvif);
2991 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002992 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
Simon Wunderlich855aed12014-08-02 09:12:54 +03002993 arvif->vdev_id, ret);
2994
Ben Greeara9aefb32014-08-12 11:02:19 +03002995 ar->free_vdev_map |= 1 << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03002996 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002997
2998 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2999 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
3000 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003001 ath10k_warn(ar, "failed to remove peer for AP vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003002 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003003
3004 kfree(arvif->u.ap.noa_data);
3005 }
3006
Michal Kazior7aa7a722014-08-25 12:09:38 +02003007 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03003008 arvif->vdev_id);
3009
Kalle Valo5e3dd152013-06-12 20:52:10 +03003010 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
3011 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003012 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003013 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003014
Kalle Valo5e3dd152013-06-12 20:52:10 +03003015 ath10k_peer_cleanup(ar, arvif->vdev_id);
3016
3017 mutex_unlock(&ar->conf_mutex);
3018}
3019
3020/*
3021 * FIXME: Has to be verified.
3022 */
3023#define SUPPORTED_FILTERS \
3024 (FIF_PROMISC_IN_BSS | \
3025 FIF_ALLMULTI | \
3026 FIF_CONTROL | \
3027 FIF_PSPOLL | \
3028 FIF_OTHER_BSS | \
3029 FIF_BCN_PRBRESP_PROMISC | \
3030 FIF_PROBE_REQ | \
3031 FIF_FCSFAIL)
3032
3033static void ath10k_configure_filter(struct ieee80211_hw *hw,
3034 unsigned int changed_flags,
3035 unsigned int *total_flags,
3036 u64 multicast)
3037{
3038 struct ath10k *ar = hw->priv;
3039 int ret;
3040
3041 mutex_lock(&ar->conf_mutex);
3042
3043 changed_flags &= SUPPORTED_FILTERS;
3044 *total_flags &= SUPPORTED_FILTERS;
3045 ar->filter_flags = *total_flags;
3046
Michal Kazior19337472014-08-28 12:58:16 +02003047 ret = ath10k_monitor_recalc(ar);
3048 if (ret)
3049 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003050
3051 mutex_unlock(&ar->conf_mutex);
3052}
3053
3054static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3055 struct ieee80211_vif *vif,
3056 struct ieee80211_bss_conf *info,
3057 u32 changed)
3058{
3059 struct ath10k *ar = hw->priv;
3060 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3061 int ret = 0;
Kalle Valoaf762c02014-09-14 12:50:17 +03003062 u32 vdev_param, pdev_param, slottime, preamble;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003063
3064 mutex_lock(&ar->conf_mutex);
3065
3066 if (changed & BSS_CHANGED_IBSS)
3067 ath10k_control_ibss(arvif, info, vif->addr);
3068
3069 if (changed & BSS_CHANGED_BEACON_INT) {
3070 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003071 vdev_param = ar->wmi.vdev_param->beacon_interval;
3072 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003073 arvif->beacon_interval);
Michal Kazior7aa7a722014-08-25 12:09:38 +02003074 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003075 "mac vdev %d beacon_interval %d\n",
3076 arvif->vdev_id, arvif->beacon_interval);
3077
Kalle Valo5e3dd152013-06-12 20:52:10 +03003078 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003079 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003080 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003081 }
3082
3083 if (changed & BSS_CHANGED_BEACON) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003084 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003085 "vdev %d set beacon tx mode to staggered\n",
3086 arvif->vdev_id);
3087
Bartosz Markowski226a3392013-09-26 17:47:16 +02003088 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
3089 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003090 WMI_BEACON_STAGGERED_MODE);
3091 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003092 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003093 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003094 }
3095
John W. Linvilleb70727e82013-06-13 13:34:29 -04003096 if (changed & BSS_CHANGED_BEACON_INFO) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003097 arvif->dtim_period = info->dtim_period;
3098
Michal Kazior7aa7a722014-08-25 12:09:38 +02003099 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003100 "mac vdev %d dtim_period %d\n",
3101 arvif->vdev_id, arvif->dtim_period);
3102
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003103 vdev_param = ar->wmi.vdev_param->dtim_period;
3104 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003105 arvif->dtim_period);
3106 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003107 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003108 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003109 }
3110
3111 if (changed & BSS_CHANGED_SSID &&
3112 vif->type == NL80211_IFTYPE_AP) {
3113 arvif->u.ap.ssid_len = info->ssid_len;
3114 if (info->ssid_len)
3115 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
3116 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3117 }
3118
Michal Kazior7b161a72014-05-26 12:46:03 +03003119 /*
3120 * Firmware manages AP self-peer internally so make sure to not create
3121 * it in driver. Otherwise AP self-peer deletion may timeout later.
3122 */
3123 if (changed & BSS_CHANGED_BSSID &&
3124 vif->type != NL80211_IFTYPE_AP) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003125 if (!is_zero_ether_addr(info->bssid)) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003126 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003127 "mac vdev %d create peer %pM\n",
3128 arvif->vdev_id, info->bssid);
3129
Kalle Valo5e3dd152013-06-12 20:52:10 +03003130 ret = ath10k_peer_create(ar, arvif->vdev_id,
3131 info->bssid);
3132 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003133 ath10k_warn(ar, "failed to add peer %pM for vdev %d when changing bssid: %i\n",
Ben Greear479398b2013-11-04 09:19:34 -08003134 info->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003135
3136 if (vif->type == NL80211_IFTYPE_STATION) {
3137 /*
3138 * this is never erased as we it for crypto key
3139 * clearing; this is FW requirement
3140 */
Kalle Valob25f32c2014-09-14 12:50:49 +03003141 ether_addr_copy(arvif->bssid, info->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003142
Michal Kazior7aa7a722014-08-25 12:09:38 +02003143 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003144 "mac vdev %d start %pM\n",
3145 arvif->vdev_id, info->bssid);
3146
Kalle Valo5e3dd152013-06-12 20:52:10 +03003147 ret = ath10k_vdev_start(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +01003148 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003149 ath10k_warn(ar, "failed to start vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003150 arvif->vdev_id, ret);
Kalle Valo75459e32014-02-13 18:13:12 +02003151 goto exit;
Michal Kaziorc930f742014-01-23 11:38:25 +01003152 }
3153
3154 arvif->is_started = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003155 }
3156
3157 /*
3158 * Mac80211 does not keep IBSS bssid when leaving IBSS,
3159 * so driver need to store it. It is needed when leaving
3160 * IBSS in order to remove BSSID peer.
3161 */
3162 if (vif->type == NL80211_IFTYPE_ADHOC)
Michal Kaziorc930f742014-01-23 11:38:25 +01003163 memcpy(arvif->bssid, info->bssid,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003164 ETH_ALEN);
3165 }
3166 }
3167
3168 if (changed & BSS_CHANGED_BEACON_ENABLED)
3169 ath10k_control_beaconing(arvif, info);
3170
3171 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003172 arvif->use_cts_prot = info->use_cts_prot;
Michal Kazior7aa7a722014-08-25 12:09:38 +02003173 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003174 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003175
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003176 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003177 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003178 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003179 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003180 }
3181
3182 if (changed & BSS_CHANGED_ERP_SLOT) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003183 if (info->use_short_slot)
3184 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3185
3186 else
3187 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3188
Michal Kazior7aa7a722014-08-25 12:09:38 +02003189 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03003190 arvif->vdev_id, slottime);
3191
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003192 vdev_param = ar->wmi.vdev_param->slot_time;
3193 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003194 slottime);
3195 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003196 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003197 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003198 }
3199
3200 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003201 if (info->use_short_preamble)
3202 preamble = WMI_VDEV_PREAMBLE_SHORT;
3203 else
3204 preamble = WMI_VDEV_PREAMBLE_LONG;
3205
Michal Kazior7aa7a722014-08-25 12:09:38 +02003206 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003207 "mac vdev %d preamble %dn",
3208 arvif->vdev_id, preamble);
3209
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003210 vdev_param = ar->wmi.vdev_param->preamble;
3211 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003212 preamble);
3213 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003214 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003215 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003216 }
3217
3218 if (changed & BSS_CHANGED_ASSOC) {
Michal Kaziore556f112014-08-28 12:58:17 +02003219 if (info->assoc) {
3220 /* Workaround: Make sure monitor vdev is not running
3221 * when associating to prevent some firmware revisions
3222 * (e.g. 10.1 and 10.2) from crashing.
3223 */
3224 if (ar->monitor_started)
3225 ath10k_monitor_stop(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003226 ath10k_bss_assoc(hw, vif, info);
Michal Kaziore556f112014-08-28 12:58:17 +02003227 ath10k_monitor_recalc(ar);
3228 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003229 }
3230
Kalle Valo75459e32014-02-13 18:13:12 +02003231exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003232 mutex_unlock(&ar->conf_mutex);
3233}
3234
3235static int ath10k_hw_scan(struct ieee80211_hw *hw,
3236 struct ieee80211_vif *vif,
David Spinadelc56ef672014-02-05 15:21:13 +02003237 struct ieee80211_scan_request *hw_req)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003238{
3239 struct ath10k *ar = hw->priv;
3240 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
David Spinadelc56ef672014-02-05 15:21:13 +02003241 struct cfg80211_scan_request *req = &hw_req->req;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003242 struct wmi_start_scan_arg arg;
3243 int ret = 0;
3244 int i;
3245
3246 mutex_lock(&ar->conf_mutex);
3247
3248 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003249 switch (ar->scan.state) {
3250 case ATH10K_SCAN_IDLE:
3251 reinit_completion(&ar->scan.started);
3252 reinit_completion(&ar->scan.completed);
3253 ar->scan.state = ATH10K_SCAN_STARTING;
3254 ar->scan.is_roc = false;
3255 ar->scan.vdev_id = arvif->vdev_id;
3256 ret = 0;
3257 break;
3258 case ATH10K_SCAN_STARTING:
3259 case ATH10K_SCAN_RUNNING:
3260 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003261 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003262 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003263 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003264 spin_unlock_bh(&ar->data_lock);
3265
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003266 if (ret)
3267 goto exit;
3268
Kalle Valo5e3dd152013-06-12 20:52:10 +03003269 memset(&arg, 0, sizeof(arg));
3270 ath10k_wmi_start_scan_init(ar, &arg);
3271 arg.vdev_id = arvif->vdev_id;
3272 arg.scan_id = ATH10K_SCAN_ID;
3273
3274 if (!req->no_cck)
3275 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
3276
3277 if (req->ie_len) {
3278 arg.ie_len = req->ie_len;
3279 memcpy(arg.ie, req->ie, arg.ie_len);
3280 }
3281
3282 if (req->n_ssids) {
3283 arg.n_ssids = req->n_ssids;
3284 for (i = 0; i < arg.n_ssids; i++) {
3285 arg.ssids[i].len = req->ssids[i].ssid_len;
3286 arg.ssids[i].ssid = req->ssids[i].ssid;
3287 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02003288 } else {
3289 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003290 }
3291
3292 if (req->n_channels) {
3293 arg.n_channels = req->n_channels;
3294 for (i = 0; i < arg.n_channels; i++)
3295 arg.channels[i] = req->channels[i]->center_freq;
3296 }
3297
3298 ret = ath10k_start_scan(ar, &arg);
3299 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003300 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003301 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003302 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003303 spin_unlock_bh(&ar->data_lock);
3304 }
3305
3306exit:
3307 mutex_unlock(&ar->conf_mutex);
3308 return ret;
3309}
3310
3311static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
3312 struct ieee80211_vif *vif)
3313{
3314 struct ath10k *ar = hw->priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003315
3316 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003317 cancel_delayed_work_sync(&ar->scan.timeout);
3318 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003319 mutex_unlock(&ar->conf_mutex);
3320}
3321
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003322static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
3323 struct ath10k_vif *arvif,
3324 enum set_key_cmd cmd,
3325 struct ieee80211_key_conf *key)
3326{
3327 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
3328 int ret;
3329
3330 /* 10.1 firmware branch requires default key index to be set to group
3331 * key index after installing it. Otherwise FW/HW Txes corrupted
3332 * frames with multi-vif APs. This is not required for main firmware
3333 * branch (e.g. 636).
3334 *
3335 * FIXME: This has been tested only in AP. It remains unknown if this
3336 * is required for multi-vif STA interfaces on 10.1 */
3337
3338 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
3339 return;
3340
3341 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
3342 return;
3343
3344 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
3345 return;
3346
3347 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3348 return;
3349
3350 if (cmd != SET_KEY)
3351 return;
3352
3353 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3354 key->keyidx);
3355 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003356 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003357 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003358}
3359
Kalle Valo5e3dd152013-06-12 20:52:10 +03003360static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3361 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3362 struct ieee80211_key_conf *key)
3363{
3364 struct ath10k *ar = hw->priv;
3365 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3366 struct ath10k_peer *peer;
3367 const u8 *peer_addr;
3368 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
3369 key->cipher == WLAN_CIPHER_SUITE_WEP104;
3370 int ret = 0;
3371
3372 if (key->keyidx > WMI_MAX_KEY_INDEX)
3373 return -ENOSPC;
3374
3375 mutex_lock(&ar->conf_mutex);
3376
3377 if (sta)
3378 peer_addr = sta->addr;
3379 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3380 peer_addr = vif->bss_conf.bssid;
3381 else
3382 peer_addr = vif->addr;
3383
3384 key->hw_key_idx = key->keyidx;
3385
3386 /* the peer should not disappear in mid-way (unless FW goes awry) since
3387 * we already hold conf_mutex. we just make sure its there now. */
3388 spin_lock_bh(&ar->data_lock);
3389 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3390 spin_unlock_bh(&ar->data_lock);
3391
3392 if (!peer) {
3393 if (cmd == SET_KEY) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003394 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003395 peer_addr);
3396 ret = -EOPNOTSUPP;
3397 goto exit;
3398 } else {
3399 /* if the peer doesn't exist there is no key to disable
3400 * anymore */
3401 goto exit;
3402 }
3403 }
3404
3405 if (is_wep) {
3406 if (cmd == SET_KEY)
3407 arvif->wep_keys[key->keyidx] = key;
3408 else
3409 arvif->wep_keys[key->keyidx] = NULL;
3410
3411 if (cmd == DISABLE_KEY)
3412 ath10k_clear_vdev_key(arvif, key);
3413 }
3414
3415 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
3416 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003417 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003418 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003419 goto exit;
3420 }
3421
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003422 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
3423
Kalle Valo5e3dd152013-06-12 20:52:10 +03003424 spin_lock_bh(&ar->data_lock);
3425 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3426 if (peer && cmd == SET_KEY)
3427 peer->keys[key->keyidx] = key;
3428 else if (peer && cmd == DISABLE_KEY)
3429 peer->keys[key->keyidx] = NULL;
3430 else if (peer == NULL)
3431 /* impossible unless FW goes crazy */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003432 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003433 spin_unlock_bh(&ar->data_lock);
3434
3435exit:
3436 mutex_unlock(&ar->conf_mutex);
3437 return ret;
3438}
3439
Michal Kazior9797feb2014-02-14 14:49:48 +01003440static void ath10k_sta_rc_update_wk(struct work_struct *wk)
3441{
3442 struct ath10k *ar;
3443 struct ath10k_vif *arvif;
3444 struct ath10k_sta *arsta;
3445 struct ieee80211_sta *sta;
3446 u32 changed, bw, nss, smps;
3447 int err;
3448
3449 arsta = container_of(wk, struct ath10k_sta, update_wk);
3450 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3451 arvif = arsta->arvif;
3452 ar = arvif->ar;
3453
3454 spin_lock_bh(&ar->data_lock);
3455
3456 changed = arsta->changed;
3457 arsta->changed = 0;
3458
3459 bw = arsta->bw;
3460 nss = arsta->nss;
3461 smps = arsta->smps;
3462
3463 spin_unlock_bh(&ar->data_lock);
3464
3465 mutex_lock(&ar->conf_mutex);
3466
3467 if (changed & IEEE80211_RC_BW_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003468 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003469 sta->addr, bw);
3470
3471 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3472 WMI_PEER_CHAN_WIDTH, bw);
3473 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003474 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003475 sta->addr, bw, err);
3476 }
3477
3478 if (changed & IEEE80211_RC_NSS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003479 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003480 sta->addr, nss);
3481
3482 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3483 WMI_PEER_NSS, nss);
3484 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003485 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003486 sta->addr, nss, err);
3487 }
3488
3489 if (changed & IEEE80211_RC_SMPS_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003490 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003491 sta->addr, smps);
3492
3493 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3494 WMI_PEER_SMPS_STATE, smps);
3495 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003496 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
Michal Kazior9797feb2014-02-14 14:49:48 +01003497 sta->addr, smps, err);
3498 }
3499
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003500 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003501 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM supp rates\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003502 sta->addr);
3503
3504 err = ath10k_station_assoc(ar, arvif, sta, true);
3505 if (err)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003506 ath10k_warn(ar, "failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003507 sta->addr);
3508 }
3509
Michal Kazior9797feb2014-02-14 14:49:48 +01003510 mutex_unlock(&ar->conf_mutex);
3511}
3512
Kalle Valo5e3dd152013-06-12 20:52:10 +03003513static int ath10k_sta_state(struct ieee80211_hw *hw,
3514 struct ieee80211_vif *vif,
3515 struct ieee80211_sta *sta,
3516 enum ieee80211_sta_state old_state,
3517 enum ieee80211_sta_state new_state)
3518{
3519 struct ath10k *ar = hw->priv;
3520 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01003521 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003522 int max_num_peers;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003523 int ret = 0;
3524
Michal Kazior76f90022014-02-25 09:29:57 +02003525 if (old_state == IEEE80211_STA_NOTEXIST &&
3526 new_state == IEEE80211_STA_NONE) {
3527 memset(arsta, 0, sizeof(*arsta));
3528 arsta->arvif = arvif;
3529 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
3530 }
3531
Michal Kazior9797feb2014-02-14 14:49:48 +01003532 /* cancel must be done outside the mutex to avoid deadlock */
3533 if ((old_state == IEEE80211_STA_NONE &&
3534 new_state == IEEE80211_STA_NOTEXIST))
3535 cancel_work_sync(&arsta->update_wk);
3536
Kalle Valo5e3dd152013-06-12 20:52:10 +03003537 mutex_lock(&ar->conf_mutex);
3538
3539 if (old_state == IEEE80211_STA_NOTEXIST &&
3540 new_state == IEEE80211_STA_NONE &&
3541 vif->type != NL80211_IFTYPE_STATION) {
3542 /*
3543 * New station addition.
3544 */
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003545 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
3546 max_num_peers = TARGET_10X_NUM_PEERS_MAX - 1;
3547 else
3548 max_num_peers = TARGET_NUM_PEERS;
3549
3550 if (ar->num_peers >= max_num_peers) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003551 ath10k_warn(ar, "number of peers exceeded: peers number %d (max peers %d)\n",
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003552 ar->num_peers, max_num_peers);
3553 ret = -ENOBUFS;
3554 goto exit;
3555 }
3556
Michal Kazior7aa7a722014-08-25 12:09:38 +02003557 ath10k_dbg(ar, ATH10K_DBG_MAC,
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003558 "mac vdev %d peer create %pM (new sta) num_peers %d\n",
3559 arvif->vdev_id, sta->addr, ar->num_peers);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003560
Kalle Valo5e3dd152013-06-12 20:52:10 +03003561 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
3562 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003563 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 -08003564 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003565 } else if ((old_state == IEEE80211_STA_NONE &&
3566 new_state == IEEE80211_STA_NOTEXIST)) {
3567 /*
3568 * Existing station deletion.
3569 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003570 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03003571 "mac vdev %d peer delete %pM (sta gone)\n",
3572 arvif->vdev_id, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003573 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
3574 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003575 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003576 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003577
3578 if (vif->type == NL80211_IFTYPE_STATION)
3579 ath10k_bss_disassoc(hw, vif);
3580 } else if (old_state == IEEE80211_STA_AUTH &&
3581 new_state == IEEE80211_STA_ASSOC &&
3582 (vif->type == NL80211_IFTYPE_AP ||
3583 vif->type == NL80211_IFTYPE_ADHOC)) {
3584 /*
3585 * New association.
3586 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003587 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM associated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03003588 sta->addr);
3589
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003590 ret = ath10k_station_assoc(ar, arvif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003591 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003592 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003593 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003594 } else if (old_state == IEEE80211_STA_ASSOC &&
3595 new_state == IEEE80211_STA_AUTH &&
3596 (vif->type == NL80211_IFTYPE_AP ||
3597 vif->type == NL80211_IFTYPE_ADHOC)) {
3598 /*
3599 * Disassociation.
3600 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02003601 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03003602 sta->addr);
3603
Kalle Valo5e3dd152013-06-12 20:52:10 +03003604 ret = ath10k_station_disassoc(ar, arvif, sta);
3605 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003606 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003607 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003608 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003609exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003610 mutex_unlock(&ar->conf_mutex);
3611 return ret;
3612}
3613
3614static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
Kalle Valo5b07e072014-09-14 12:50:06 +03003615 u16 ac, bool enable)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003616{
3617 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3618 u32 value = 0;
3619 int ret = 0;
3620
Michal Kazior548db542013-07-05 16:15:15 +03003621 lockdep_assert_held(&ar->conf_mutex);
3622
Kalle Valo5e3dd152013-06-12 20:52:10 +03003623 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3624 return 0;
3625
3626 switch (ac) {
3627 case IEEE80211_AC_VO:
3628 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3629 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3630 break;
3631 case IEEE80211_AC_VI:
3632 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3633 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3634 break;
3635 case IEEE80211_AC_BE:
3636 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3637 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3638 break;
3639 case IEEE80211_AC_BK:
3640 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3641 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3642 break;
3643 }
3644
3645 if (enable)
3646 arvif->u.sta.uapsd |= value;
3647 else
3648 arvif->u.sta.uapsd &= ~value;
3649
3650 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3651 WMI_STA_PS_PARAM_UAPSD,
3652 arvif->u.sta.uapsd);
3653 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003654 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003655 goto exit;
3656 }
3657
3658 if (arvif->u.sta.uapsd)
3659 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
3660 else
3661 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3662
3663 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3664 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
3665 value);
3666 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003667 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003668
3669exit:
3670 return ret;
3671}
3672
3673static int ath10k_conf_tx(struct ieee80211_hw *hw,
3674 struct ieee80211_vif *vif, u16 ac,
3675 const struct ieee80211_tx_queue_params *params)
3676{
3677 struct ath10k *ar = hw->priv;
3678 struct wmi_wmm_params_arg *p = NULL;
3679 int ret;
3680
3681 mutex_lock(&ar->conf_mutex);
3682
3683 switch (ac) {
3684 case IEEE80211_AC_VO:
3685 p = &ar->wmm_params.ac_vo;
3686 break;
3687 case IEEE80211_AC_VI:
3688 p = &ar->wmm_params.ac_vi;
3689 break;
3690 case IEEE80211_AC_BE:
3691 p = &ar->wmm_params.ac_be;
3692 break;
3693 case IEEE80211_AC_BK:
3694 p = &ar->wmm_params.ac_bk;
3695 break;
3696 }
3697
3698 if (WARN_ON(!p)) {
3699 ret = -EINVAL;
3700 goto exit;
3701 }
3702
3703 p->cwmin = params->cw_min;
3704 p->cwmax = params->cw_max;
3705 p->aifs = params->aifs;
3706
3707 /*
3708 * The channel time duration programmed in the HW is in absolute
3709 * microseconds, while mac80211 gives the txop in units of
3710 * 32 microseconds.
3711 */
3712 p->txop = params->txop * 32;
3713
3714 /* FIXME: FW accepts wmm params per hw, not per vif */
3715 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
3716 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003717 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003718 goto exit;
3719 }
3720
3721 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3722 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003723 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003724
3725exit:
3726 mutex_unlock(&ar->conf_mutex);
3727 return ret;
3728}
3729
3730#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3731
3732static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
3733 struct ieee80211_vif *vif,
3734 struct ieee80211_channel *chan,
3735 int duration,
3736 enum ieee80211_roc_type type)
3737{
3738 struct ath10k *ar = hw->priv;
3739 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3740 struct wmi_start_scan_arg arg;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003741 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003742
3743 mutex_lock(&ar->conf_mutex);
3744
3745 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003746 switch (ar->scan.state) {
3747 case ATH10K_SCAN_IDLE:
3748 reinit_completion(&ar->scan.started);
3749 reinit_completion(&ar->scan.completed);
3750 reinit_completion(&ar->scan.on_channel);
3751 ar->scan.state = ATH10K_SCAN_STARTING;
3752 ar->scan.is_roc = true;
3753 ar->scan.vdev_id = arvif->vdev_id;
3754 ar->scan.roc_freq = chan->center_freq;
3755 ret = 0;
3756 break;
3757 case ATH10K_SCAN_STARTING:
3758 case ATH10K_SCAN_RUNNING:
3759 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003760 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003761 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003762 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003763 spin_unlock_bh(&ar->data_lock);
3764
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003765 if (ret)
3766 goto exit;
3767
Kalle Valo5e3dd152013-06-12 20:52:10 +03003768 memset(&arg, 0, sizeof(arg));
3769 ath10k_wmi_start_scan_init(ar, &arg);
3770 arg.vdev_id = arvif->vdev_id;
3771 arg.scan_id = ATH10K_SCAN_ID;
3772 arg.n_channels = 1;
3773 arg.channels[0] = chan->center_freq;
3774 arg.dwell_time_active = duration;
3775 arg.dwell_time_passive = duration;
3776 arg.max_scan_time = 2 * duration;
3777 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3778 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
3779
3780 ret = ath10k_start_scan(ar, &arg);
3781 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003782 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003783 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003784 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003785 spin_unlock_bh(&ar->data_lock);
3786 goto exit;
3787 }
3788
3789 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
3790 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003791 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003792
3793 ret = ath10k_scan_stop(ar);
3794 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003795 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003796
Kalle Valo5e3dd152013-06-12 20:52:10 +03003797 ret = -ETIMEDOUT;
3798 goto exit;
3799 }
3800
3801 ret = 0;
3802exit:
3803 mutex_unlock(&ar->conf_mutex);
3804 return ret;
3805}
3806
3807static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
3808{
3809 struct ath10k *ar = hw->priv;
3810
3811 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003812 cancel_delayed_work_sync(&ar->scan.timeout);
3813 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003814 mutex_unlock(&ar->conf_mutex);
3815
3816 return 0;
3817}
3818
3819/*
3820 * Both RTS and Fragmentation threshold are interface-specific
3821 * in ath10k, but device-specific in mac80211.
3822 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03003823
3824static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3825{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003826 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003827 struct ath10k_vif *arvif;
3828 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03003829
Michal Kaziorad088bf2013-10-16 15:44:46 +03003830 mutex_lock(&ar->conf_mutex);
3831 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003832 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03003833 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003834
Michal Kaziorad088bf2013-10-16 15:44:46 +03003835 ret = ath10k_mac_set_rts(arvif, value);
3836 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003837 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03003838 arvif->vdev_id, ret);
3839 break;
3840 }
3841 }
3842 mutex_unlock(&ar->conf_mutex);
3843
3844 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003845}
3846
3847static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3848{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003849 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003850 struct ath10k_vif *arvif;
3851 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003852
Kalle Valo5e3dd152013-06-12 20:52:10 +03003853 mutex_lock(&ar->conf_mutex);
Michal Kaziorad088bf2013-10-16 15:44:46 +03003854 list_for_each_entry(arvif, &ar->arvifs, list) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003855 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03003856 arvif->vdev_id, value);
3857
3858 ret = ath10k_mac_set_rts(arvif, value);
3859 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003860 ath10k_warn(ar, "failed to set fragmentation threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03003861 arvif->vdev_id, ret);
3862 break;
3863 }
3864 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003865 mutex_unlock(&ar->conf_mutex);
3866
Michal Kaziorad088bf2013-10-16 15:44:46 +03003867 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003868}
3869
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02003870static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
3871 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003872{
3873 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02003874 bool skip;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003875 int ret;
3876
3877 /* mac80211 doesn't care if we really xmit queued frames or not
3878 * we'll collect those frames either way if we stop/delete vdevs */
3879 if (drop)
3880 return;
3881
Michal Kazior548db542013-07-05 16:15:15 +03003882 mutex_lock(&ar->conf_mutex);
3883
Michal Kazioraffd3212013-07-16 09:54:35 +02003884 if (ar->state == ATH10K_STATE_WEDGED)
3885 goto skip;
3886
Michal Kazioredb82362013-07-05 16:15:14 +03003887 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03003888 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02003889
Michal Kazioredb82362013-07-05 16:15:14 +03003890 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02003891 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03003892 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02003893
3894 skip = (ar->state == ATH10K_STATE_WEDGED);
3895
3896 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003897 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02003898
3899 if (ret <= 0 || skip)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003900 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %i\n",
Ben Greear9ba4c782014-02-25 09:29:57 +02003901 skip, ar->state, ret);
Michal Kazior548db542013-07-05 16:15:15 +03003902
Michal Kazioraffd3212013-07-16 09:54:35 +02003903skip:
Michal Kazior548db542013-07-05 16:15:15 +03003904 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003905}
3906
3907/* TODO: Implement this function properly
3908 * For now it is needed to reply to Probe Requests in IBSS mode.
3909 * Propably we need this information from FW.
3910 */
3911static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
3912{
3913 return 1;
3914}
3915
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003916#ifdef CONFIG_PM
3917static int ath10k_suspend(struct ieee80211_hw *hw,
3918 struct cfg80211_wowlan *wowlan)
3919{
3920 struct ath10k *ar = hw->priv;
3921 int ret;
3922
Marek Puzyniak9042e172014-02-10 17:14:23 +01003923 mutex_lock(&ar->conf_mutex);
3924
Marek Puzyniak00f54822014-02-10 17:14:24 +01003925 ret = ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND);
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003926 if (ret) {
Marek Puzyniak00f54822014-02-10 17:14:24 +01003927 if (ret == -ETIMEDOUT)
3928 goto resume;
Marek Puzyniak9042e172014-02-10 17:14:23 +01003929 ret = 1;
3930 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003931 }
3932
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003933 ret = ath10k_hif_suspend(ar);
3934 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003935 ath10k_warn(ar, "failed to suspend hif: %d\n", ret);
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003936 goto resume;
3937 }
3938
Marek Puzyniak9042e172014-02-10 17:14:23 +01003939 ret = 0;
3940 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003941resume:
3942 ret = ath10k_wmi_pdev_resume_target(ar);
3943 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02003944 ath10k_warn(ar, "failed to resume target: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003945
3946 ret = 1;
3947exit:
3948 mutex_unlock(&ar->conf_mutex);
3949 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003950}
3951
3952static int ath10k_resume(struct ieee80211_hw *hw)
3953{
3954 struct ath10k *ar = hw->priv;
3955 int ret;
3956
Marek Puzyniak9042e172014-02-10 17:14:23 +01003957 mutex_lock(&ar->conf_mutex);
3958
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003959 ret = ath10k_hif_resume(ar);
3960 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003961 ath10k_warn(ar, "failed to resume hif: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003962 ret = 1;
3963 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003964 }
3965
3966 ret = ath10k_wmi_pdev_resume_target(ar);
3967 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003968 ath10k_warn(ar, "failed to resume target: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003969 ret = 1;
3970 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003971 }
3972
Marek Puzyniak9042e172014-02-10 17:14:23 +01003973 ret = 0;
3974exit:
3975 mutex_unlock(&ar->conf_mutex);
3976 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003977}
3978#endif
3979
Michal Kazioraffd3212013-07-16 09:54:35 +02003980static void ath10k_restart_complete(struct ieee80211_hw *hw)
3981{
3982 struct ath10k *ar = hw->priv;
3983
3984 mutex_lock(&ar->conf_mutex);
3985
3986 /* If device failed to restart it will be in a different state, e.g.
3987 * ATH10K_STATE_WEDGED */
3988 if (ar->state == ATH10K_STATE_RESTARTED) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02003989 ath10k_info(ar, "device successfully recovered\n");
Michal Kazioraffd3212013-07-16 09:54:35 +02003990 ar->state = ATH10K_STATE_ON;
3991 }
3992
3993 mutex_unlock(&ar->conf_mutex);
3994}
3995
Michal Kazior2e1dea42013-07-31 10:32:40 +02003996static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
3997 struct survey_info *survey)
3998{
3999 struct ath10k *ar = hw->priv;
4000 struct ieee80211_supported_band *sband;
4001 struct survey_info *ar_survey = &ar->survey[idx];
4002 int ret = 0;
4003
4004 mutex_lock(&ar->conf_mutex);
4005
4006 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
4007 if (sband && idx >= sband->n_channels) {
4008 idx -= sband->n_channels;
4009 sband = NULL;
4010 }
4011
4012 if (!sband)
4013 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
4014
4015 if (!sband || idx >= sband->n_channels) {
4016 ret = -ENOENT;
4017 goto exit;
4018 }
4019
4020 spin_lock_bh(&ar->data_lock);
4021 memcpy(survey, ar_survey, sizeof(*survey));
4022 spin_unlock_bh(&ar->data_lock);
4023
4024 survey->channel = &sband->channels[idx];
4025
4026exit:
4027 mutex_unlock(&ar->conf_mutex);
4028 return ret;
4029}
4030
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004031/* Helper table for legacy fixed_rate/bitrate_mask */
4032static const u8 cck_ofdm_rate[] = {
4033 /* CCK */
4034 3, /* 1Mbps */
4035 2, /* 2Mbps */
4036 1, /* 5.5Mbps */
4037 0, /* 11Mbps */
4038 /* OFDM */
4039 3, /* 6Mbps */
4040 7, /* 9Mbps */
4041 2, /* 12Mbps */
4042 6, /* 18Mbps */
4043 1, /* 24Mbps */
4044 5, /* 36Mbps */
4045 0, /* 48Mbps */
4046 4, /* 54Mbps */
4047};
4048
4049/* Check if only one bit set */
4050static int ath10k_check_single_mask(u32 mask)
4051{
4052 int bit;
4053
4054 bit = ffs(mask);
4055 if (!bit)
4056 return 0;
4057
4058 mask &= ~BIT(bit - 1);
4059 if (mask)
4060 return 2;
4061
4062 return 1;
4063}
4064
4065static bool
4066ath10k_default_bitrate_mask(struct ath10k *ar,
4067 enum ieee80211_band band,
4068 const struct cfg80211_bitrate_mask *mask)
4069{
4070 u32 legacy = 0x00ff;
4071 u8 ht = 0xff, i;
4072 u16 vht = 0x3ff;
4073
4074 switch (band) {
4075 case IEEE80211_BAND_2GHZ:
4076 legacy = 0x00fff;
4077 vht = 0;
4078 break;
4079 case IEEE80211_BAND_5GHZ:
4080 break;
4081 default:
4082 return false;
4083 }
4084
4085 if (mask->control[band].legacy != legacy)
4086 return false;
4087
4088 for (i = 0; i < ar->num_rf_chains; i++)
4089 if (mask->control[band].ht_mcs[i] != ht)
4090 return false;
4091
4092 for (i = 0; i < ar->num_rf_chains; i++)
4093 if (mask->control[band].vht_mcs[i] != vht)
4094 return false;
4095
4096 return true;
4097}
4098
4099static bool
4100ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
4101 enum ieee80211_band band,
4102 u8 *fixed_nss)
4103{
4104 int ht_nss = 0, vht_nss = 0, i;
4105
4106 /* check legacy */
4107 if (ath10k_check_single_mask(mask->control[band].legacy))
4108 return false;
4109
4110 /* check HT */
4111 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
4112 if (mask->control[band].ht_mcs[i] == 0xff)
4113 continue;
4114 else if (mask->control[band].ht_mcs[i] == 0x00)
4115 break;
Kalle Valod8bb26b2014-09-14 12:50:33 +03004116
4117 return false;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004118 }
4119
4120 ht_nss = i;
4121
4122 /* check VHT */
4123 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4124 if (mask->control[band].vht_mcs[i] == 0x03ff)
4125 continue;
4126 else if (mask->control[band].vht_mcs[i] == 0x0000)
4127 break;
Kalle Valod8bb26b2014-09-14 12:50:33 +03004128
4129 return false;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004130 }
4131
4132 vht_nss = i;
4133
4134 if (ht_nss > 0 && vht_nss > 0)
4135 return false;
4136
4137 if (ht_nss)
4138 *fixed_nss = ht_nss;
4139 else if (vht_nss)
4140 *fixed_nss = vht_nss;
4141 else
4142 return false;
4143
4144 return true;
4145}
4146
4147static bool
4148ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
4149 enum ieee80211_band band,
4150 enum wmi_rate_preamble *preamble)
4151{
4152 int legacy = 0, ht = 0, vht = 0, i;
4153
4154 *preamble = WMI_RATE_PREAMBLE_OFDM;
4155
4156 /* check legacy */
4157 legacy = ath10k_check_single_mask(mask->control[band].legacy);
4158 if (legacy > 1)
4159 return false;
4160
4161 /* check HT */
4162 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4163 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
4164 if (ht > 1)
4165 return false;
4166
4167 /* check VHT */
4168 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4169 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
4170 if (vht > 1)
4171 return false;
4172
4173 /* Currently we support only one fixed_rate */
4174 if ((legacy + ht + vht) != 1)
4175 return false;
4176
4177 if (ht)
4178 *preamble = WMI_RATE_PREAMBLE_HT;
4179 else if (vht)
4180 *preamble = WMI_RATE_PREAMBLE_VHT;
4181
4182 return true;
4183}
4184
4185static bool
Michal Kazior7aa7a722014-08-25 12:09:38 +02004186ath10k_bitrate_mask_rate(struct ath10k *ar,
4187 const struct cfg80211_bitrate_mask *mask,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004188 enum ieee80211_band band,
4189 u8 *fixed_rate,
4190 u8 *fixed_nss)
4191{
4192 u8 rate = 0, pream = 0, nss = 0, i;
4193 enum wmi_rate_preamble preamble;
4194
4195 /* Check if single rate correct */
4196 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
4197 return false;
4198
4199 pream = preamble;
4200
4201 switch (preamble) {
4202 case WMI_RATE_PREAMBLE_CCK:
4203 case WMI_RATE_PREAMBLE_OFDM:
4204 i = ffs(mask->control[band].legacy) - 1;
4205
4206 if (band == IEEE80211_BAND_2GHZ && i < 4)
4207 pream = WMI_RATE_PREAMBLE_CCK;
4208
4209 if (band == IEEE80211_BAND_5GHZ)
4210 i += 4;
4211
4212 if (i >= ARRAY_SIZE(cck_ofdm_rate))
4213 return false;
4214
4215 rate = cck_ofdm_rate[i];
4216 break;
4217 case WMI_RATE_PREAMBLE_HT:
4218 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4219 if (mask->control[band].ht_mcs[i])
4220 break;
4221
4222 if (i == IEEE80211_HT_MCS_MASK_LEN)
4223 return false;
4224
4225 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4226 nss = i;
4227 break;
4228 case WMI_RATE_PREAMBLE_VHT:
4229 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4230 if (mask->control[band].vht_mcs[i])
4231 break;
4232
4233 if (i == NL80211_VHT_NSS_MAX)
4234 return false;
4235
4236 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4237 nss = i;
4238 break;
4239 }
4240
4241 *fixed_nss = nss + 1;
4242 nss <<= 4;
4243 pream <<= 6;
4244
Michal Kazior7aa7a722014-08-25 12:09:38 +02004245 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 +01004246 pream, nss, rate);
4247
4248 *fixed_rate = pream | nss | rate;
4249
4250 return true;
4251}
4252
Michal Kazior7aa7a722014-08-25 12:09:38 +02004253static bool ath10k_get_fixed_rate_nss(struct ath10k *ar,
4254 const struct cfg80211_bitrate_mask *mask,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004255 enum ieee80211_band band,
4256 u8 *fixed_rate,
4257 u8 *fixed_nss)
4258{
4259 /* First check full NSS mask, if we can simply limit NSS */
4260 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
4261 return true;
4262
4263 /* Next Check single rate is set */
Michal Kazior7aa7a722014-08-25 12:09:38 +02004264 return ath10k_bitrate_mask_rate(ar, mask, band, fixed_rate, fixed_nss);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004265}
4266
4267static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
4268 u8 fixed_rate,
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004269 u8 fixed_nss,
4270 u8 force_sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004271{
4272 struct ath10k *ar = arvif->ar;
4273 u32 vdev_param;
4274 int ret = 0;
4275
4276 mutex_lock(&ar->conf_mutex);
4277
4278 if (arvif->fixed_rate == fixed_rate &&
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004279 arvif->fixed_nss == fixed_nss &&
4280 arvif->force_sgi == force_sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004281 goto exit;
4282
4283 if (fixed_rate == WMI_FIXED_RATE_NONE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004284 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004285
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004286 if (force_sgi)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004287 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac force sgi\n");
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004288
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004289 vdev_param = ar->wmi.vdev_param->fixed_rate;
4290 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4291 vdev_param, fixed_rate);
4292 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004293 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004294 fixed_rate, ret);
4295 ret = -EINVAL;
4296 goto exit;
4297 }
4298
4299 arvif->fixed_rate = fixed_rate;
4300
4301 vdev_param = ar->wmi.vdev_param->nss;
4302 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4303 vdev_param, fixed_nss);
4304
4305 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004306 ath10k_warn(ar, "failed to set fixed nss param %d: %d\n",
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004307 fixed_nss, ret);
4308 ret = -EINVAL;
4309 goto exit;
4310 }
4311
4312 arvif->fixed_nss = fixed_nss;
4313
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004314 vdev_param = ar->wmi.vdev_param->sgi;
4315 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4316 force_sgi);
4317
4318 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004319 ath10k_warn(ar, "failed to set sgi param %d: %d\n",
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004320 force_sgi, ret);
4321 ret = -EINVAL;
4322 goto exit;
4323 }
4324
4325 arvif->force_sgi = force_sgi;
4326
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004327exit:
4328 mutex_unlock(&ar->conf_mutex);
4329 return ret;
4330}
4331
4332static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
4333 struct ieee80211_vif *vif,
4334 const struct cfg80211_bitrate_mask *mask)
4335{
4336 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4337 struct ath10k *ar = arvif->ar;
4338 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
4339 u8 fixed_rate = WMI_FIXED_RATE_NONE;
4340 u8 fixed_nss = ar->num_rf_chains;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004341 u8 force_sgi;
4342
4343 force_sgi = mask->control[band].gi;
4344 if (force_sgi == NL80211_TXRATE_FORCE_LGI)
4345 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004346
4347 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004348 if (!ath10k_get_fixed_rate_nss(ar, mask, band,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004349 &fixed_rate,
4350 &fixed_nss))
4351 return -EINVAL;
4352 }
4353
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004354 if (fixed_rate == WMI_FIXED_RATE_NONE && force_sgi) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004355 ath10k_warn(ar, "failed to force SGI usage for default rate settings\n");
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004356 return -EINVAL;
4357 }
4358
4359 return ath10k_set_fixed_rate_param(arvif, fixed_rate,
4360 fixed_nss, force_sgi);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004361}
4362
Michal Kazior9797feb2014-02-14 14:49:48 +01004363static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
4364 struct ieee80211_vif *vif,
4365 struct ieee80211_sta *sta,
4366 u32 changed)
4367{
4368 struct ath10k *ar = hw->priv;
4369 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4370 u32 bw, smps;
4371
4372 spin_lock_bh(&ar->data_lock);
4373
Michal Kazior7aa7a722014-08-25 12:09:38 +02004374 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kazior9797feb2014-02-14 14:49:48 +01004375 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4376 sta->addr, changed, sta->bandwidth, sta->rx_nss,
4377 sta->smps_mode);
4378
4379 if (changed & IEEE80211_RC_BW_CHANGED) {
4380 bw = WMI_PEER_CHWIDTH_20MHZ;
4381
4382 switch (sta->bandwidth) {
4383 case IEEE80211_STA_RX_BW_20:
4384 bw = WMI_PEER_CHWIDTH_20MHZ;
4385 break;
4386 case IEEE80211_STA_RX_BW_40:
4387 bw = WMI_PEER_CHWIDTH_40MHZ;
4388 break;
4389 case IEEE80211_STA_RX_BW_80:
4390 bw = WMI_PEER_CHWIDTH_80MHZ;
4391 break;
4392 case IEEE80211_STA_RX_BW_160:
Michal Kazior7aa7a722014-08-25 12:09:38 +02004393 ath10k_warn(ar, "Invalid bandwith %d in rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02004394 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01004395 bw = WMI_PEER_CHWIDTH_20MHZ;
4396 break;
4397 }
4398
4399 arsta->bw = bw;
4400 }
4401
4402 if (changed & IEEE80211_RC_NSS_CHANGED)
4403 arsta->nss = sta->rx_nss;
4404
4405 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4406 smps = WMI_PEER_SMPS_PS_NONE;
4407
4408 switch (sta->smps_mode) {
4409 case IEEE80211_SMPS_AUTOMATIC:
4410 case IEEE80211_SMPS_OFF:
4411 smps = WMI_PEER_SMPS_PS_NONE;
4412 break;
4413 case IEEE80211_SMPS_STATIC:
4414 smps = WMI_PEER_SMPS_STATIC;
4415 break;
4416 case IEEE80211_SMPS_DYNAMIC:
4417 smps = WMI_PEER_SMPS_DYNAMIC;
4418 break;
4419 case IEEE80211_SMPS_NUM_MODES:
Michal Kazior7aa7a722014-08-25 12:09:38 +02004420 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02004421 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01004422 smps = WMI_PEER_SMPS_PS_NONE;
4423 break;
4424 }
4425
4426 arsta->smps = smps;
4427 }
4428
Michal Kazior9797feb2014-02-14 14:49:48 +01004429 arsta->changed |= changed;
4430
4431 spin_unlock_bh(&ar->data_lock);
4432
4433 ieee80211_queue_work(hw, &arsta->update_wk);
4434}
4435
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02004436static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
4437{
4438 /*
4439 * FIXME: Return 0 for time being. Need to figure out whether FW
4440 * has the API to fetch 64-bit local TSF
4441 */
4442
4443 return 0;
4444}
4445
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02004446static int ath10k_ampdu_action(struct ieee80211_hw *hw,
4447 struct ieee80211_vif *vif,
4448 enum ieee80211_ampdu_mlme_action action,
4449 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
4450 u8 buf_size)
4451{
Michal Kazior7aa7a722014-08-25 12:09:38 +02004452 struct ath10k *ar = hw->priv;
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02004453 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4454
Michal Kazior7aa7a722014-08-25 12:09:38 +02004455 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 +02004456 arvif->vdev_id, sta->addr, tid, action);
4457
4458 switch (action) {
4459 case IEEE80211_AMPDU_RX_START:
4460 case IEEE80211_AMPDU_RX_STOP:
4461 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
4462 * creation/removal. Do we need to verify this?
4463 */
4464 return 0;
4465 case IEEE80211_AMPDU_TX_START:
4466 case IEEE80211_AMPDU_TX_STOP_CONT:
4467 case IEEE80211_AMPDU_TX_STOP_FLUSH:
4468 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
4469 case IEEE80211_AMPDU_TX_OPERATIONAL:
4470 /* Firmware offloads Tx aggregation entirely so deny mac80211
4471 * Tx aggregation requests.
4472 */
4473 return -EOPNOTSUPP;
4474 }
4475
4476 return -EINVAL;
4477}
4478
Kalle Valo5e3dd152013-06-12 20:52:10 +03004479static const struct ieee80211_ops ath10k_ops = {
4480 .tx = ath10k_tx,
4481 .start = ath10k_start,
4482 .stop = ath10k_stop,
4483 .config = ath10k_config,
4484 .add_interface = ath10k_add_interface,
4485 .remove_interface = ath10k_remove_interface,
4486 .configure_filter = ath10k_configure_filter,
4487 .bss_info_changed = ath10k_bss_info_changed,
4488 .hw_scan = ath10k_hw_scan,
4489 .cancel_hw_scan = ath10k_cancel_hw_scan,
4490 .set_key = ath10k_set_key,
4491 .sta_state = ath10k_sta_state,
4492 .conf_tx = ath10k_conf_tx,
4493 .remain_on_channel = ath10k_remain_on_channel,
4494 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
4495 .set_rts_threshold = ath10k_set_rts_threshold,
4496 .set_frag_threshold = ath10k_set_frag_threshold,
4497 .flush = ath10k_flush,
4498 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7bb2014-05-16 17:15:38 +03004499 .set_antenna = ath10k_set_antenna,
4500 .get_antenna = ath10k_get_antenna,
Michal Kazioraffd3212013-07-16 09:54:35 +02004501 .restart_complete = ath10k_restart_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02004502 .get_survey = ath10k_get_survey,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004503 .set_bitrate_mask = ath10k_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01004504 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02004505 .get_tsf = ath10k_get_tsf,
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02004506 .ampdu_action = ath10k_ampdu_action,
Kalle Valo43d2a302014-09-10 18:23:30 +03004507
4508 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
4509
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004510#ifdef CONFIG_PM
4511 .suspend = ath10k_suspend,
4512 .resume = ath10k_resume,
4513#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03004514};
4515
4516#define RATETAB_ENT(_rate, _rateid, _flags) { \
4517 .bitrate = (_rate), \
4518 .flags = (_flags), \
4519 .hw_value = (_rateid), \
4520}
4521
4522#define CHAN2G(_channel, _freq, _flags) { \
4523 .band = IEEE80211_BAND_2GHZ, \
4524 .hw_value = (_channel), \
4525 .center_freq = (_freq), \
4526 .flags = (_flags), \
4527 .max_antenna_gain = 0, \
4528 .max_power = 30, \
4529}
4530
4531#define CHAN5G(_channel, _freq, _flags) { \
4532 .band = IEEE80211_BAND_5GHZ, \
4533 .hw_value = (_channel), \
4534 .center_freq = (_freq), \
4535 .flags = (_flags), \
4536 .max_antenna_gain = 0, \
4537 .max_power = 30, \
4538}
4539
4540static const struct ieee80211_channel ath10k_2ghz_channels[] = {
4541 CHAN2G(1, 2412, 0),
4542 CHAN2G(2, 2417, 0),
4543 CHAN2G(3, 2422, 0),
4544 CHAN2G(4, 2427, 0),
4545 CHAN2G(5, 2432, 0),
4546 CHAN2G(6, 2437, 0),
4547 CHAN2G(7, 2442, 0),
4548 CHAN2G(8, 2447, 0),
4549 CHAN2G(9, 2452, 0),
4550 CHAN2G(10, 2457, 0),
4551 CHAN2G(11, 2462, 0),
4552 CHAN2G(12, 2467, 0),
4553 CHAN2G(13, 2472, 0),
4554 CHAN2G(14, 2484, 0),
4555};
4556
4557static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02004558 CHAN5G(36, 5180, 0),
4559 CHAN5G(40, 5200, 0),
4560 CHAN5G(44, 5220, 0),
4561 CHAN5G(48, 5240, 0),
4562 CHAN5G(52, 5260, 0),
4563 CHAN5G(56, 5280, 0),
4564 CHAN5G(60, 5300, 0),
4565 CHAN5G(64, 5320, 0),
4566 CHAN5G(100, 5500, 0),
4567 CHAN5G(104, 5520, 0),
4568 CHAN5G(108, 5540, 0),
4569 CHAN5G(112, 5560, 0),
4570 CHAN5G(116, 5580, 0),
4571 CHAN5G(120, 5600, 0),
4572 CHAN5G(124, 5620, 0),
4573 CHAN5G(128, 5640, 0),
4574 CHAN5G(132, 5660, 0),
4575 CHAN5G(136, 5680, 0),
4576 CHAN5G(140, 5700, 0),
4577 CHAN5G(149, 5745, 0),
4578 CHAN5G(153, 5765, 0),
4579 CHAN5G(157, 5785, 0),
4580 CHAN5G(161, 5805, 0),
4581 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03004582};
4583
4584static struct ieee80211_rate ath10k_rates[] = {
4585 /* CCK */
4586 RATETAB_ENT(10, 0x82, 0),
4587 RATETAB_ENT(20, 0x84, 0),
4588 RATETAB_ENT(55, 0x8b, 0),
4589 RATETAB_ENT(110, 0x96, 0),
4590 /* OFDM */
4591 RATETAB_ENT(60, 0x0c, 0),
4592 RATETAB_ENT(90, 0x12, 0),
4593 RATETAB_ENT(120, 0x18, 0),
4594 RATETAB_ENT(180, 0x24, 0),
4595 RATETAB_ENT(240, 0x30, 0),
4596 RATETAB_ENT(360, 0x48, 0),
4597 RATETAB_ENT(480, 0x60, 0),
4598 RATETAB_ENT(540, 0x6c, 0),
4599};
4600
4601#define ath10k_a_rates (ath10k_rates + 4)
4602#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
4603#define ath10k_g_rates (ath10k_rates + 0)
4604#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
4605
Michal Kaziore7b54192014-08-07 11:03:27 +02004606struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004607{
4608 struct ieee80211_hw *hw;
4609 struct ath10k *ar;
4610
Michal Kaziore7b54192014-08-07 11:03:27 +02004611 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004612 if (!hw)
4613 return NULL;
4614
4615 ar = hw->priv;
4616 ar->hw = hw;
4617
4618 return ar;
4619}
4620
4621void ath10k_mac_destroy(struct ath10k *ar)
4622{
4623 ieee80211_free_hw(ar->hw);
4624}
4625
4626static const struct ieee80211_iface_limit ath10k_if_limits[] = {
4627 {
4628 .max = 8,
4629 .types = BIT(NL80211_IFTYPE_STATION)
4630 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02004631 },
4632 {
4633 .max = 3,
4634 .types = BIT(NL80211_IFTYPE_P2P_GO)
4635 },
4636 {
4637 .max = 7,
4638 .types = BIT(NL80211_IFTYPE_AP)
4639 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004640};
4641
Bartosz Markowskif2595092013-12-10 16:20:39 +01004642static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004643 {
4644 .max = 8,
4645 .types = BIT(NL80211_IFTYPE_AP)
4646 },
4647};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004648
4649static const struct ieee80211_iface_combination ath10k_if_comb[] = {
4650 {
4651 .limits = ath10k_if_limits,
4652 .n_limits = ARRAY_SIZE(ath10k_if_limits),
4653 .max_interfaces = 8,
4654 .num_different_channels = 1,
4655 .beacon_int_infra_match = true,
4656 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01004657};
4658
4659static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004660 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01004661 .limits = ath10k_10x_if_limits,
4662 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004663 .max_interfaces = 8,
4664 .num_different_channels = 1,
4665 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01004666#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004667 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
4668 BIT(NL80211_CHAN_WIDTH_20) |
4669 BIT(NL80211_CHAN_WIDTH_40) |
4670 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004671#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01004672 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004673};
4674
4675static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4676{
4677 struct ieee80211_sta_vht_cap vht_cap = {0};
4678 u16 mcs_map;
Michal Kazior8865bee42013-07-24 12:36:46 +02004679 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004680
4681 vht_cap.vht_supported = 1;
4682 vht_cap.cap = ar->vht_cap_info;
4683
Michal Kazior8865bee42013-07-24 12:36:46 +02004684 mcs_map = 0;
4685 for (i = 0; i < 8; i++) {
4686 if (i < ar->num_rf_chains)
4687 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
4688 else
4689 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
4690 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004691
4692 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4693 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4694
4695 return vht_cap;
4696}
4697
4698static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4699{
4700 int i;
4701 struct ieee80211_sta_ht_cap ht_cap = {0};
4702
4703 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4704 return ht_cap;
4705
4706 ht_cap.ht_supported = 1;
4707 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4708 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4709 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4710 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4711 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4712
4713 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4714 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4715
4716 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4717 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4718
4719 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4720 u32 smps;
4721
4722 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4723 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4724
4725 ht_cap.cap |= smps;
4726 }
4727
4728 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
4729 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4730
4731 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4732 u32 stbc;
4733
4734 stbc = ar->ht_cap_info;
4735 stbc &= WMI_HT_CAP_RX_STBC;
4736 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4737 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4738 stbc &= IEEE80211_HT_CAP_RX_STBC;
4739
4740 ht_cap.cap |= stbc;
4741 }
4742
4743 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4744 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4745
4746 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4747 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4748
4749 /* max AMSDU is implicitly taken from vht_cap_info */
4750 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4751 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4752
Michal Kazior8865bee42013-07-24 12:36:46 +02004753 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004754 ht_cap.mcs.rx_mask[i] = 0xFF;
4755
4756 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4757
4758 return ht_cap;
4759}
4760
Kalle Valo5e3dd152013-06-12 20:52:10 +03004761static void ath10k_get_arvif_iter(void *data, u8 *mac,
4762 struct ieee80211_vif *vif)
4763{
4764 struct ath10k_vif_iter *arvif_iter = data;
4765 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4766
4767 if (arvif->vdev_id == arvif_iter->vdev_id)
4768 arvif_iter->arvif = arvif;
4769}
4770
4771struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
4772{
4773 struct ath10k_vif_iter arvif_iter;
4774 u32 flags;
4775
4776 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
4777 arvif_iter.vdev_id = vdev_id;
4778
4779 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
4780 ieee80211_iterate_active_interfaces_atomic(ar->hw,
4781 flags,
4782 ath10k_get_arvif_iter,
4783 &arvif_iter);
4784 if (!arvif_iter.arvif) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004785 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004786 return NULL;
4787 }
4788
4789 return arvif_iter.arvif;
4790}
4791
4792int ath10k_mac_register(struct ath10k *ar)
4793{
4794 struct ieee80211_supported_band *band;
4795 struct ieee80211_sta_vht_cap vht_cap;
4796 struct ieee80211_sta_ht_cap ht_cap;
4797 void *channels;
4798 int ret;
4799
4800 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
4801
4802 SET_IEEE80211_DEV(ar->hw, ar->dev);
4803
4804 ht_cap = ath10k_get_ht_cap(ar);
4805 vht_cap = ath10k_create_vht_cap(ar);
4806
4807 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4808 channels = kmemdup(ath10k_2ghz_channels,
4809 sizeof(ath10k_2ghz_channels),
4810 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02004811 if (!channels) {
4812 ret = -ENOMEM;
4813 goto err_free;
4814 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004815
4816 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
4817 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
4818 band->channels = channels;
4819 band->n_bitrates = ath10k_g_rates_size;
4820 band->bitrates = ath10k_g_rates;
4821 band->ht_cap = ht_cap;
4822
4823 /* vht is not supported in 2.4 GHz */
4824
4825 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
4826 }
4827
4828 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4829 channels = kmemdup(ath10k_5ghz_channels,
4830 sizeof(ath10k_5ghz_channels),
4831 GFP_KERNEL);
4832 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02004833 ret = -ENOMEM;
4834 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004835 }
4836
4837 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
4838 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
4839 band->channels = channels;
4840 band->n_bitrates = ath10k_a_rates_size;
4841 band->bitrates = ath10k_a_rates;
4842 band->ht_cap = ht_cap;
4843 band->vht_cap = vht_cap;
4844 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
4845 }
4846
4847 ar->hw->wiphy->interface_modes =
4848 BIT(NL80211_IFTYPE_STATION) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01004849 BIT(NL80211_IFTYPE_AP);
4850
Ben Greear46acf7bb2014-05-16 17:15:38 +03004851 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4852 /* TODO: Have to deal with 2x2 chips if/when the come out. */
4853 ar->supp_tx_chainmask = TARGET_10X_TX_CHAIN_MASK;
4854 ar->supp_rx_chainmask = TARGET_10X_RX_CHAIN_MASK;
4855 } else {
4856 ar->supp_tx_chainmask = TARGET_TX_CHAIN_MASK;
4857 ar->supp_rx_chainmask = TARGET_RX_CHAIN_MASK;
4858 }
4859
4860 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
4861 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
4862
Bartosz Markowskid3541812013-12-10 16:20:40 +01004863 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
4864 ar->hw->wiphy->interface_modes |=
4865 BIT(NL80211_IFTYPE_P2P_CLIENT) |
4866 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004867
4868 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
4869 IEEE80211_HW_SUPPORTS_PS |
4870 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
4871 IEEE80211_HW_SUPPORTS_UAPSD |
4872 IEEE80211_HW_MFP_CAPABLE |
4873 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
4874 IEEE80211_HW_HAS_RATE_CONTROL |
4875 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
Janusz Dziedzic2f0f1122014-02-26 18:42:09 +02004876 IEEE80211_HW_AP_LINK_PS |
4877 IEEE80211_HW_SPECTRUM_MGMT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004878
Michal Kazior1f8bb152013-09-18 14:43:22 +02004879 /* MSDU can have HTT TX fragment pushed in front. The additional 4
4880 * bytes is used for padding/alignment if necessary. */
4881 ar->hw->extra_tx_headroom += sizeof(struct htt_data_tx_desc_frag)*2 + 4;
4882
Kalle Valo5e3dd152013-06-12 20:52:10 +03004883 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4884 ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
4885
4886 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
4887 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
4888 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
4889 }
4890
4891 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
4892 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
4893
4894 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01004895 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004896
Kalle Valo5e3dd152013-06-12 20:52:10 +03004897 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
4898
4899 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01004900 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004901 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
4902
4903 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
4904 /*
4905 * on LL hardware queues are managed entirely by the FW
4906 * so we only advertise to mac we can do the queues thing
4907 */
4908 ar->hw->queues = 4;
4909
Bartosz Markowskif2595092013-12-10 16:20:39 +01004910 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4911 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
4912 ar->hw->wiphy->n_iface_combinations =
4913 ARRAY_SIZE(ath10k_10x_if_comb);
4914 } else {
4915 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
4916 ar->hw->wiphy->n_iface_combinations =
4917 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03004918
4919 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Bartosz Markowskif2595092013-12-10 16:20:39 +01004920 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004921
Michal Kazior7c199992013-07-31 10:47:57 +02004922 ar->hw->netdev_features = NETIF_F_HW_CSUM;
4923
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004924 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
4925 /* Init ath dfs pattern detector */
4926 ar->ath_common.debug_mask = ATH_DBG_DFS;
4927 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
4928 NL80211_DFS_UNSET);
4929
4930 if (!ar->dfs_detector)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004931 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004932 }
4933
Kalle Valo5e3dd152013-06-12 20:52:10 +03004934 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
4935 ath10k_reg_notifier);
4936 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004937 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02004938 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004939 }
4940
4941 ret = ieee80211_register_hw(ar->hw);
4942 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004943 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02004944 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004945 }
4946
4947 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
4948 ret = regulatory_hint(ar->hw->wiphy,
4949 ar->ath_common.regulatory.alpha2);
4950 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02004951 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004952 }
4953
4954 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02004955
4956err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004957 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02004958err_free:
4959 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4960 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4961
Kalle Valo5e3dd152013-06-12 20:52:10 +03004962 return ret;
4963}
4964
4965void ath10k_mac_unregister(struct ath10k *ar)
4966{
4967 ieee80211_unregister_hw(ar->hw);
4968
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004969 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
4970 ar->dfs_detector->exit(ar->dfs_detector);
4971
Kalle Valo5e3dd152013-06-12 20:52:10 +03004972 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4973 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4974
4975 SET_IEEE80211_DEV(ar->hw, NULL);
4976}