blob: d7a2d6f9a0a4625937525b27f9b5686271d91f6b [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 Greear16c11172014-09-23 14:17:16 -0700627 bit = __ffs64(ar->free_vdev_map);
Ben Greeara9aefb32014-08-12 11:02:19 +0300628
Ben Greear16c11172014-09-23 14:17:16 -0700629 ar->monitor_vdev_id = bit;
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 Greear16c11172014-09-23 14:17:16 -0700640 ar->free_vdev_map &= ~(1LL << 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 Greear16c11172014-09-23 14:17:16 -0700660 ar->free_vdev_map |= 1LL << 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
Michal Kaziorc930f742014-01-23 11:38:25 +0100995 memset(arvif->bssid, 0, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300996
997 return;
998 }
999
1000 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
1001 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001002 ath10k_warn(ar, "failed to create IBSS self peer %pM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001003 self_peer, arvif->vdev_id, ret);
1004 return;
1005 }
1006
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02001007 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1008 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001009 ATH10K_DEFAULT_ATIM);
1010 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001011 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001012 arvif->vdev_id, ret);
1013}
1014
1015/*
1016 * Review this when mac80211 gains per-interface powersave support.
1017 */
Michal Kaziorad088bf2013-10-16 15:44:46 +03001018static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001019{
Michal Kaziorad088bf2013-10-16 15:44:46 +03001020 struct ath10k *ar = arvif->ar;
1021 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001022 enum wmi_sta_powersave_param param;
1023 enum wmi_sta_ps_mode psmode;
1024 int ret;
1025
Michal Kazior548db542013-07-05 16:15:15 +03001026 lockdep_assert_held(&arvif->ar->conf_mutex);
1027
Michal Kaziorad088bf2013-10-16 15:44:46 +03001028 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1029 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001030
1031 if (conf->flags & IEEE80211_CONF_PS) {
1032 psmode = WMI_STA_PS_MODE_ENABLED;
1033 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1034
Michal Kaziorad088bf2013-10-16 15:44:46 +03001035 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001036 conf->dynamic_ps_timeout);
1037 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001038 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001039 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001040 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001041 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001042 } else {
1043 psmode = WMI_STA_PS_MODE_DISABLED;
1044 }
1045
Michal Kazior7aa7a722014-08-25 12:09:38 +02001046 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001047 arvif->vdev_id, psmode ? "enable" : "disable");
1048
Michal Kaziorad088bf2013-10-16 15:44:46 +03001049 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1050 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001051 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001052 psmode, arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001053 return ret;
1054 }
1055
1056 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001057}
1058
1059/**********************/
1060/* Station management */
1061/**********************/
1062
Michal Kazior590922a2014-10-21 10:10:29 +03001063static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
1064 struct ieee80211_vif *vif)
1065{
1066 /* Some firmware revisions have unstable STA powersave when listen
1067 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1068 * generate NullFunc frames properly even if buffered frames have been
1069 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1070 * buffered frames. Often pinging the device from AP would simply fail.
1071 *
1072 * As a workaround set it to 1.
1073 */
1074 if (vif->type == NL80211_IFTYPE_STATION)
1075 return 1;
1076
1077 return ar->hw->conf.listen_interval;
1078}
1079
Kalle Valo5e3dd152013-06-12 20:52:10 +03001080static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001081 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001082 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001083 struct wmi_peer_assoc_complete_arg *arg)
1084{
Michal Kazior590922a2014-10-21 10:10:29 +03001085 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1086
Michal Kazior548db542013-07-05 16:15:15 +03001087 lockdep_assert_held(&ar->conf_mutex);
1088
Kalle Valob25f32c2014-09-14 12:50:49 +03001089 ether_addr_copy(arg->addr, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001090 arg->vdev_id = arvif->vdev_id;
1091 arg->peer_aid = sta->aid;
1092 arg->peer_flags |= WMI_PEER_AUTH;
Michal Kazior590922a2014-10-21 10:10:29 +03001093 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001094 arg->peer_num_spatial_streams = 1;
Michal Kazior590922a2014-10-21 10:10:29 +03001095 arg->peer_caps = vif->bss_conf.assoc_capability;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001096}
1097
1098static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001099 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001100 struct wmi_peer_assoc_complete_arg *arg)
1101{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001102 struct ieee80211_bss_conf *info = &vif->bss_conf;
1103 struct cfg80211_bss *bss;
1104 const u8 *rsnie = NULL;
1105 const u8 *wpaie = NULL;
1106
Michal Kazior548db542013-07-05 16:15:15 +03001107 lockdep_assert_held(&ar->conf_mutex);
1108
Kalle Valo5e3dd152013-06-12 20:52:10 +03001109 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1110 info->bssid, NULL, 0, 0, 0);
1111 if (bss) {
1112 const struct cfg80211_bss_ies *ies;
1113
1114 rcu_read_lock();
1115 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1116
1117 ies = rcu_dereference(bss->ies);
1118
1119 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
Kalle Valo5b07e072014-09-14 12:50:06 +03001120 WLAN_OUI_TYPE_MICROSOFT_WPA,
1121 ies->data,
1122 ies->len);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001123 rcu_read_unlock();
1124 cfg80211_put_bss(ar->hw->wiphy, bss);
1125 }
1126
1127 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1128 if (rsnie || wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001129 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001130 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1131 }
1132
1133 if (wpaie) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001134 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001135 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1136 }
1137}
1138
1139static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
1140 struct ieee80211_sta *sta,
1141 struct wmi_peer_assoc_complete_arg *arg)
1142{
1143 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1144 const struct ieee80211_supported_band *sband;
1145 const struct ieee80211_rate *rates;
1146 u32 ratemask;
1147 int i;
1148
Michal Kazior548db542013-07-05 16:15:15 +03001149 lockdep_assert_held(&ar->conf_mutex);
1150
Kalle Valo5e3dd152013-06-12 20:52:10 +03001151 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1152 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1153 rates = sband->bitrates;
1154
1155 rateset->num_rates = 0;
1156
1157 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1158 if (!(ratemask & 1))
1159 continue;
1160
1161 rateset->rates[rateset->num_rates] = rates->hw_value;
1162 rateset->num_rates++;
1163 }
1164}
1165
1166static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1167 struct ieee80211_sta *sta,
1168 struct wmi_peer_assoc_complete_arg *arg)
1169{
1170 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001171 int i, n;
Kalle Valoaf762c02014-09-14 12:50:17 +03001172 u32 stbc;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001173
Michal Kazior548db542013-07-05 16:15:15 +03001174 lockdep_assert_held(&ar->conf_mutex);
1175
Kalle Valo5e3dd152013-06-12 20:52:10 +03001176 if (!ht_cap->ht_supported)
1177 return;
1178
1179 arg->peer_flags |= WMI_PEER_HT;
1180 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1181 ht_cap->ampdu_factor)) - 1;
1182
1183 arg->peer_mpdu_density =
1184 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1185
1186 arg->peer_ht_caps = ht_cap->cap;
1187 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1188
1189 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1190 arg->peer_flags |= WMI_PEER_LDPC;
1191
1192 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1193 arg->peer_flags |= WMI_PEER_40MHZ;
1194 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1195 }
1196
1197 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1198 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1199
1200 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1201 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1202
1203 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1204 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1205 arg->peer_flags |= WMI_PEER_STBC;
1206 }
1207
1208 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001209 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1210 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1211 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1212 arg->peer_rate_caps |= stbc;
1213 arg->peer_flags |= WMI_PEER_STBC;
1214 }
1215
Kalle Valo5e3dd152013-06-12 20:52:10 +03001216 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1217 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1218 else if (ht_cap->mcs.rx_mask[1])
1219 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1220
1221 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1222 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1223 arg->peer_ht_rates.rates[n++] = i;
1224
Bartosz Markowskifd71f802014-02-10 13:12:55 +01001225 /*
1226 * This is a workaround for HT-enabled STAs which break the spec
1227 * and have no HT capabilities RX mask (no HT RX MCS map).
1228 *
1229 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1230 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1231 *
1232 * Firmware asserts if such situation occurs.
1233 */
1234 if (n == 0) {
1235 arg->peer_ht_rates.num_rates = 8;
1236 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1237 arg->peer_ht_rates.rates[i] = i;
1238 } else {
1239 arg->peer_ht_rates.num_rates = n;
1240 arg->peer_num_spatial_streams = sta->rx_nss;
1241 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001242
Michal Kazior7aa7a722014-08-25 12:09:38 +02001243 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001244 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001245 arg->peer_ht_rates.num_rates,
1246 arg->peer_num_spatial_streams);
1247}
1248
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001249static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1250 struct ath10k_vif *arvif,
1251 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001252{
1253 u32 uapsd = 0;
1254 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001255 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001256
Michal Kazior548db542013-07-05 16:15:15 +03001257 lockdep_assert_held(&ar->conf_mutex);
1258
Kalle Valo5e3dd152013-06-12 20:52:10 +03001259 if (sta->wme && sta->uapsd_queues) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001260 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001261 sta->uapsd_queues, sta->max_sp);
1262
Kalle Valo5e3dd152013-06-12 20:52:10 +03001263 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1264 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1265 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1266 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1267 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1268 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1269 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1270 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1271 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1272 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1273 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1274 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1275
Kalle Valo5e3dd152013-06-12 20:52:10 +03001276 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1277 max_sp = sta->max_sp;
1278
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001279 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1280 sta->addr,
1281 WMI_AP_PS_PEER_PARAM_UAPSD,
1282 uapsd);
1283 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001284 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001285 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001286 return ret;
1287 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001288
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001289 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1290 sta->addr,
1291 WMI_AP_PS_PEER_PARAM_MAX_SP,
1292 max_sp);
1293 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001294 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001295 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001296 return ret;
1297 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001298
1299 /* TODO setup this based on STA listen interval and
1300 beacon interval. Currently we don't know
1301 sta->listen_interval - mac80211 patch required.
1302 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001303 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
Kalle Valo5b07e072014-09-14 12:50:06 +03001304 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
1305 10);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001306 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001307 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001308 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001309 return ret;
1310 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001311 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001312
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001313 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001314}
1315
1316static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1317 struct ieee80211_sta *sta,
1318 struct wmi_peer_assoc_complete_arg *arg)
1319{
1320 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001321 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001322
1323 if (!vht_cap->vht_supported)
1324 return;
1325
1326 arg->peer_flags |= WMI_PEER_VHT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001327 arg->peer_vht_caps = vht_cap->cap;
1328
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001329 ampdu_factor = (vht_cap->cap &
1330 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1331 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1332
1333 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1334 * zero in VHT IE. Using it would result in degraded throughput.
1335 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1336 * it if VHT max_mpdu is smaller. */
1337 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1338 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1339 ampdu_factor)) - 1);
1340
Kalle Valo5e3dd152013-06-12 20:52:10 +03001341 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1342 arg->peer_flags |= WMI_PEER_80MHZ;
1343
1344 arg->peer_vht_rates.rx_max_rate =
1345 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1346 arg->peer_vht_rates.rx_mcs_set =
1347 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1348 arg->peer_vht_rates.tx_max_rate =
1349 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1350 arg->peer_vht_rates.tx_mcs_set =
1351 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1352
Michal Kazior7aa7a722014-08-25 12:09:38 +02001353 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001354 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001355}
1356
1357static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001358 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001359 struct ieee80211_sta *sta,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001360 struct wmi_peer_assoc_complete_arg *arg)
1361{
Michal Kazior590922a2014-10-21 10:10:29 +03001362 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1363
Kalle Valo5e3dd152013-06-12 20:52:10 +03001364 switch (arvif->vdev_type) {
1365 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001366 if (sta->wme)
1367 arg->peer_flags |= WMI_PEER_QOS;
1368
1369 if (sta->wme && sta->uapsd_queues) {
1370 arg->peer_flags |= WMI_PEER_APSD;
1371 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1372 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001373 break;
1374 case WMI_VDEV_TYPE_STA:
Michal Kazior590922a2014-10-21 10:10:29 +03001375 if (vif->bss_conf.qos)
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001376 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001377 break;
1378 default:
1379 break;
1380 }
1381}
1382
1383static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001384 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001385 struct ieee80211_sta *sta,
1386 struct wmi_peer_assoc_complete_arg *arg)
1387{
1388 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1389
Kalle Valo5e3dd152013-06-12 20:52:10 +03001390 switch (ar->hw->conf.chandef.chan->band) {
1391 case IEEE80211_BAND_2GHZ:
1392 if (sta->ht_cap.ht_supported) {
1393 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1394 phymode = MODE_11NG_HT40;
1395 else
1396 phymode = MODE_11NG_HT20;
1397 } else {
1398 phymode = MODE_11G;
1399 }
1400
1401 break;
1402 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03001403 /*
1404 * Check VHT first.
1405 */
1406 if (sta->vht_cap.vht_supported) {
1407 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1408 phymode = MODE_11AC_VHT80;
1409 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1410 phymode = MODE_11AC_VHT40;
1411 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1412 phymode = MODE_11AC_VHT20;
1413 } else if (sta->ht_cap.ht_supported) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001414 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1415 phymode = MODE_11NA_HT40;
1416 else
1417 phymode = MODE_11NA_HT20;
1418 } else {
1419 phymode = MODE_11A;
1420 }
1421
1422 break;
1423 default:
1424 break;
1425 }
1426
Michal Kazior7aa7a722014-08-25 12:09:38 +02001427 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
Kalle Valo38a1d472013-09-08 17:56:14 +03001428 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03001429
Kalle Valo5e3dd152013-06-12 20:52:10 +03001430 arg->peer_phymode = phymode;
1431 WARN_ON(phymode == MODE_UNKNOWN);
1432}
1433
Kalle Valob9ada652013-10-16 15:44:46 +03001434static int ath10k_peer_assoc_prepare(struct ath10k *ar,
Michal Kazior590922a2014-10-21 10:10:29 +03001435 struct ieee80211_vif *vif,
Kalle Valob9ada652013-10-16 15:44:46 +03001436 struct ieee80211_sta *sta,
Kalle Valob9ada652013-10-16 15:44:46 +03001437 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001438{
Michal Kazior548db542013-07-05 16:15:15 +03001439 lockdep_assert_held(&ar->conf_mutex);
1440
Kalle Valob9ada652013-10-16 15:44:46 +03001441 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03001442
Michal Kazior590922a2014-10-21 10:10:29 +03001443 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
1444 ath10k_peer_assoc_h_crypto(ar, vif, arg);
Kalle Valob9ada652013-10-16 15:44:46 +03001445 ath10k_peer_assoc_h_rates(ar, sta, arg);
1446 ath10k_peer_assoc_h_ht(ar, sta, arg);
1447 ath10k_peer_assoc_h_vht(ar, sta, arg);
Michal Kazior590922a2014-10-21 10:10:29 +03001448 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
1449 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001450
Kalle Valob9ada652013-10-16 15:44:46 +03001451 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001452}
1453
Michal Kazior90046f52014-02-14 14:45:51 +01001454static const u32 ath10k_smps_map[] = {
1455 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
1456 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
1457 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
1458 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
1459};
1460
1461static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1462 const u8 *addr,
1463 const struct ieee80211_sta_ht_cap *ht_cap)
1464{
1465 int smps;
1466
1467 if (!ht_cap->ht_supported)
1468 return 0;
1469
1470 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1471 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1472
1473 if (smps >= ARRAY_SIZE(ath10k_smps_map))
1474 return -EINVAL;
1475
1476 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
1477 WMI_PEER_SMPS_STATE,
1478 ath10k_smps_map[smps]);
1479}
1480
Kalle Valo5e3dd152013-06-12 20:52:10 +03001481/* can be called only in mac80211 callbacks due to `key_count` usage */
1482static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1483 struct ieee80211_vif *vif,
1484 struct ieee80211_bss_conf *bss_conf)
1485{
1486 struct ath10k *ar = hw->priv;
1487 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01001488 struct ieee80211_sta_ht_cap ht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03001489 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001490 struct ieee80211_sta *ap_sta;
1491 int ret;
1492
Michal Kazior548db542013-07-05 16:15:15 +03001493 lockdep_assert_held(&ar->conf_mutex);
1494
Kalle Valo5e3dd152013-06-12 20:52:10 +03001495 rcu_read_lock();
1496
1497 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1498 if (!ap_sta) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001499 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001500 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001501 rcu_read_unlock();
1502 return;
1503 }
1504
Michal Kazior90046f52014-02-14 14:45:51 +01001505 /* ap_sta must be accessed only within rcu section which must be left
1506 * before calling ath10k_setup_peer_smps() which might sleep. */
1507 ht_cap = ap_sta->ht_cap;
1508
Michal Kazior590922a2014-10-21 10:10:29 +03001509 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001510 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001511 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001512 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001513 rcu_read_unlock();
1514 return;
1515 }
1516
1517 rcu_read_unlock();
1518
Kalle Valob9ada652013-10-16 15:44:46 +03001519 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1520 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001521 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001522 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001523 return;
1524 }
1525
Michal Kazior90046f52014-02-14 14:45:51 +01001526 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
1527 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001528 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001529 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01001530 return;
1531 }
1532
Michal Kazior7aa7a722014-08-25 12:09:38 +02001533 ath10k_dbg(ar, ATH10K_DBG_MAC,
Kalle Valo60c3daa2013-09-08 17:56:07 +03001534 "mac vdev %d up (associated) bssid %pM aid %d\n",
1535 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1536
Michal Kaziorc930f742014-01-23 11:38:25 +01001537 arvif->aid = bss_conf->aid;
Kalle Valob25f32c2014-09-14 12:50:49 +03001538 ether_addr_copy(arvif->bssid, bss_conf->bssid);
Michal Kaziorc930f742014-01-23 11:38:25 +01001539
1540 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1541 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001542 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001543 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001544 return;
1545 }
1546
1547 arvif->is_up = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001548}
1549
1550/*
1551 * FIXME: flush TIDs
1552 */
1553static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1554 struct ieee80211_vif *vif)
1555{
1556 struct ath10k *ar = hw->priv;
1557 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1558 int ret;
1559
Michal Kazior548db542013-07-05 16:15:15 +03001560 lockdep_assert_held(&ar->conf_mutex);
1561
Kalle Valo5e3dd152013-06-12 20:52:10 +03001562 /*
1563 * For some reason, calling VDEV-DOWN before VDEV-STOP
1564 * makes the FW to send frames via HTT after disassociation.
1565 * No idea why this happens, even though VDEV-DOWN is supposed
1566 * to be analogous to link down, so just stop the VDEV.
1567 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02001568 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d stop (disassociated\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03001569 arvif->vdev_id);
1570
1571 /* FIXME: check return value */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001572 ret = ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001573
1574 /*
1575 * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1576 * report beacons from previously associated network through HTT.
1577 * This in turn would spam mac80211 WARN_ON if we bring down all
1578 * interfaces as it expects there is no rx when no interface is
1579 * running.
1580 */
Michal Kazior7aa7a722014-08-25 12:09:38 +02001581 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d down\n", arvif->vdev_id);
Kalle Valo60c3daa2013-09-08 17:56:07 +03001582
1583 /* FIXME: why don't we print error if wmi call fails? */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001584 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001585
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001586 arvif->def_wep_key_idx = 0;
Michal Kaziorc930f742014-01-23 11:38:25 +01001587
1588 arvif->is_started = false;
1589 arvif->is_up = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001590}
1591
Michal Kazior590922a2014-10-21 10:10:29 +03001592static int ath10k_station_assoc(struct ath10k *ar,
1593 struct ieee80211_vif *vif,
1594 struct ieee80211_sta *sta,
1595 bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001596{
Michal Kazior590922a2014-10-21 10:10:29 +03001597 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valob9ada652013-10-16 15:44:46 +03001598 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001599 int ret = 0;
1600
Michal Kazior548db542013-07-05 16:15:15 +03001601 lockdep_assert_held(&ar->conf_mutex);
1602
Michal Kazior590922a2014-10-21 10:10:29 +03001603 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001604 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001605 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001606 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001607 return ret;
1608 }
1609
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02001610 peer_arg.peer_reassoc = reassoc;
Kalle Valob9ada652013-10-16 15:44:46 +03001611 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1612 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001613 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001614 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001615 return ret;
1616 }
1617
Michal Kaziorb1ecde32014-10-21 10:10:29 +03001618 /* Re-assoc is run only to update supported rates for given station. It
1619 * doesn't make much sense to reconfigure the peer completely.
1620 */
1621 if (!reassoc) {
1622 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
1623 &sta->ht_cap);
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001624 if (ret) {
Michal Kaziorb1ecde32014-10-21 10:10:29 +03001625 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001626 arvif->vdev_id, ret);
1627 return ret;
1628 }
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001629
Michal Kaziorb1ecde32014-10-21 10:10:29 +03001630 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
1631 if (ret) {
1632 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
1633 sta->addr, arvif->vdev_id, ret);
1634 return ret;
1635 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001636
Michal Kaziorb1ecde32014-10-21 10:10:29 +03001637 if (!sta->wme) {
1638 arvif->num_legacy_stations++;
1639 ret = ath10k_recalc_rtscts_prot(arvif);
1640 if (ret) {
1641 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1642 arvif->vdev_id, ret);
1643 return ret;
1644 }
1645 }
1646
1647 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1648 if (ret) {
1649 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
1650 arvif->vdev_id, ret);
1651 return ret;
1652 }
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001653 }
1654
Kalle Valo5e3dd152013-06-12 20:52:10 +03001655 return ret;
1656}
1657
Michal Kazior590922a2014-10-21 10:10:29 +03001658static int ath10k_station_disassoc(struct ath10k *ar,
1659 struct ieee80211_vif *vif,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001660 struct ieee80211_sta *sta)
1661{
Michal Kazior590922a2014-10-21 10:10:29 +03001662 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001663 int ret = 0;
1664
Michal Kazior548db542013-07-05 16:15:15 +03001665 lockdep_assert_held(&ar->conf_mutex);
1666
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001667 if (!sta->wme) {
1668 arvif->num_legacy_stations--;
1669 ret = ath10k_recalc_rtscts_prot(arvif);
1670 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001671 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001672 arvif->vdev_id, ret);
1673 return ret;
1674 }
1675 }
1676
Kalle Valo5e3dd152013-06-12 20:52:10 +03001677 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1678 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001679 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001680 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001681 return ret;
1682 }
1683
1684 return ret;
1685}
1686
1687/**************/
1688/* Regulatory */
1689/**************/
1690
1691static int ath10k_update_channel_list(struct ath10k *ar)
1692{
1693 struct ieee80211_hw *hw = ar->hw;
1694 struct ieee80211_supported_band **bands;
1695 enum ieee80211_band band;
1696 struct ieee80211_channel *channel;
1697 struct wmi_scan_chan_list_arg arg = {0};
1698 struct wmi_channel_arg *ch;
1699 bool passive;
1700 int len;
1701 int ret;
1702 int i;
1703
Michal Kazior548db542013-07-05 16:15:15 +03001704 lockdep_assert_held(&ar->conf_mutex);
1705
Kalle Valo5e3dd152013-06-12 20:52:10 +03001706 bands = hw->wiphy->bands;
1707 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1708 if (!bands[band])
1709 continue;
1710
1711 for (i = 0; i < bands[band]->n_channels; i++) {
1712 if (bands[band]->channels[i].flags &
1713 IEEE80211_CHAN_DISABLED)
1714 continue;
1715
1716 arg.n_channels++;
1717 }
1718 }
1719
1720 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1721 arg.channels = kzalloc(len, GFP_KERNEL);
1722 if (!arg.channels)
1723 return -ENOMEM;
1724
1725 ch = arg.channels;
1726 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1727 if (!bands[band])
1728 continue;
1729
1730 for (i = 0; i < bands[band]->n_channels; i++) {
1731 channel = &bands[band]->channels[i];
1732
1733 if (channel->flags & IEEE80211_CHAN_DISABLED)
1734 continue;
1735
1736 ch->allow_ht = true;
1737
1738 /* FIXME: when should we really allow VHT? */
1739 ch->allow_vht = true;
1740
1741 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001742 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001743
1744 ch->ht40plus =
1745 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1746
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001747 ch->chan_radar =
1748 !!(channel->flags & IEEE80211_CHAN_RADAR);
1749
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001750 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001751 ch->passive = passive;
1752
1753 ch->freq = channel->center_freq;
Michal Kazior2d667212014-09-18 15:21:21 +02001754 ch->band_center_freq1 = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07001755 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07001756 ch->max_power = channel->max_power * 2;
1757 ch->max_reg_power = channel->max_reg_power * 2;
1758 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001759 ch->reg_class_id = 0; /* FIXME */
1760
1761 /* FIXME: why use only legacy modes, why not any
1762 * HT/VHT modes? Would that even make any
1763 * difference? */
1764 if (channel->band == IEEE80211_BAND_2GHZ)
1765 ch->mode = MODE_11G;
1766 else
1767 ch->mode = MODE_11A;
1768
1769 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1770 continue;
1771
Michal Kazior7aa7a722014-08-25 12:09:38 +02001772 ath10k_dbg(ar, ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03001773 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1774 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001775 ch->freq, ch->max_power, ch->max_reg_power,
1776 ch->max_antenna_gain, ch->mode);
1777
1778 ch++;
1779 }
1780 }
1781
1782 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1783 kfree(arg.channels);
1784
1785 return ret;
1786}
1787
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001788static enum wmi_dfs_region
1789ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
1790{
1791 switch (dfs_region) {
1792 case NL80211_DFS_UNSET:
1793 return WMI_UNINIT_DFS_DOMAIN;
1794 case NL80211_DFS_FCC:
1795 return WMI_FCC_DFS_DOMAIN;
1796 case NL80211_DFS_ETSI:
1797 return WMI_ETSI_DFS_DOMAIN;
1798 case NL80211_DFS_JP:
1799 return WMI_MKK4_DFS_DOMAIN;
1800 }
1801 return WMI_UNINIT_DFS_DOMAIN;
1802}
1803
Michal Kaziorf7843d72013-07-16 09:38:52 +02001804static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001805{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001806 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001807 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001808 enum wmi_dfs_region wmi_dfs_reg;
1809 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001810
Michal Kaziorf7843d72013-07-16 09:38:52 +02001811 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001812
1813 ret = ath10k_update_channel_list(ar);
1814 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001815 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001816
1817 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001818
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001819 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1820 nl_dfs_reg = ar->dfs_detector->region;
1821 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
1822 } else {
1823 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
1824 }
1825
Kalle Valo5e3dd152013-06-12 20:52:10 +03001826 /* Target allows setting up per-band regdomain but ath_common provides
1827 * a combined one only */
1828 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02001829 regpair->reg_domain,
1830 regpair->reg_domain, /* 2ghz */
1831 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001832 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001833 regpair->reg_5ghz_ctl,
1834 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001835 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001836 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02001837}
Michal Kazior548db542013-07-05 16:15:15 +03001838
Michal Kaziorf7843d72013-07-16 09:38:52 +02001839static void ath10k_reg_notifier(struct wiphy *wiphy,
1840 struct regulatory_request *request)
1841{
1842 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1843 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001844 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001845
1846 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1847
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001848 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001849 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001850 request->dfs_region);
1851 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1852 request->dfs_region);
1853 if (!result)
Michal Kazior7aa7a722014-08-25 12:09:38 +02001854 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001855 request->dfs_region);
1856 }
1857
Michal Kaziorf7843d72013-07-16 09:38:52 +02001858 mutex_lock(&ar->conf_mutex);
1859 if (ar->state == ATH10K_STATE_ON)
1860 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03001861 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001862}
1863
1864/***************/
1865/* TX handlers */
1866/***************/
1867
Michal Kazior42c3aa62013-10-02 11:03:38 +02001868static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1869{
1870 if (ieee80211_is_mgmt(hdr->frame_control))
1871 return HTT_DATA_TX_EXT_TID_MGMT;
1872
1873 if (!ieee80211_is_data_qos(hdr->frame_control))
1874 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1875
1876 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1877 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1878
1879 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1880}
1881
Michal Kazior2b37c292014-09-02 11:00:22 +03001882static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001883{
Michal Kazior2b37c292014-09-02 11:00:22 +03001884 if (vif)
1885 return ath10k_vif_to_arvif(vif)->vdev_id;
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001886
Michal Kazior1bbc0972014-04-08 09:45:47 +03001887 if (ar->monitor_started)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001888 return ar->monitor_vdev_id;
1889
Michal Kazior7aa7a722014-08-25 12:09:38 +02001890 ath10k_warn(ar, "failed to resolve vdev id\n");
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001891 return 0;
1892}
1893
Michal Kazior4b604552014-07-21 21:03:09 +03001894/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
1895 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03001896 */
Michal Kazior4b604552014-07-21 21:03:09 +03001897static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001898{
1899 struct ieee80211_hdr *hdr = (void *)skb->data;
Michal Kaziorc21c64d2014-07-21 21:03:10 +03001900 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001901 u8 *qos_ctl;
1902
1903 if (!ieee80211_is_data_qos(hdr->frame_control))
1904 return;
1905
1906 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02001907 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1908 skb->data, (void *)qos_ctl - (void *)skb->data);
1909 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Michal Kaziorc21c64d2014-07-21 21:03:10 +03001910
1911 /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc
1912 * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are
1913 * used only for CQM purposes (e.g. hostapd station keepalive ping) so
1914 * it is safe to downgrade to NullFunc.
1915 */
1916 if (ieee80211_is_qos_nullfunc(hdr->frame_control)) {
1917 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
1918 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1919 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001920}
1921
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001922static void ath10k_tx_wep_key_work(struct work_struct *work)
1923{
1924 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1925 wep_key_work);
Michal Kazior7aa7a722014-08-25 12:09:38 +02001926 struct ath10k *ar = arvif->ar;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001927 int ret, keyidx = arvif->def_wep_key_newidx;
1928
Michal Kazior911e6c02014-05-26 12:46:03 +03001929 mutex_lock(&arvif->ar->conf_mutex);
1930
1931 if (arvif->ar->state != ATH10K_STATE_ON)
1932 goto unlock;
1933
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001934 if (arvif->def_wep_key_idx == keyidx)
Michal Kazior911e6c02014-05-26 12:46:03 +03001935 goto unlock;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001936
Michal Kazior7aa7a722014-08-25 12:09:38 +02001937 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001938 arvif->vdev_id, keyidx);
1939
1940 ret = ath10k_wmi_vdev_set_param(arvif->ar,
1941 arvif->vdev_id,
1942 arvif->ar->wmi.vdev_param->def_keyid,
1943 keyidx);
1944 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001945 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02001946 arvif->vdev_id,
1947 ret);
Michal Kazior911e6c02014-05-26 12:46:03 +03001948 goto unlock;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001949 }
1950
1951 arvif->def_wep_key_idx = keyidx;
Michal Kazior911e6c02014-05-26 12:46:03 +03001952
1953unlock:
1954 mutex_unlock(&arvif->ar->conf_mutex);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001955}
1956
Michal Kazior4b604552014-07-21 21:03:09 +03001957static void ath10k_tx_h_update_wep_key(struct ieee80211_vif *vif,
1958 struct ieee80211_key_conf *key,
1959 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001960{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001961 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1962 struct ath10k *ar = arvif->ar;
1963 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001964
Kalle Valo5e3dd152013-06-12 20:52:10 +03001965 if (!ieee80211_has_protected(hdr->frame_control))
1966 return;
1967
1968 if (!key)
1969 return;
1970
1971 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1972 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1973 return;
1974
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001975 if (key->keyidx == arvif->def_wep_key_idx)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001976 return;
1977
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001978 /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1979 * queueing frames until key index is updated is not an option because
1980 * sk_buff may need more processing to be done, e.g. offchannel */
1981 arvif->def_wep_key_newidx = key->keyidx;
1982 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001983}
1984
Michal Kazior4b604552014-07-21 21:03:09 +03001985static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
1986 struct ieee80211_vif *vif,
1987 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001988{
1989 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001990 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1991
1992 /* This is case only for P2P_GO */
1993 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1994 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1995 return;
1996
1997 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1998 spin_lock_bh(&ar->data_lock);
1999 if (arvif->u.ap.noa_data)
2000 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
2001 GFP_ATOMIC))
2002 memcpy(skb_put(skb, arvif->u.ap.noa_len),
2003 arvif->u.ap.noa_data,
2004 arvif->u.ap.noa_len);
2005 spin_unlock_bh(&ar->data_lock);
2006 }
2007}
2008
2009static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
2010{
2011 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002012 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002013
Michal Kazior961d4c32013-08-09 10:13:34 +02002014 if (ar->htt.target_version_major >= 3) {
2015 /* Since HTT 3.0 there is no separate mgmt tx command */
2016 ret = ath10k_htt_tx(&ar->htt, skb);
2017 goto exit;
2018 }
2019
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002020 if (ieee80211_is_mgmt(hdr->frame_control)) {
2021 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2022 ar->fw_features)) {
2023 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
2024 ATH10K_MAX_NUM_MGMT_PENDING) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002025 ath10k_warn(ar, "reached WMI management transmit queue limit\n");
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002026 ret = -EBUSY;
2027 goto exit;
2028 }
2029
2030 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
2031 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
2032 } else {
2033 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2034 }
2035 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2036 ar->fw_features) &&
2037 ieee80211_is_nullfunc(hdr->frame_control)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002038 /* FW does not report tx status properly for NullFunc frames
2039 * unless they are sent through mgmt tx path. mac80211 sends
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002040 * those frames when it detects link/beacon loss and depends
2041 * on the tx status to be correct. */
Michal Kazioredb82362013-07-05 16:15:14 +03002042 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002043 } else {
Michal Kazioredb82362013-07-05 16:15:14 +03002044 ret = ath10k_htt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002045 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002046
Michal Kazior961d4c32013-08-09 10:13:34 +02002047exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03002048 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002049 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
2050 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002051 ieee80211_free_txskb(ar->hw, skb);
2052 }
2053}
2054
2055void ath10k_offchan_tx_purge(struct ath10k *ar)
2056{
2057 struct sk_buff *skb;
2058
2059 for (;;) {
2060 skb = skb_dequeue(&ar->offchan_tx_queue);
2061 if (!skb)
2062 break;
2063
2064 ieee80211_free_txskb(ar->hw, skb);
2065 }
2066}
2067
2068void ath10k_offchan_tx_work(struct work_struct *work)
2069{
2070 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
2071 struct ath10k_peer *peer;
2072 struct ieee80211_hdr *hdr;
2073 struct sk_buff *skb;
2074 const u8 *peer_addr;
2075 int vdev_id;
2076 int ret;
2077
2078 /* FW requirement: We must create a peer before FW will send out
2079 * an offchannel frame. Otherwise the frame will be stuck and
2080 * never transmitted. We delete the peer upon tx completion.
2081 * It is unlikely that a peer for offchannel tx will already be
2082 * present. However it may be in some rare cases so account for that.
2083 * Otherwise we might remove a legitimate peer and break stuff. */
2084
2085 for (;;) {
2086 skb = skb_dequeue(&ar->offchan_tx_queue);
2087 if (!skb)
2088 break;
2089
2090 mutex_lock(&ar->conf_mutex);
2091
Michal Kazior7aa7a722014-08-25 12:09:38 +02002092 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002093 skb);
2094
2095 hdr = (struct ieee80211_hdr *)skb->data;
2096 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002097 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002098
2099 spin_lock_bh(&ar->data_lock);
2100 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
2101 spin_unlock_bh(&ar->data_lock);
2102
2103 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03002104 /* FIXME: should this use ath10k_warn()? */
Michal Kazior7aa7a722014-08-25 12:09:38 +02002105 ath10k_dbg(ar, ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002106 peer_addr, vdev_id);
2107
2108 if (!peer) {
2109 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
2110 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002111 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002112 peer_addr, vdev_id, ret);
2113 }
2114
2115 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08002116 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002117 ar->offchan_tx_skb = skb;
2118 spin_unlock_bh(&ar->data_lock);
2119
2120 ath10k_tx_htt(ar, skb);
2121
2122 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
2123 3 * HZ);
2124 if (ret <= 0)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002125 ath10k_warn(ar, "timed out waiting for offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002126 skb);
2127
2128 if (!peer) {
2129 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
2130 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002131 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002132 peer_addr, vdev_id, ret);
2133 }
2134
2135 mutex_unlock(&ar->conf_mutex);
2136 }
2137}
2138
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002139void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
2140{
2141 struct sk_buff *skb;
2142
2143 for (;;) {
2144 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2145 if (!skb)
2146 break;
2147
2148 ieee80211_free_txskb(ar->hw, skb);
2149 }
2150}
2151
2152void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
2153{
2154 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
2155 struct sk_buff *skb;
2156 int ret;
2157
2158 for (;;) {
2159 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2160 if (!skb)
2161 break;
2162
2163 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002164 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002165 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
Kalle Valobe6546f2014-03-25 14:18:51 +02002166 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002167 ieee80211_free_txskb(ar->hw, skb);
2168 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002169 }
2170}
2171
Kalle Valo5e3dd152013-06-12 20:52:10 +03002172/************/
2173/* Scanning */
2174/************/
2175
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002176void __ath10k_scan_finish(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002177{
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002178 lockdep_assert_held(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002179
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002180 switch (ar->scan.state) {
2181 case ATH10K_SCAN_IDLE:
2182 break;
2183 case ATH10K_SCAN_RUNNING:
2184 case ATH10K_SCAN_ABORTING:
2185 if (ar->scan.is_roc)
2186 ieee80211_remain_on_channel_expired(ar->hw);
2187 else
2188 ieee80211_scan_completed(ar->hw,
2189 (ar->scan.state ==
2190 ATH10K_SCAN_ABORTING));
2191 /* fall through */
2192 case ATH10K_SCAN_STARTING:
2193 ar->scan.state = ATH10K_SCAN_IDLE;
2194 ar->scan_channel = NULL;
2195 ath10k_offchan_tx_purge(ar);
2196 cancel_delayed_work(&ar->scan.timeout);
2197 complete_all(&ar->scan.completed);
2198 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002199 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002200}
Kalle Valo5e3dd152013-06-12 20:52:10 +03002201
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002202void ath10k_scan_finish(struct ath10k *ar)
2203{
2204 spin_lock_bh(&ar->data_lock);
2205 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002206 spin_unlock_bh(&ar->data_lock);
2207}
2208
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002209static int ath10k_scan_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002210{
2211 struct wmi_stop_scan_arg arg = {
2212 .req_id = 1, /* FIXME */
2213 .req_type = WMI_SCAN_STOP_ONE,
2214 .u.scan_id = ATH10K_SCAN_ID,
2215 };
2216 int ret;
2217
2218 lockdep_assert_held(&ar->conf_mutex);
2219
Kalle Valo5e3dd152013-06-12 20:52:10 +03002220 ret = ath10k_wmi_stop_scan(ar, &arg);
2221 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002222 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002223 goto out;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002224 }
2225
Kalle Valo5e3dd152013-06-12 20:52:10 +03002226 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002227 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002228 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002229 ret = -ETIMEDOUT;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002230 } else if (ret > 0) {
2231 ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002232 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002233
2234out:
2235 /* Scan state should be updated upon scan completion but in case
2236 * firmware fails to deliver the event (for whatever reason) it is
2237 * desired to clean up scan state anyway. Firmware may have just
2238 * dropped the scan completion event delivery due to transport pipe
2239 * being overflown with data and/or it can recover on its own before
2240 * next scan request is submitted.
2241 */
2242 spin_lock_bh(&ar->data_lock);
2243 if (ar->scan.state != ATH10K_SCAN_IDLE)
2244 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002245 spin_unlock_bh(&ar->data_lock);
2246
2247 return ret;
2248}
2249
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002250static void ath10k_scan_abort(struct ath10k *ar)
2251{
2252 int ret;
2253
2254 lockdep_assert_held(&ar->conf_mutex);
2255
2256 spin_lock_bh(&ar->data_lock);
2257
2258 switch (ar->scan.state) {
2259 case ATH10K_SCAN_IDLE:
2260 /* This can happen if timeout worker kicked in and called
2261 * abortion while scan completion was being processed.
2262 */
2263 break;
2264 case ATH10K_SCAN_STARTING:
2265 case ATH10K_SCAN_ABORTING:
Michal Kazior7aa7a722014-08-25 12:09:38 +02002266 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002267 ath10k_scan_state_str(ar->scan.state),
2268 ar->scan.state);
2269 break;
2270 case ATH10K_SCAN_RUNNING:
2271 ar->scan.state = ATH10K_SCAN_ABORTING;
2272 spin_unlock_bh(&ar->data_lock);
2273
2274 ret = ath10k_scan_stop(ar);
2275 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002276 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002277
2278 spin_lock_bh(&ar->data_lock);
2279 break;
2280 }
2281
2282 spin_unlock_bh(&ar->data_lock);
2283}
2284
2285void ath10k_scan_timeout_work(struct work_struct *work)
2286{
2287 struct ath10k *ar = container_of(work, struct ath10k,
2288 scan.timeout.work);
2289
2290 mutex_lock(&ar->conf_mutex);
2291 ath10k_scan_abort(ar);
2292 mutex_unlock(&ar->conf_mutex);
2293}
2294
Kalle Valo5e3dd152013-06-12 20:52:10 +03002295static int ath10k_start_scan(struct ath10k *ar,
2296 const struct wmi_start_scan_arg *arg)
2297{
2298 int ret;
2299
2300 lockdep_assert_held(&ar->conf_mutex);
2301
2302 ret = ath10k_wmi_start_scan(ar, arg);
2303 if (ret)
2304 return ret;
2305
Kalle Valo5e3dd152013-06-12 20:52:10 +03002306 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2307 if (ret == 0) {
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002308 ret = ath10k_scan_stop(ar);
2309 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002310 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002311
2312 return -ETIMEDOUT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002313 }
2314
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002315 /* Add a 200ms margin to account for event/command processing */
2316 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
2317 msecs_to_jiffies(arg->max_scan_time+200));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002318 return 0;
2319}
2320
2321/**********************/
2322/* mac80211 callbacks */
2323/**********************/
2324
2325static void ath10k_tx(struct ieee80211_hw *hw,
2326 struct ieee80211_tx_control *control,
2327 struct sk_buff *skb)
2328{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002329 struct ath10k *ar = hw->priv;
Michal Kazior4b604552014-07-21 21:03:09 +03002330 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2331 struct ieee80211_vif *vif = info->control.vif;
2332 struct ieee80211_key_conf *key = info->control.hw_key;
2333 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002334
2335 /* We should disable CCK RATE due to P2P */
2336 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002337 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002338
Michal Kazior4b604552014-07-21 21:03:09 +03002339 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2340 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
Michal Kazior2b37c292014-09-02 11:00:22 +03002341 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002342
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002343 /* it makes no sense to process injected frames like that */
Michal Kazior4b604552014-07-21 21:03:09 +03002344 if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
2345 ath10k_tx_h_nwifi(hw, skb);
2346 ath10k_tx_h_update_wep_key(vif, key, skb);
2347 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
2348 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002349 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002350
Kalle Valo5e3dd152013-06-12 20:52:10 +03002351 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2352 spin_lock_bh(&ar->data_lock);
2353 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002354 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002355 spin_unlock_bh(&ar->data_lock);
2356
Michal Kazior7aa7a722014-08-25 12:09:38 +02002357 ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
2358 skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002359
2360 skb_queue_tail(&ar->offchan_tx_queue, skb);
2361 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2362 return;
2363 }
2364
2365 ath10k_tx_htt(ar, skb);
2366}
2367
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002368/* Must not be called with conf_mutex held as workers can use that also. */
2369static void ath10k_drain_tx(struct ath10k *ar)
2370{
2371 /* make sure rcu-protected mac80211 tx path itself is drained */
2372 synchronize_net();
2373
2374 ath10k_offchan_tx_purge(ar);
2375 ath10k_mgmt_over_wmi_tx_purge(ar);
2376
2377 cancel_work_sync(&ar->offchan_tx_work);
2378 cancel_work_sync(&ar->wmi_mgmt_tx_work);
2379}
2380
Michal Kazioraffd3212013-07-16 09:54:35 +02002381void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02002382{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03002383 struct ath10k_vif *arvif;
2384
Michal Kazior818bdd12013-07-16 09:38:57 +02002385 lockdep_assert_held(&ar->conf_mutex);
2386
Michal Kazior19337472014-08-28 12:58:16 +02002387 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
2388 ar->filter_flags = 0;
2389 ar->monitor = false;
2390
2391 if (ar->monitor_started)
Michal Kazior1bbc0972014-04-08 09:45:47 +03002392 ath10k_monitor_stop(ar);
Michal Kazior19337472014-08-28 12:58:16 +02002393
2394 ar->monitor_started = false;
Michal Kazior1bbc0972014-04-08 09:45:47 +03002395
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002396 ath10k_scan_finish(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02002397 ath10k_peer_cleanup_all(ar);
2398 ath10k_core_stop(ar);
2399 ath10k_hif_power_down(ar);
2400
2401 spin_lock_bh(&ar->data_lock);
Michal Kazior64badcb2014-09-18 11:18:02 +03002402 list_for_each_entry(arvif, &ar->arvifs, list)
2403 ath10k_mac_vif_beacon_cleanup(arvif);
Michal Kazior818bdd12013-07-16 09:38:57 +02002404 spin_unlock_bh(&ar->data_lock);
2405}
2406
Ben Greear46acf7b2014-05-16 17:15:38 +03002407static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
2408{
2409 struct ath10k *ar = hw->priv;
2410
2411 mutex_lock(&ar->conf_mutex);
2412
2413 if (ar->cfg_tx_chainmask) {
2414 *tx_ant = ar->cfg_tx_chainmask;
2415 *rx_ant = ar->cfg_rx_chainmask;
2416 } else {
2417 *tx_ant = ar->supp_tx_chainmask;
2418 *rx_ant = ar->supp_rx_chainmask;
2419 }
2420
2421 mutex_unlock(&ar->conf_mutex);
2422
2423 return 0;
2424}
2425
2426static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
2427{
2428 int ret;
2429
2430 lockdep_assert_held(&ar->conf_mutex);
2431
2432 ar->cfg_tx_chainmask = tx_ant;
2433 ar->cfg_rx_chainmask = rx_ant;
2434
2435 if ((ar->state != ATH10K_STATE_ON) &&
2436 (ar->state != ATH10K_STATE_RESTARTED))
2437 return 0;
2438
2439 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
2440 tx_ant);
2441 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002442 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03002443 ret, tx_ant);
2444 return ret;
2445 }
2446
2447 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
2448 rx_ant);
2449 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002450 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
Ben Greear46acf7b2014-05-16 17:15:38 +03002451 ret, rx_ant);
2452 return ret;
2453 }
2454
2455 return 0;
2456}
2457
2458static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
2459{
2460 struct ath10k *ar = hw->priv;
2461 int ret;
2462
2463 mutex_lock(&ar->conf_mutex);
2464 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
2465 mutex_unlock(&ar->conf_mutex);
2466 return ret;
2467}
2468
Kalle Valo5e3dd152013-06-12 20:52:10 +03002469static int ath10k_start(struct ieee80211_hw *hw)
2470{
2471 struct ath10k *ar = hw->priv;
Michal Kazior818bdd12013-07-16 09:38:57 +02002472 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002473
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002474 /*
2475 * This makes sense only when restarting hw. It is harmless to call
2476 * uncoditionally. This is necessary to make sure no HTT/WMI tx
2477 * commands will be submitted while restarting.
2478 */
2479 ath10k_drain_tx(ar);
2480
Michal Kazior548db542013-07-05 16:15:15 +03002481 mutex_lock(&ar->conf_mutex);
2482
Michal Kaziorc5058f52014-05-26 12:46:03 +03002483 switch (ar->state) {
2484 case ATH10K_STATE_OFF:
2485 ar->state = ATH10K_STATE_ON;
2486 break;
2487 case ATH10K_STATE_RESTARTING:
2488 ath10k_halt(ar);
2489 ar->state = ATH10K_STATE_RESTARTED;
2490 break;
2491 case ATH10K_STATE_ON:
2492 case ATH10K_STATE_RESTARTED:
2493 case ATH10K_STATE_WEDGED:
2494 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02002495 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03002496 goto err;
Kalle Valo43d2a302014-09-10 18:23:30 +03002497 case ATH10K_STATE_UTF:
2498 ret = -EBUSY;
2499 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02002500 }
2501
2502 ret = ath10k_hif_power_up(ar);
2503 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002504 ath10k_err(ar, "Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002505 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02002506 }
2507
Kalle Valo43d2a302014-09-10 18:23:30 +03002508 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
Michal Kazior818bdd12013-07-16 09:38:57 +02002509 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002510 ath10k_err(ar, "Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002511 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02002512 }
2513
Bartosz Markowski226a3392013-09-26 17:47:16 +02002514 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03002515 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002516 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002517 goto err_core_stop;
2518 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002519
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01002520 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03002521 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002522 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002523 goto err_core_stop;
2524 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002525
Ben Greear46acf7b2014-05-16 17:15:38 +03002526 if (ar->cfg_tx_chainmask)
2527 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
2528 ar->cfg_rx_chainmask);
2529
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002530 /*
2531 * By default FW set ARP frames ac to voice (6). In that case ARP
2532 * exchange is not working properly for UAPSD enabled AP. ARP requests
2533 * which arrives with access category 0 are processed by network stack
2534 * and send back with access category 0, but FW changes access category
2535 * to 6. Set ARP frames access category to best effort (0) solves
2536 * this problem.
2537 */
2538
2539 ret = ath10k_wmi_pdev_set_param(ar,
2540 ar->wmi.pdev_param->arp_ac_override, 0);
2541 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002542 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002543 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002544 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002545 }
2546
Michal Kaziord6500972014-04-08 09:56:09 +03002547 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002548 ath10k_regd_update(ar);
2549
Simon Wunderlich855aed12014-08-02 09:12:54 +03002550 ath10k_spectral_start(ar);
2551
Michal Kaziorae254432014-05-26 12:46:02 +03002552 mutex_unlock(&ar->conf_mutex);
2553 return 0;
2554
2555err_core_stop:
2556 ath10k_core_stop(ar);
2557
2558err_power_down:
2559 ath10k_hif_power_down(ar);
2560
2561err_off:
2562 ar->state = ATH10K_STATE_OFF;
2563
2564err:
Michal Kazior548db542013-07-05 16:15:15 +03002565 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01002566 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002567}
2568
2569static void ath10k_stop(struct ieee80211_hw *hw)
2570{
2571 struct ath10k *ar = hw->priv;
2572
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002573 ath10k_drain_tx(ar);
2574
Michal Kazior548db542013-07-05 16:15:15 +03002575 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03002576 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02002577 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03002578 ar->state = ATH10K_STATE_OFF;
2579 }
Michal Kazior548db542013-07-05 16:15:15 +03002580 mutex_unlock(&ar->conf_mutex);
2581
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002582 cancel_delayed_work_sync(&ar->scan.timeout);
Michal Kazioraffd3212013-07-16 09:54:35 +02002583 cancel_work_sync(&ar->restart_work);
2584}
2585
Michal Kaziorad088bf2013-10-16 15:44:46 +03002586static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02002587{
Michal Kaziorad088bf2013-10-16 15:44:46 +03002588 struct ath10k_vif *arvif;
2589 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02002590
2591 lockdep_assert_held(&ar->conf_mutex);
2592
Michal Kaziorad088bf2013-10-16 15:44:46 +03002593 list_for_each_entry(arvif, &ar->arvifs, list) {
2594 ret = ath10k_mac_vif_setup_ps(arvif);
2595 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002596 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03002597 break;
2598 }
2599 }
Michal Kazioraffd3212013-07-16 09:54:35 +02002600
Michal Kaziorad088bf2013-10-16 15:44:46 +03002601 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002602}
2603
Michal Kaziorc930f742014-01-23 11:38:25 +01002604static const char *chandef_get_width(enum nl80211_chan_width width)
2605{
2606 switch (width) {
2607 case NL80211_CHAN_WIDTH_20_NOHT:
2608 return "20 (noht)";
2609 case NL80211_CHAN_WIDTH_20:
2610 return "20";
2611 case NL80211_CHAN_WIDTH_40:
2612 return "40";
2613 case NL80211_CHAN_WIDTH_80:
2614 return "80";
2615 case NL80211_CHAN_WIDTH_80P80:
2616 return "80+80";
2617 case NL80211_CHAN_WIDTH_160:
2618 return "160";
2619 case NL80211_CHAN_WIDTH_5:
2620 return "5";
2621 case NL80211_CHAN_WIDTH_10:
2622 return "10";
2623 }
2624 return "?";
2625}
2626
2627static void ath10k_config_chan(struct ath10k *ar)
2628{
2629 struct ath10k_vif *arvif;
Michal Kaziorc930f742014-01-23 11:38:25 +01002630 int ret;
2631
2632 lockdep_assert_held(&ar->conf_mutex);
2633
Michal Kazior7aa7a722014-08-25 12:09:38 +02002634 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kaziorc930f742014-01-23 11:38:25 +01002635 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2636 ar->chandef.chan->center_freq,
2637 ar->chandef.center_freq1,
2638 ar->chandef.center_freq2,
2639 chandef_get_width(ar->chandef.width));
2640
2641 /* First stop monitor interface. Some FW versions crash if there's a
2642 * lone monitor interface. */
Michal Kazior1bbc0972014-04-08 09:45:47 +03002643 if (ar->monitor_started)
Michal Kazior19337472014-08-28 12:58:16 +02002644 ath10k_monitor_stop(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002645
2646 list_for_each_entry(arvif, &ar->arvifs, list) {
2647 if (!arvif->is_started)
2648 continue;
2649
Michal Kaziordc55e302014-07-29 12:53:36 +03002650 if (!arvif->is_up)
2651 continue;
2652
Michal Kaziorc930f742014-01-23 11:38:25 +01002653 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2654 continue;
2655
Michal Kaziordc55e302014-07-29 12:53:36 +03002656 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kaziorc930f742014-01-23 11:38:25 +01002657 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002658 ath10k_warn(ar, "failed to down vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002659 arvif->vdev_id, ret);
2660 continue;
2661 }
2662 }
2663
Michal Kaziordc55e302014-07-29 12:53:36 +03002664 /* all vdevs are downed now - attempt to restart and re-up them */
Michal Kaziorc930f742014-01-23 11:38:25 +01002665
2666 list_for_each_entry(arvif, &ar->arvifs, list) {
2667 if (!arvif->is_started)
2668 continue;
2669
2670 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2671 continue;
2672
Michal Kaziordc55e302014-07-29 12:53:36 +03002673 ret = ath10k_vdev_restart(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +01002674 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002675 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002676 arvif->vdev_id, ret);
2677 continue;
2678 }
2679
2680 if (!arvif->is_up)
2681 continue;
2682
2683 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
2684 arvif->bssid);
2685 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002686 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002687 arvif->vdev_id, ret);
2688 continue;
2689 }
2690 }
2691
Michal Kazior19337472014-08-28 12:58:16 +02002692 ath10k_monitor_recalc(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002693}
2694
Kalle Valo5e3dd152013-06-12 20:52:10 +03002695static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2696{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002697 struct ath10k *ar = hw->priv;
2698 struct ieee80211_conf *conf = &hw->conf;
2699 int ret = 0;
Michal Kazior5474efe2013-10-23 04:02:15 -07002700 u32 param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002701
2702 mutex_lock(&ar->conf_mutex);
2703
2704 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002705 ath10k_dbg(ar, ATH10K_DBG_MAC,
Michal Kaziord6500972014-04-08 09:56:09 +03002706 "mac config channel %dMHz flags 0x%x radar %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002707 conf->chandef.chan->center_freq,
Michal Kaziord6500972014-04-08 09:56:09 +03002708 conf->chandef.chan->flags,
2709 conf->radar_enabled);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002710
Kalle Valo5e3dd152013-06-12 20:52:10 +03002711 spin_lock_bh(&ar->data_lock);
2712 ar->rx_channel = conf->chandef.chan;
2713 spin_unlock_bh(&ar->data_lock);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002714
Michal Kaziord6500972014-04-08 09:56:09 +03002715 ar->radar_enabled = conf->radar_enabled;
2716 ath10k_recalc_radar_detection(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002717
2718 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
2719 ar->chandef = conf->chandef;
2720 ath10k_config_chan(ar);
2721 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002722 }
2723
Michal Kazior5474efe2013-10-23 04:02:15 -07002724 if (changed & IEEE80211_CONF_CHANGE_POWER) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002725 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac config power %d\n",
Michal Kazior5474efe2013-10-23 04:02:15 -07002726 hw->conf.power_level);
2727
2728 param = ar->wmi.pdev_param->txpower_limit2g;
2729 ret = ath10k_wmi_pdev_set_param(ar, param,
2730 hw->conf.power_level * 2);
2731 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002732 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
Michal Kazior5474efe2013-10-23 04:02:15 -07002733 hw->conf.power_level, ret);
2734
2735 param = ar->wmi.pdev_param->txpower_limit5g;
2736 ret = ath10k_wmi_pdev_set_param(ar, param,
2737 hw->conf.power_level * 2);
2738 if (ret)
Michal Kazior7aa7a722014-08-25 12:09:38 +02002739 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
Michal Kazior5474efe2013-10-23 04:02:15 -07002740 hw->conf.power_level, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002741 }
2742
Michal Kazioraffd3212013-07-16 09:54:35 +02002743 if (changed & IEEE80211_CONF_CHANGE_PS)
2744 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002745
2746 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior19337472014-08-28 12:58:16 +02002747 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
2748 ret = ath10k_monitor_recalc(ar);
2749 if (ret)
2750 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002751 }
2752
2753 mutex_unlock(&ar->conf_mutex);
2754 return ret;
2755}
2756
2757/*
2758 * TODO:
2759 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2760 * because we will send mgmt frames without CCK. This requirement
2761 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2762 * in the TX packet.
2763 */
2764static int ath10k_add_interface(struct ieee80211_hw *hw,
2765 struct ieee80211_vif *vif)
2766{
2767 struct ath10k *ar = hw->priv;
2768 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2769 enum wmi_sta_powersave_param param;
2770 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02002771 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002772 int bit;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002773 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002774
2775 mutex_lock(&ar->conf_mutex);
2776
Michal Kazior0dbd09e2013-07-31 10:55:14 +02002777 memset(arvif, 0, sizeof(*arvif));
2778
Kalle Valo5e3dd152013-06-12 20:52:10 +03002779 arvif->ar = ar;
2780 arvif->vif = vif;
2781
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002782 INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
Ben Greeare63b33f2013-10-22 14:54:14 -07002783 INIT_LIST_HEAD(&arvif->list);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002784
Ben Greeara9aefb32014-08-12 11:02:19 +03002785 if (ar->free_vdev_map == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02002786 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002787 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03002788 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002789 }
Ben Greear16c11172014-09-23 14:17:16 -07002790 bit = __ffs64(ar->free_vdev_map);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002791
Ben Greear16c11172014-09-23 14:17:16 -07002792 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
2793 bit, ar->free_vdev_map);
2794
2795 arvif->vdev_id = bit;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002796 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,
Rajkumar Manoharan82d7aba2014-10-10 17:38:27 +05302846 GFP_ATOMIC);
Michal Kazior64badcb2014-09-18 11:18:02 +03002847 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 Kazior9dad14a2013-10-16 15:44:45 +03002864 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002865 }
2866
Ben Greear16c11172014-09-23 14:17:16 -07002867 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002868 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Kazior9dad14a2013-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 Greear16c11172014-09-23 14:17:16 -07002960 ar->free_vdev_map |= 1LL << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03002961 list_del(&arvif->list);
Michal Kazior9dad14a2013-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 Kazior9dad14a2013-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 Greear16c11172014-09-23 14:17:16 -07002995 ar->free_vdev_map |= 1LL << 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. Linvilleb70727e2013-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)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003126 if (vif->type == NL80211_IFTYPE_STATION) {
Janusz Dziedzic3c7984e2014-10-02 13:56:40 +02003127 ath10k_dbg(ar, ATH10K_DBG_MAC,
3128 "mac vdev %d create peer %pM\n",
3129 arvif->vdev_id, info->bssid);
3130
3131 ret = ath10k_peer_create(ar, arvif->vdev_id,
3132 info->bssid);
3133 if (ret)
3134 ath10k_warn(ar, "failed to add peer %pM for vdev %d when changing bssid: %i\n",
3135 info->bssid, arvif->vdev_id,
3136 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003137 /*
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
Michal Kazior590922a2014-10-21 10:10:29 +03003504 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003505 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
Michal Kazior590922a2014-10-21 10:10:29 +03003590 ret = ath10k_station_assoc(ar, vif, 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
Michal Kazior590922a2014-10-21 10:10:29 +03003604 ret = ath10k_station_disassoc(ar, vif, sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003605 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 Greear46acf7b2014-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,
Ben Greear6cddcc72014-09-29 14:41:46 +03004507 .get_et_sset_count = ath10k_debug_get_et_sset_count,
4508 .get_et_stats = ath10k_debug_get_et_stats,
4509 .get_et_strings = ath10k_debug_get_et_strings,
Kalle Valo43d2a302014-09-10 18:23:30 +03004510
4511 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
4512
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004513#ifdef CONFIG_PM
4514 .suspend = ath10k_suspend,
4515 .resume = ath10k_resume,
4516#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03004517};
4518
4519#define RATETAB_ENT(_rate, _rateid, _flags) { \
4520 .bitrate = (_rate), \
4521 .flags = (_flags), \
4522 .hw_value = (_rateid), \
4523}
4524
4525#define CHAN2G(_channel, _freq, _flags) { \
4526 .band = IEEE80211_BAND_2GHZ, \
4527 .hw_value = (_channel), \
4528 .center_freq = (_freq), \
4529 .flags = (_flags), \
4530 .max_antenna_gain = 0, \
4531 .max_power = 30, \
4532}
4533
4534#define CHAN5G(_channel, _freq, _flags) { \
4535 .band = IEEE80211_BAND_5GHZ, \
4536 .hw_value = (_channel), \
4537 .center_freq = (_freq), \
4538 .flags = (_flags), \
4539 .max_antenna_gain = 0, \
4540 .max_power = 30, \
4541}
4542
4543static const struct ieee80211_channel ath10k_2ghz_channels[] = {
4544 CHAN2G(1, 2412, 0),
4545 CHAN2G(2, 2417, 0),
4546 CHAN2G(3, 2422, 0),
4547 CHAN2G(4, 2427, 0),
4548 CHAN2G(5, 2432, 0),
4549 CHAN2G(6, 2437, 0),
4550 CHAN2G(7, 2442, 0),
4551 CHAN2G(8, 2447, 0),
4552 CHAN2G(9, 2452, 0),
4553 CHAN2G(10, 2457, 0),
4554 CHAN2G(11, 2462, 0),
4555 CHAN2G(12, 2467, 0),
4556 CHAN2G(13, 2472, 0),
4557 CHAN2G(14, 2484, 0),
4558};
4559
4560static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02004561 CHAN5G(36, 5180, 0),
4562 CHAN5G(40, 5200, 0),
4563 CHAN5G(44, 5220, 0),
4564 CHAN5G(48, 5240, 0),
4565 CHAN5G(52, 5260, 0),
4566 CHAN5G(56, 5280, 0),
4567 CHAN5G(60, 5300, 0),
4568 CHAN5G(64, 5320, 0),
4569 CHAN5G(100, 5500, 0),
4570 CHAN5G(104, 5520, 0),
4571 CHAN5G(108, 5540, 0),
4572 CHAN5G(112, 5560, 0),
4573 CHAN5G(116, 5580, 0),
4574 CHAN5G(120, 5600, 0),
4575 CHAN5G(124, 5620, 0),
4576 CHAN5G(128, 5640, 0),
4577 CHAN5G(132, 5660, 0),
4578 CHAN5G(136, 5680, 0),
4579 CHAN5G(140, 5700, 0),
4580 CHAN5G(149, 5745, 0),
4581 CHAN5G(153, 5765, 0),
4582 CHAN5G(157, 5785, 0),
4583 CHAN5G(161, 5805, 0),
4584 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03004585};
4586
4587static struct ieee80211_rate ath10k_rates[] = {
4588 /* CCK */
4589 RATETAB_ENT(10, 0x82, 0),
4590 RATETAB_ENT(20, 0x84, 0),
4591 RATETAB_ENT(55, 0x8b, 0),
4592 RATETAB_ENT(110, 0x96, 0),
4593 /* OFDM */
4594 RATETAB_ENT(60, 0x0c, 0),
4595 RATETAB_ENT(90, 0x12, 0),
4596 RATETAB_ENT(120, 0x18, 0),
4597 RATETAB_ENT(180, 0x24, 0),
4598 RATETAB_ENT(240, 0x30, 0),
4599 RATETAB_ENT(360, 0x48, 0),
4600 RATETAB_ENT(480, 0x60, 0),
4601 RATETAB_ENT(540, 0x6c, 0),
4602};
4603
4604#define ath10k_a_rates (ath10k_rates + 4)
4605#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
4606#define ath10k_g_rates (ath10k_rates + 0)
4607#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
4608
Michal Kaziore7b54192014-08-07 11:03:27 +02004609struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004610{
4611 struct ieee80211_hw *hw;
4612 struct ath10k *ar;
4613
Michal Kaziore7b54192014-08-07 11:03:27 +02004614 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004615 if (!hw)
4616 return NULL;
4617
4618 ar = hw->priv;
4619 ar->hw = hw;
4620
4621 return ar;
4622}
4623
4624void ath10k_mac_destroy(struct ath10k *ar)
4625{
4626 ieee80211_free_hw(ar->hw);
4627}
4628
4629static const struct ieee80211_iface_limit ath10k_if_limits[] = {
4630 {
4631 .max = 8,
4632 .types = BIT(NL80211_IFTYPE_STATION)
4633 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02004634 },
4635 {
4636 .max = 3,
4637 .types = BIT(NL80211_IFTYPE_P2P_GO)
4638 },
4639 {
4640 .max = 7,
4641 .types = BIT(NL80211_IFTYPE_AP)
4642 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004643};
4644
Bartosz Markowskif2595092013-12-10 16:20:39 +01004645static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004646 {
4647 .max = 8,
4648 .types = BIT(NL80211_IFTYPE_AP)
4649 },
4650};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004651
4652static const struct ieee80211_iface_combination ath10k_if_comb[] = {
4653 {
4654 .limits = ath10k_if_limits,
4655 .n_limits = ARRAY_SIZE(ath10k_if_limits),
4656 .max_interfaces = 8,
4657 .num_different_channels = 1,
4658 .beacon_int_infra_match = true,
4659 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01004660};
4661
4662static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004663 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01004664 .limits = ath10k_10x_if_limits,
4665 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004666 .max_interfaces = 8,
4667 .num_different_channels = 1,
4668 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01004669#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004670 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
4671 BIT(NL80211_CHAN_WIDTH_20) |
4672 BIT(NL80211_CHAN_WIDTH_40) |
4673 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004674#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01004675 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004676};
4677
4678static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4679{
4680 struct ieee80211_sta_vht_cap vht_cap = {0};
4681 u16 mcs_map;
Michal Kazior8865bee42013-07-24 12:36:46 +02004682 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004683
4684 vht_cap.vht_supported = 1;
4685 vht_cap.cap = ar->vht_cap_info;
4686
Michal Kazior8865bee42013-07-24 12:36:46 +02004687 mcs_map = 0;
4688 for (i = 0; i < 8; i++) {
4689 if (i < ar->num_rf_chains)
4690 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
4691 else
4692 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
4693 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004694
4695 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4696 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4697
4698 return vht_cap;
4699}
4700
4701static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4702{
4703 int i;
4704 struct ieee80211_sta_ht_cap ht_cap = {0};
4705
4706 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4707 return ht_cap;
4708
4709 ht_cap.ht_supported = 1;
4710 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4711 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4712 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4713 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4714 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4715
4716 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4717 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4718
4719 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4720 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4721
4722 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4723 u32 smps;
4724
4725 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4726 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4727
4728 ht_cap.cap |= smps;
4729 }
4730
4731 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
4732 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4733
4734 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4735 u32 stbc;
4736
4737 stbc = ar->ht_cap_info;
4738 stbc &= WMI_HT_CAP_RX_STBC;
4739 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4740 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4741 stbc &= IEEE80211_HT_CAP_RX_STBC;
4742
4743 ht_cap.cap |= stbc;
4744 }
4745
4746 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4747 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4748
4749 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4750 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4751
4752 /* max AMSDU is implicitly taken from vht_cap_info */
4753 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4754 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4755
Michal Kazior8865bee42013-07-24 12:36:46 +02004756 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004757 ht_cap.mcs.rx_mask[i] = 0xFF;
4758
4759 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4760
4761 return ht_cap;
4762}
4763
Kalle Valo5e3dd152013-06-12 20:52:10 +03004764static void ath10k_get_arvif_iter(void *data, u8 *mac,
4765 struct ieee80211_vif *vif)
4766{
4767 struct ath10k_vif_iter *arvif_iter = data;
4768 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4769
4770 if (arvif->vdev_id == arvif_iter->vdev_id)
4771 arvif_iter->arvif = arvif;
4772}
4773
4774struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
4775{
4776 struct ath10k_vif_iter arvif_iter;
4777 u32 flags;
4778
4779 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
4780 arvif_iter.vdev_id = vdev_id;
4781
4782 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
4783 ieee80211_iterate_active_interfaces_atomic(ar->hw,
4784 flags,
4785 ath10k_get_arvif_iter,
4786 &arvif_iter);
4787 if (!arvif_iter.arvif) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004788 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004789 return NULL;
4790 }
4791
4792 return arvif_iter.arvif;
4793}
4794
4795int ath10k_mac_register(struct ath10k *ar)
4796{
4797 struct ieee80211_supported_band *band;
4798 struct ieee80211_sta_vht_cap vht_cap;
4799 struct ieee80211_sta_ht_cap ht_cap;
4800 void *channels;
4801 int ret;
4802
4803 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
4804
4805 SET_IEEE80211_DEV(ar->hw, ar->dev);
4806
4807 ht_cap = ath10k_get_ht_cap(ar);
4808 vht_cap = ath10k_create_vht_cap(ar);
4809
4810 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4811 channels = kmemdup(ath10k_2ghz_channels,
4812 sizeof(ath10k_2ghz_channels),
4813 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02004814 if (!channels) {
4815 ret = -ENOMEM;
4816 goto err_free;
4817 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004818
4819 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
4820 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
4821 band->channels = channels;
4822 band->n_bitrates = ath10k_g_rates_size;
4823 band->bitrates = ath10k_g_rates;
4824 band->ht_cap = ht_cap;
4825
4826 /* vht is not supported in 2.4 GHz */
4827
4828 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
4829 }
4830
4831 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4832 channels = kmemdup(ath10k_5ghz_channels,
4833 sizeof(ath10k_5ghz_channels),
4834 GFP_KERNEL);
4835 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02004836 ret = -ENOMEM;
4837 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004838 }
4839
4840 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
4841 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
4842 band->channels = channels;
4843 band->n_bitrates = ath10k_a_rates_size;
4844 band->bitrates = ath10k_a_rates;
4845 band->ht_cap = ht_cap;
4846 band->vht_cap = vht_cap;
4847 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
4848 }
4849
4850 ar->hw->wiphy->interface_modes =
4851 BIT(NL80211_IFTYPE_STATION) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01004852 BIT(NL80211_IFTYPE_AP);
4853
Ben Greear46acf7b2014-05-16 17:15:38 +03004854 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
4855 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
4856
Bartosz Markowskid3541812013-12-10 16:20:40 +01004857 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
4858 ar->hw->wiphy->interface_modes |=
4859 BIT(NL80211_IFTYPE_P2P_CLIENT) |
4860 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004861
4862 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
4863 IEEE80211_HW_SUPPORTS_PS |
4864 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
4865 IEEE80211_HW_SUPPORTS_UAPSD |
4866 IEEE80211_HW_MFP_CAPABLE |
4867 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
4868 IEEE80211_HW_HAS_RATE_CONTROL |
4869 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
Janusz Dziedzic2f0f1122014-02-26 18:42:09 +02004870 IEEE80211_HW_AP_LINK_PS |
4871 IEEE80211_HW_SPECTRUM_MGMT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004872
Michal Kazior1f8bb152013-09-18 14:43:22 +02004873 /* MSDU can have HTT TX fragment pushed in front. The additional 4
4874 * bytes is used for padding/alignment if necessary. */
4875 ar->hw->extra_tx_headroom += sizeof(struct htt_data_tx_desc_frag)*2 + 4;
4876
Kalle Valo5e3dd152013-06-12 20:52:10 +03004877 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4878 ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
4879
4880 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
4881 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
4882 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
4883 }
4884
4885 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
4886 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
4887
4888 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01004889 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004890
Kalle Valo5e3dd152013-06-12 20:52:10 +03004891 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
4892
4893 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01004894 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004895 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
4896
4897 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
4898 /*
4899 * on LL hardware queues are managed entirely by the FW
4900 * so we only advertise to mac we can do the queues thing
4901 */
4902 ar->hw->queues = 4;
4903
Bartosz Markowskif2595092013-12-10 16:20:39 +01004904 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4905 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
4906 ar->hw->wiphy->n_iface_combinations =
4907 ARRAY_SIZE(ath10k_10x_if_comb);
4908 } else {
4909 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
4910 ar->hw->wiphy->n_iface_combinations =
4911 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03004912
4913 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Bartosz Markowskif2595092013-12-10 16:20:39 +01004914 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004915
Michal Kazior7c199992013-07-31 10:47:57 +02004916 ar->hw->netdev_features = NETIF_F_HW_CSUM;
4917
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004918 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
4919 /* Init ath dfs pattern detector */
4920 ar->ath_common.debug_mask = ATH_DBG_DFS;
4921 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
4922 NL80211_DFS_UNSET);
4923
4924 if (!ar->dfs_detector)
Michal Kazior7aa7a722014-08-25 12:09:38 +02004925 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004926 }
4927
Kalle Valo5e3dd152013-06-12 20:52:10 +03004928 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
4929 ath10k_reg_notifier);
4930 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004931 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02004932 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004933 }
4934
4935 ret = ieee80211_register_hw(ar->hw);
4936 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02004937 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02004938 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004939 }
4940
4941 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
4942 ret = regulatory_hint(ar->hw->wiphy,
4943 ar->ath_common.regulatory.alpha2);
4944 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02004945 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004946 }
4947
4948 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02004949
4950err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004951 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02004952err_free:
4953 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4954 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4955
Kalle Valo5e3dd152013-06-12 20:52:10 +03004956 return ret;
4957}
4958
4959void ath10k_mac_unregister(struct ath10k *ar)
4960{
4961 ieee80211_unregister_hw(ar->hw);
4962
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004963 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
4964 ar->dfs_detector->exit(ar->dfs_detector);
4965
Kalle Valo5e3dd152013-06-12 20:52:10 +03004966 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4967 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4968
4969 SET_IEEE80211_DEV(ar->hw, NULL);
4970}