blob: 3d905932b5a296009ebd39d743857dbc419f1987 [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"
29
30/**********/
31/* Crypto */
32/**********/
33
34static int ath10k_send_key(struct ath10k_vif *arvif,
35 struct ieee80211_key_conf *key,
36 enum set_key_cmd cmd,
37 const u8 *macaddr)
38{
39 struct wmi_vdev_install_key_arg arg = {
40 .vdev_id = arvif->vdev_id,
41 .key_idx = key->keyidx,
42 .key_len = key->keylen,
43 .key_data = key->key,
44 .macaddr = macaddr,
45 };
46
Michal Kazior548db542013-07-05 16:15:15 +030047 lockdep_assert_held(&arvif->ar->conf_mutex);
48
Kalle Valo5e3dd152013-06-12 20:52:10 +030049 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
50 arg.key_flags = WMI_KEY_PAIRWISE;
51 else
52 arg.key_flags = WMI_KEY_GROUP;
53
54 switch (key->cipher) {
55 case WLAN_CIPHER_SUITE_CCMP:
56 arg.key_cipher = WMI_CIPHER_AES_CCM;
57 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
58 break;
59 case WLAN_CIPHER_SUITE_TKIP:
Kalle Valo5e3dd152013-06-12 20:52:10 +030060 arg.key_cipher = WMI_CIPHER_TKIP;
61 arg.key_txmic_len = 8;
62 arg.key_rxmic_len = 8;
63 break;
64 case WLAN_CIPHER_SUITE_WEP40:
65 case WLAN_CIPHER_SUITE_WEP104:
66 arg.key_cipher = WMI_CIPHER_WEP;
67 /* AP/IBSS mode requires self-key to be groupwise
68 * Otherwise pairwise key must be set */
69 if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
70 arg.key_flags = WMI_KEY_PAIRWISE;
71 break;
72 default:
73 ath10k_warn("cipher %d is not supported\n", key->cipher);
74 return -EOPNOTSUPP;
75 }
76
77 if (cmd == DISABLE_KEY) {
78 arg.key_cipher = WMI_CIPHER_NONE;
79 arg.key_data = NULL;
80 }
81
82 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
83}
84
85static int ath10k_install_key(struct ath10k_vif *arvif,
86 struct ieee80211_key_conf *key,
87 enum set_key_cmd cmd,
88 const u8 *macaddr)
89{
90 struct ath10k *ar = arvif->ar;
91 int ret;
92
Michal Kazior548db542013-07-05 16:15:15 +030093 lockdep_assert_held(&ar->conf_mutex);
94
Wolfram Sang16735d02013-11-14 14:32:02 -080095 reinit_completion(&ar->install_key_done);
Kalle Valo5e3dd152013-06-12 20:52:10 +030096
97 ret = ath10k_send_key(arvif, key, cmd, macaddr);
98 if (ret)
99 return ret;
100
101 ret = wait_for_completion_timeout(&ar->install_key_done, 3*HZ);
102 if (ret == 0)
103 return -ETIMEDOUT;
104
105 return 0;
106}
107
108static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
109 const u8 *addr)
110{
111 struct ath10k *ar = arvif->ar;
112 struct ath10k_peer *peer;
113 int ret;
114 int i;
115
116 lockdep_assert_held(&ar->conf_mutex);
117
118 spin_lock_bh(&ar->data_lock);
119 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
120 spin_unlock_bh(&ar->data_lock);
121
122 if (!peer)
123 return -ENOENT;
124
125 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
126 if (arvif->wep_keys[i] == NULL)
127 continue;
128
129 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
130 addr);
131 if (ret)
132 return ret;
133
134 peer->keys[i] = arvif->wep_keys[i];
135 }
136
137 return 0;
138}
139
140static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
141 const u8 *addr)
142{
143 struct ath10k *ar = arvif->ar;
144 struct ath10k_peer *peer;
145 int first_errno = 0;
146 int ret;
147 int i;
148
149 lockdep_assert_held(&ar->conf_mutex);
150
151 spin_lock_bh(&ar->data_lock);
152 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
153 spin_unlock_bh(&ar->data_lock);
154
155 if (!peer)
156 return -ENOENT;
157
158 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
159 if (peer->keys[i] == NULL)
160 continue;
161
162 ret = ath10k_install_key(arvif, peer->keys[i],
163 DISABLE_KEY, addr);
164 if (ret && first_errno == 0)
165 first_errno = ret;
166
167 if (ret)
168 ath10k_warn("could not remove peer wep key %d (%d)\n",
169 i, ret);
170
171 peer->keys[i] = NULL;
172 }
173
174 return first_errno;
175}
176
177static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
178 struct ieee80211_key_conf *key)
179{
180 struct ath10k *ar = arvif->ar;
181 struct ath10k_peer *peer;
182 u8 addr[ETH_ALEN];
183 int first_errno = 0;
184 int ret;
185 int i;
186
187 lockdep_assert_held(&ar->conf_mutex);
188
189 for (;;) {
190 /* since ath10k_install_key we can't hold data_lock all the
191 * time, so we try to remove the keys incrementally */
192 spin_lock_bh(&ar->data_lock);
193 i = 0;
194 list_for_each_entry(peer, &ar->peers, list) {
195 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
196 if (peer->keys[i] == key) {
197 memcpy(addr, peer->addr, ETH_ALEN);
198 peer->keys[i] = NULL;
199 break;
200 }
201 }
202
203 if (i < ARRAY_SIZE(peer->keys))
204 break;
205 }
206 spin_unlock_bh(&ar->data_lock);
207
208 if (i == ARRAY_SIZE(peer->keys))
209 break;
210
211 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr);
212 if (ret && first_errno == 0)
213 first_errno = ret;
214
215 if (ret)
216 ath10k_warn("could not remove key for %pM\n", addr);
217 }
218
219 return first_errno;
220}
221
222
223/*********************/
224/* General utilities */
225/*********************/
226
227static inline enum wmi_phy_mode
228chan_to_phymode(const struct cfg80211_chan_def *chandef)
229{
230 enum wmi_phy_mode phymode = MODE_UNKNOWN;
231
232 switch (chandef->chan->band) {
233 case IEEE80211_BAND_2GHZ:
234 switch (chandef->width) {
235 case NL80211_CHAN_WIDTH_20_NOHT:
236 phymode = MODE_11G;
237 break;
238 case NL80211_CHAN_WIDTH_20:
239 phymode = MODE_11NG_HT20;
240 break;
241 case NL80211_CHAN_WIDTH_40:
242 phymode = MODE_11NG_HT40;
243 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400244 case NL80211_CHAN_WIDTH_5:
245 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300246 case NL80211_CHAN_WIDTH_80:
247 case NL80211_CHAN_WIDTH_80P80:
248 case NL80211_CHAN_WIDTH_160:
249 phymode = MODE_UNKNOWN;
250 break;
251 }
252 break;
253 case IEEE80211_BAND_5GHZ:
254 switch (chandef->width) {
255 case NL80211_CHAN_WIDTH_20_NOHT:
256 phymode = MODE_11A;
257 break;
258 case NL80211_CHAN_WIDTH_20:
259 phymode = MODE_11NA_HT20;
260 break;
261 case NL80211_CHAN_WIDTH_40:
262 phymode = MODE_11NA_HT40;
263 break;
264 case NL80211_CHAN_WIDTH_80:
265 phymode = MODE_11AC_VHT80;
266 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400267 case NL80211_CHAN_WIDTH_5:
268 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300269 case NL80211_CHAN_WIDTH_80P80:
270 case NL80211_CHAN_WIDTH_160:
271 phymode = MODE_UNKNOWN;
272 break;
273 }
274 break;
275 default:
276 break;
277 }
278
279 WARN_ON(phymode == MODE_UNKNOWN);
280 return phymode;
281}
282
283static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
284{
285/*
286 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
287 * 0 for no restriction
288 * 1 for 1/4 us
289 * 2 for 1/2 us
290 * 3 for 1 us
291 * 4 for 2 us
292 * 5 for 4 us
293 * 6 for 8 us
294 * 7 for 16 us
295 */
296 switch (mpdudensity) {
297 case 0:
298 return 0;
299 case 1:
300 case 2:
301 case 3:
302 /* Our lower layer calculations limit our precision to
303 1 microsecond */
304 return 1;
305 case 4:
306 return 2;
307 case 5:
308 return 4;
309 case 6:
310 return 8;
311 case 7:
312 return 16;
313 default:
314 return 0;
315 }
316}
317
318static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
319{
320 int ret;
321
322 lockdep_assert_held(&ar->conf_mutex);
323
324 ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800325 if (ret) {
326 ath10k_warn("Failed to create wmi peer: %i\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300327 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800328 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300329
330 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800331 if (ret) {
332 ath10k_warn("Failed to wait for created wmi peer: %i\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300333 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800334 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100335 spin_lock_bh(&ar->data_lock);
336 ar->num_peers++;
337 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300338
339 return 0;
340}
341
Kalle Valo5a13e762014-01-20 11:01:46 +0200342static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
343{
344 struct ath10k *ar = arvif->ar;
345 u32 param;
346 int ret;
347
348 param = ar->wmi.pdev_param->sta_kickout_th;
349 ret = ath10k_wmi_pdev_set_param(ar, param,
350 ATH10K_KICKOUT_THRESHOLD);
351 if (ret) {
352 ath10k_warn("Failed to set kickout threshold: %d\n", ret);
353 return ret;
354 }
355
356 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
357 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
358 ATH10K_KEEPALIVE_MIN_IDLE);
359 if (ret) {
360 ath10k_warn("Failed to set keepalive minimum idle time : %d\n",
361 ret);
362 return ret;
363 }
364
365 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
366 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
367 ATH10K_KEEPALIVE_MAX_IDLE);
368 if (ret) {
369 ath10k_warn("Failed to set keepalive maximum idle time: %d\n",
370 ret);
371 return ret;
372 }
373
374 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
375 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
376 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
377 if (ret) {
378 ath10k_warn("Failed to set keepalive maximum unresponsive time: %d\n",
379 ret);
380 return ret;
381 }
382
383 return 0;
384}
385
Michal Kazior424121c2013-07-22 14:13:31 +0200386static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
387{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200388 struct ath10k *ar = arvif->ar;
389 u32 vdev_param;
390
Michal Kazior424121c2013-07-22 14:13:31 +0200391 if (value != 0xFFFFFFFF)
392 value = min_t(u32, arvif->ar->hw->wiphy->rts_threshold,
393 ATH10K_RTS_MAX);
394
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200395 vdev_param = ar->wmi.vdev_param->rts_threshold;
396 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200397}
398
399static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
400{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200401 struct ath10k *ar = arvif->ar;
402 u32 vdev_param;
403
Michal Kazior424121c2013-07-22 14:13:31 +0200404 if (value != 0xFFFFFFFF)
405 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
406 ATH10K_FRAGMT_THRESHOLD_MIN,
407 ATH10K_FRAGMT_THRESHOLD_MAX);
408
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200409 vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
410 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200411}
412
Kalle Valo5e3dd152013-06-12 20:52:10 +0300413static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
414{
415 int ret;
416
417 lockdep_assert_held(&ar->conf_mutex);
418
419 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
420 if (ret)
421 return ret;
422
423 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
424 if (ret)
425 return ret;
426
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100427 spin_lock_bh(&ar->data_lock);
428 ar->num_peers--;
429 spin_unlock_bh(&ar->data_lock);
430
Kalle Valo5e3dd152013-06-12 20:52:10 +0300431 return 0;
432}
433
434static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
435{
436 struct ath10k_peer *peer, *tmp;
437
438 lockdep_assert_held(&ar->conf_mutex);
439
440 spin_lock_bh(&ar->data_lock);
441 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
442 if (peer->vdev_id != vdev_id)
443 continue;
444
445 ath10k_warn("removing stale peer %pM from vdev_id %d\n",
446 peer->addr, vdev_id);
447
448 list_del(&peer->list);
449 kfree(peer);
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100450 ar->num_peers--;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300451 }
452 spin_unlock_bh(&ar->data_lock);
453}
454
Michal Kaziora96d7742013-07-16 09:38:56 +0200455static void ath10k_peer_cleanup_all(struct ath10k *ar)
456{
457 struct ath10k_peer *peer, *tmp;
458
459 lockdep_assert_held(&ar->conf_mutex);
460
461 spin_lock_bh(&ar->data_lock);
462 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
463 list_del(&peer->list);
464 kfree(peer);
465 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100466 ar->num_peers = 0;
Michal Kaziora96d7742013-07-16 09:38:56 +0200467 spin_unlock_bh(&ar->data_lock);
468}
469
Kalle Valo5e3dd152013-06-12 20:52:10 +0300470/************************/
471/* Interface management */
472/************************/
473
474static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
475{
476 int ret;
477
Michal Kazior548db542013-07-05 16:15:15 +0300478 lockdep_assert_held(&ar->conf_mutex);
479
Kalle Valo5e3dd152013-06-12 20:52:10 +0300480 ret = wait_for_completion_timeout(&ar->vdev_setup_done,
481 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
482 if (ret == 0)
483 return -ETIMEDOUT;
484
485 return 0;
486}
487
488static int ath10k_vdev_start(struct ath10k_vif *arvif)
489{
490 struct ath10k *ar = arvif->ar;
Michal Kaziorc930f742014-01-23 11:38:25 +0100491 struct cfg80211_chan_def *chandef = &ar->chandef;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300492 struct wmi_vdev_start_request_arg arg = {};
493 int ret = 0;
494
495 lockdep_assert_held(&ar->conf_mutex);
496
Wolfram Sang16735d02013-11-14 14:32:02 -0800497 reinit_completion(&ar->vdev_setup_done);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300498
499 arg.vdev_id = arvif->vdev_id;
500 arg.dtim_period = arvif->dtim_period;
501 arg.bcn_intval = arvif->beacon_interval;
502
Michal Kaziorc930f742014-01-23 11:38:25 +0100503 arg.channel.freq = chandef->chan->center_freq;
504 arg.channel.band_center_freq1 = chandef->center_freq1;
505 arg.channel.mode = chan_to_phymode(chandef);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300506
Michal Kazior89c5c842013-10-23 04:02:13 -0700507 arg.channel.min_power = 0;
Michal Kaziorc930f742014-01-23 11:38:25 +0100508 arg.channel.max_power = chandef->chan->max_power * 2;
509 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
510 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300511
512 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
513 arg.ssid = arvif->u.ap.ssid;
514 arg.ssid_len = arvif->u.ap.ssid_len;
515 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200516
517 /* For now allow DFS for AP mode */
518 arg.channel.chan_radar =
Michal Kaziorc930f742014-01-23 11:38:25 +0100519 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300520 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
521 arg.ssid = arvif->vif->bss_conf.ssid;
522 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
523 }
524
Kalle Valo38a1d472013-09-08 17:56:14 +0300525 ath10k_dbg(ATH10K_DBG_MAC,
526 "mac vdev %d start center_freq %d phymode %s\n",
527 arg.vdev_id, arg.channel.freq,
528 ath10k_wmi_phymode_str(arg.channel.mode));
529
Kalle Valo5e3dd152013-06-12 20:52:10 +0300530 ret = ath10k_wmi_vdev_start(ar, &arg);
531 if (ret) {
532 ath10k_warn("WMI vdev start failed: ret %d\n", ret);
533 return ret;
534 }
535
536 ret = ath10k_vdev_setup_sync(ar);
537 if (ret) {
538 ath10k_warn("vdev setup failed %d\n", ret);
539 return ret;
540 }
541
542 return ret;
543}
544
545static int ath10k_vdev_stop(struct ath10k_vif *arvif)
546{
547 struct ath10k *ar = arvif->ar;
548 int ret;
549
550 lockdep_assert_held(&ar->conf_mutex);
551
Wolfram Sang16735d02013-11-14 14:32:02 -0800552 reinit_completion(&ar->vdev_setup_done);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300553
554 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
555 if (ret) {
556 ath10k_warn("WMI vdev stop failed: ret %d\n", ret);
557 return ret;
558 }
559
560 ret = ath10k_vdev_setup_sync(ar);
561 if (ret) {
562 ath10k_warn("vdev setup failed %d\n", ret);
563 return ret;
564 }
565
566 return ret;
567}
568
569static int ath10k_monitor_start(struct ath10k *ar, int vdev_id)
570{
Michal Kaziorc930f742014-01-23 11:38:25 +0100571 struct cfg80211_chan_def *chandef = &ar->chandef;
572 struct ieee80211_channel *channel = chandef->chan;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300573 struct wmi_vdev_start_request_arg arg = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300574 int ret = 0;
575
576 lockdep_assert_held(&ar->conf_mutex);
577
Michal Kazior0ed00ee2013-10-16 16:45:48 +0300578 if (!ar->monitor_present) {
579 ath10k_warn("mac montor stop -- monitor is not present\n");
580 return -EINVAL;
581 }
582
Kalle Valo5e3dd152013-06-12 20:52:10 +0300583 arg.vdev_id = vdev_id;
584 arg.channel.freq = channel->center_freq;
Michal Kaziorc930f742014-01-23 11:38:25 +0100585 arg.channel.band_center_freq1 = chandef->center_freq1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300586
587 /* TODO setup this dynamically, what in case we
588 don't have any vifs? */
Michal Kaziorc930f742014-01-23 11:38:25 +0100589 arg.channel.mode = chan_to_phymode(chandef);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200590 arg.channel.chan_radar =
591 !!(channel->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300592
Michal Kazior89c5c842013-10-23 04:02:13 -0700593 arg.channel.min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -0700594 arg.channel.max_power = channel->max_power * 2;
595 arg.channel.max_reg_power = channel->max_reg_power * 2;
596 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300597
598 ret = ath10k_wmi_vdev_start(ar, &arg);
599 if (ret) {
600 ath10k_warn("Monitor vdev start failed: ret %d\n", ret);
601 return ret;
602 }
603
604 ret = ath10k_vdev_setup_sync(ar);
605 if (ret) {
606 ath10k_warn("Monitor vdev setup failed %d\n", ret);
607 return ret;
608 }
609
610 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
611 if (ret) {
612 ath10k_warn("Monitor vdev up failed: %d\n", ret);
613 goto vdev_stop;
614 }
615
616 ar->monitor_vdev_id = vdev_id;
617 ar->monitor_enabled = true;
618
619 return 0;
620
621vdev_stop:
622 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
623 if (ret)
624 ath10k_warn("Monitor vdev stop failed: %d\n", ret);
625
626 return ret;
627}
628
629static int ath10k_monitor_stop(struct ath10k *ar)
630{
631 int ret = 0;
632
633 lockdep_assert_held(&ar->conf_mutex);
634
Michal Kazior0ed00ee2013-10-16 16:45:48 +0300635 if (!ar->monitor_present) {
636 ath10k_warn("mac montor stop -- monitor is not present\n");
637 return -EINVAL;
638 }
639
640 if (!ar->monitor_enabled) {
641 ath10k_warn("mac montor stop -- monitor is not enabled\n");
642 return -EINVAL;
643 }
644
Marek Puzyniak52fa0192013-09-24 14:06:24 +0200645 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
646 if (ret)
647 ath10k_warn("Monitor vdev down failed: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300648
649 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
650 if (ret)
651 ath10k_warn("Monitor vdev stop failed: %d\n", ret);
652
653 ret = ath10k_vdev_setup_sync(ar);
654 if (ret)
655 ath10k_warn("Monitor_down sync failed: %d\n", ret);
656
657 ar->monitor_enabled = false;
658 return ret;
659}
660
661static int ath10k_monitor_create(struct ath10k *ar)
662{
663 int bit, ret = 0;
664
665 lockdep_assert_held(&ar->conf_mutex);
666
667 if (ar->monitor_present) {
668 ath10k_warn("Monitor mode already enabled\n");
669 return 0;
670 }
671
672 bit = ffs(ar->free_vdev_map);
673 if (bit == 0) {
674 ath10k_warn("No free VDEV slots\n");
675 return -ENOMEM;
676 }
677
678 ar->monitor_vdev_id = bit - 1;
679 ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id);
680
681 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
682 WMI_VDEV_TYPE_MONITOR,
683 0, ar->mac_addr);
684 if (ret) {
685 ath10k_warn("WMI vdev monitor create failed: ret %d\n", ret);
686 goto vdev_fail;
687 }
688
Kalle Valo60c3daa2013-09-08 17:56:07 +0300689 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300690 ar->monitor_vdev_id);
691
692 ar->monitor_present = true;
693 return 0;
694
695vdev_fail:
696 /*
697 * Restore the ID to the global map.
698 */
699 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
700 return ret;
701}
702
703static int ath10k_monitor_destroy(struct ath10k *ar)
704{
705 int ret = 0;
706
707 lockdep_assert_held(&ar->conf_mutex);
708
709 if (!ar->monitor_present)
710 return 0;
711
712 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
713 if (ret) {
714 ath10k_warn("WMI vdev monitor delete failed: %d\n", ret);
715 return ret;
716 }
717
718 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
719 ar->monitor_present = false;
720
Kalle Valo60c3daa2013-09-08 17:56:07 +0300721 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300722 ar->monitor_vdev_id);
723 return ret;
724}
725
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200726static int ath10k_start_cac(struct ath10k *ar)
727{
728 int ret;
729
730 lockdep_assert_held(&ar->conf_mutex);
731
732 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
733
734 ret = ath10k_monitor_create(ar);
735 if (ret) {
736 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
737 return ret;
738 }
739
740 ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
741 if (ret) {
742 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
743 ath10k_monitor_destroy(ar);
744 return ret;
745 }
746
747 ath10k_dbg(ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
748 ar->monitor_vdev_id);
749
750 return 0;
751}
752
753static int ath10k_stop_cac(struct ath10k *ar)
754{
755 lockdep_assert_held(&ar->conf_mutex);
756
757 /* CAC is not running - do nothing */
758 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
759 return 0;
760
761 ath10k_monitor_stop(ar);
762 ath10k_monitor_destroy(ar);
763 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
764
765 ath10k_dbg(ATH10K_DBG_MAC, "mac cac finished\n");
766
767 return 0;
768}
769
770static const char *ath10k_dfs_state(enum nl80211_dfs_state dfs_state)
771{
772 switch (dfs_state) {
773 case NL80211_DFS_USABLE:
774 return "USABLE";
775 case NL80211_DFS_UNAVAILABLE:
776 return "UNAVAILABLE";
777 case NL80211_DFS_AVAILABLE:
778 return "AVAILABLE";
779 default:
780 WARN_ON(1);
781 return "bug";
782 }
783}
784
785static void ath10k_config_radar_detection(struct ath10k *ar)
786{
787 struct ieee80211_channel *chan = ar->hw->conf.chandef.chan;
788 bool radar = ar->hw->conf.radar_enabled;
789 bool chan_radar = !!(chan->flags & IEEE80211_CHAN_RADAR);
790 enum nl80211_dfs_state dfs_state = chan->dfs_state;
791 int ret;
792
793 lockdep_assert_held(&ar->conf_mutex);
794
795 ath10k_dbg(ATH10K_DBG_MAC,
796 "mac radar config update: chan %dMHz radar %d chan radar %d chan state %s\n",
797 chan->center_freq, radar, chan_radar,
798 ath10k_dfs_state(dfs_state));
799
800 /*
801 * It's safe to call it even if CAC is not started.
802 * This call here guarantees changing channel, etc. will stop CAC.
803 */
804 ath10k_stop_cac(ar);
805
806 if (!radar)
807 return;
808
809 if (!chan_radar)
810 return;
811
812 if (dfs_state != NL80211_DFS_USABLE)
813 return;
814
815 ret = ath10k_start_cac(ar);
816 if (ret) {
817 /*
818 * Not possible to start CAC on current channel so starting
819 * radiation is not allowed, make this channel DFS_UNAVAILABLE
820 * by indicating that radar was detected.
821 */
822 ath10k_warn("failed to start CAC (%d)\n", ret);
823 ieee80211_radar_detected(ar->hw);
824 }
825}
826
Kalle Valo5e3dd152013-06-12 20:52:10 +0300827static void ath10k_control_beaconing(struct ath10k_vif *arvif,
828 struct ieee80211_bss_conf *info)
829{
830 int ret = 0;
831
Michal Kazior548db542013-07-05 16:15:15 +0300832 lockdep_assert_held(&arvif->ar->conf_mutex);
833
Kalle Valo5e3dd152013-06-12 20:52:10 +0300834 if (!info->enable_beacon) {
835 ath10k_vdev_stop(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +0100836
837 arvif->is_started = false;
838 arvif->is_up = false;
839
Michal Kazior748afc42014-01-23 12:48:21 +0100840 spin_lock_bh(&arvif->ar->data_lock);
841 if (arvif->beacon) {
842 ath10k_skb_unmap(arvif->ar->dev, arvif->beacon);
843 dev_kfree_skb_any(arvif->beacon);
844
845 arvif->beacon = NULL;
846 arvif->beacon_sent = false;
847 }
848 spin_unlock_bh(&arvif->ar->data_lock);
849
Kalle Valo5e3dd152013-06-12 20:52:10 +0300850 return;
851 }
852
853 arvif->tx_seq_no = 0x1000;
854
855 ret = ath10k_vdev_start(arvif);
856 if (ret)
857 return;
858
Michal Kaziorc930f742014-01-23 11:38:25 +0100859 arvif->aid = 0;
860 memcpy(arvif->bssid, info->bssid, ETH_ALEN);
861
862 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
863 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300864 if (ret) {
865 ath10k_warn("Failed to bring up VDEV: %d\n",
866 arvif->vdev_id);
Michal Kaziorc930f742014-01-23 11:38:25 +0100867 ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300868 return;
869 }
Michal Kaziorc930f742014-01-23 11:38:25 +0100870
871 arvif->is_started = true;
872 arvif->is_up = true;
873
Kalle Valo60c3daa2013-09-08 17:56:07 +0300874 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300875}
876
877static void ath10k_control_ibss(struct ath10k_vif *arvif,
878 struct ieee80211_bss_conf *info,
879 const u8 self_peer[ETH_ALEN])
880{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200881 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300882 int ret = 0;
883
Michal Kazior548db542013-07-05 16:15:15 +0300884 lockdep_assert_held(&arvif->ar->conf_mutex);
885
Kalle Valo5e3dd152013-06-12 20:52:10 +0300886 if (!info->ibss_joined) {
887 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
888 if (ret)
889 ath10k_warn("Failed to delete IBSS self peer:%pM for VDEV:%d ret:%d\n",
890 self_peer, arvif->vdev_id, ret);
891
Michal Kaziorc930f742014-01-23 11:38:25 +0100892 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +0300893 return;
894
895 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id,
Michal Kaziorc930f742014-01-23 11:38:25 +0100896 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300897 if (ret) {
898 ath10k_warn("Failed to delete IBSS BSSID peer:%pM for VDEV:%d ret:%d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +0100899 arvif->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300900 return;
901 }
902
Michal Kaziorc930f742014-01-23 11:38:25 +0100903 memset(arvif->bssid, 0, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300904
905 return;
906 }
907
908 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
909 if (ret) {
910 ath10k_warn("Failed to create IBSS self peer:%pM for VDEV:%d ret:%d\n",
911 self_peer, arvif->vdev_id, ret);
912 return;
913 }
914
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200915 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
916 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +0300917 ATH10K_DEFAULT_ATIM);
918 if (ret)
919 ath10k_warn("Failed to set IBSS ATIM for VDEV:%d ret:%d\n",
920 arvif->vdev_id, ret);
921}
922
923/*
924 * Review this when mac80211 gains per-interface powersave support.
925 */
Michal Kaziorad088bf2013-10-16 15:44:46 +0300926static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300927{
Michal Kaziorad088bf2013-10-16 15:44:46 +0300928 struct ath10k *ar = arvif->ar;
929 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300930 enum wmi_sta_powersave_param param;
931 enum wmi_sta_ps_mode psmode;
932 int ret;
933
Michal Kazior548db542013-07-05 16:15:15 +0300934 lockdep_assert_held(&arvif->ar->conf_mutex);
935
Michal Kaziorad088bf2013-10-16 15:44:46 +0300936 if (arvif->vif->type != NL80211_IFTYPE_STATION)
937 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300938
939 if (conf->flags & IEEE80211_CONF_PS) {
940 psmode = WMI_STA_PS_MODE_ENABLED;
941 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
942
Michal Kaziorad088bf2013-10-16 15:44:46 +0300943 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Kalle Valo5e3dd152013-06-12 20:52:10 +0300944 conf->dynamic_ps_timeout);
945 if (ret) {
946 ath10k_warn("Failed to set inactivity time for VDEV: %d\n",
947 arvif->vdev_id);
Michal Kaziorad088bf2013-10-16 15:44:46 +0300948 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300949 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300950 } else {
951 psmode = WMI_STA_PS_MODE_DISABLED;
952 }
953
Kalle Valo60c3daa2013-09-08 17:56:07 +0300954 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
955 arvif->vdev_id, psmode ? "enable" : "disable");
956
Michal Kaziorad088bf2013-10-16 15:44:46 +0300957 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
958 if (ret) {
Kalle Valo5e3dd152013-06-12 20:52:10 +0300959 ath10k_warn("Failed to set PS Mode: %d for VDEV: %d\n",
960 psmode, arvif->vdev_id);
Michal Kaziorad088bf2013-10-16 15:44:46 +0300961 return ret;
962 }
963
964 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300965}
966
967/**********************/
968/* Station management */
969/**********************/
970
971static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
972 struct ath10k_vif *arvif,
973 struct ieee80211_sta *sta,
974 struct ieee80211_bss_conf *bss_conf,
975 struct wmi_peer_assoc_complete_arg *arg)
976{
Michal Kazior548db542013-07-05 16:15:15 +0300977 lockdep_assert_held(&ar->conf_mutex);
978
Kalle Valo5e3dd152013-06-12 20:52:10 +0300979 memcpy(arg->addr, sta->addr, ETH_ALEN);
980 arg->vdev_id = arvif->vdev_id;
981 arg->peer_aid = sta->aid;
982 arg->peer_flags |= WMI_PEER_AUTH;
983
984 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
985 /*
986 * Seems FW have problems with Power Save in STA
987 * mode when we setup this parameter to high (eg. 5).
988 * Often we see that FW don't send NULL (with clean P flags)
989 * frame even there is info about buffered frames in beacons.
990 * Sometimes we have to wait more than 10 seconds before FW
991 * will wakeup. Often sending one ping from AP to our device
992 * just fail (more than 50%).
993 *
994 * Seems setting this FW parameter to 1 couse FW
995 * will check every beacon and will wakup immediately
996 * after detection buffered data.
997 */
998 arg->peer_listen_intval = 1;
999 else
1000 arg->peer_listen_intval = ar->hw->conf.listen_interval;
1001
1002 arg->peer_num_spatial_streams = 1;
1003
1004 /*
1005 * The assoc capabilities are available only in managed mode.
1006 */
1007 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && bss_conf)
1008 arg->peer_caps = bss_conf->assoc_capability;
1009}
1010
1011static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1012 struct ath10k_vif *arvif,
1013 struct wmi_peer_assoc_complete_arg *arg)
1014{
1015 struct ieee80211_vif *vif = arvif->vif;
1016 struct ieee80211_bss_conf *info = &vif->bss_conf;
1017 struct cfg80211_bss *bss;
1018 const u8 *rsnie = NULL;
1019 const u8 *wpaie = NULL;
1020
Michal Kazior548db542013-07-05 16:15:15 +03001021 lockdep_assert_held(&ar->conf_mutex);
1022
Kalle Valo5e3dd152013-06-12 20:52:10 +03001023 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1024 info->bssid, NULL, 0, 0, 0);
1025 if (bss) {
1026 const struct cfg80211_bss_ies *ies;
1027
1028 rcu_read_lock();
1029 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1030
1031 ies = rcu_dereference(bss->ies);
1032
1033 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1034 WLAN_OUI_TYPE_MICROSOFT_WPA,
1035 ies->data,
1036 ies->len);
1037 rcu_read_unlock();
1038 cfg80211_put_bss(ar->hw->wiphy, bss);
1039 }
1040
1041 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1042 if (rsnie || wpaie) {
1043 ath10k_dbg(ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
1044 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1045 }
1046
1047 if (wpaie) {
1048 ath10k_dbg(ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
1049 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1050 }
1051}
1052
1053static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
1054 struct ieee80211_sta *sta,
1055 struct wmi_peer_assoc_complete_arg *arg)
1056{
1057 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1058 const struct ieee80211_supported_band *sband;
1059 const struct ieee80211_rate *rates;
1060 u32 ratemask;
1061 int i;
1062
Michal Kazior548db542013-07-05 16:15:15 +03001063 lockdep_assert_held(&ar->conf_mutex);
1064
Kalle Valo5e3dd152013-06-12 20:52:10 +03001065 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1066 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1067 rates = sband->bitrates;
1068
1069 rateset->num_rates = 0;
1070
1071 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1072 if (!(ratemask & 1))
1073 continue;
1074
1075 rateset->rates[rateset->num_rates] = rates->hw_value;
1076 rateset->num_rates++;
1077 }
1078}
1079
1080static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1081 struct ieee80211_sta *sta,
1082 struct wmi_peer_assoc_complete_arg *arg)
1083{
1084 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1085 int smps;
1086 int i, n;
1087
Michal Kazior548db542013-07-05 16:15:15 +03001088 lockdep_assert_held(&ar->conf_mutex);
1089
Kalle Valo5e3dd152013-06-12 20:52:10 +03001090 if (!ht_cap->ht_supported)
1091 return;
1092
1093 arg->peer_flags |= WMI_PEER_HT;
1094 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1095 ht_cap->ampdu_factor)) - 1;
1096
1097 arg->peer_mpdu_density =
1098 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1099
1100 arg->peer_ht_caps = ht_cap->cap;
1101 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1102
1103 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1104 arg->peer_flags |= WMI_PEER_LDPC;
1105
1106 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1107 arg->peer_flags |= WMI_PEER_40MHZ;
1108 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1109 }
1110
1111 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1112 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1113
1114 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1115 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1116
1117 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1118 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1119 arg->peer_flags |= WMI_PEER_STBC;
1120 }
1121
1122 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1123 u32 stbc;
1124 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1125 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1126 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1127 arg->peer_rate_caps |= stbc;
1128 arg->peer_flags |= WMI_PEER_STBC;
1129 }
1130
1131 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1132 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1133
1134 if (smps == WLAN_HT_CAP_SM_PS_STATIC) {
1135 arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
1136 arg->peer_flags |= WMI_PEER_STATIC_MIMOPS;
1137 } else if (smps == WLAN_HT_CAP_SM_PS_DYNAMIC) {
1138 arg->peer_flags |= WMI_PEER_SPATIAL_MUX;
1139 arg->peer_flags |= WMI_PEER_DYN_MIMOPS;
1140 }
1141
1142 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1143 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1144 else if (ht_cap->mcs.rx_mask[1])
1145 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1146
1147 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1148 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1149 arg->peer_ht_rates.rates[n++] = i;
1150
1151 arg->peer_ht_rates.num_rates = n;
Marek Kwaczynski36786022014-02-10 11:25:25 +01001152 arg->peer_num_spatial_streams = sta->rx_nss;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001153
Kalle Valo60c3daa2013-09-08 17:56:07 +03001154 ath10k_dbg(ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1155 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001156 arg->peer_ht_rates.num_rates,
1157 arg->peer_num_spatial_streams);
1158}
1159
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001160static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1161 struct ath10k_vif *arvif,
1162 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001163{
1164 u32 uapsd = 0;
1165 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001166 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001167
Michal Kazior548db542013-07-05 16:15:15 +03001168 lockdep_assert_held(&ar->conf_mutex);
1169
Kalle Valo5e3dd152013-06-12 20:52:10 +03001170 if (sta->wme && sta->uapsd_queues) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03001171 ath10k_dbg(ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001172 sta->uapsd_queues, sta->max_sp);
1173
Kalle Valo5e3dd152013-06-12 20:52:10 +03001174 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1175 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1176 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1177 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1178 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1179 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1180 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1181 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1182 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1183 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1184 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1185 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1186
1187
1188 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1189 max_sp = sta->max_sp;
1190
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001191 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1192 sta->addr,
1193 WMI_AP_PS_PEER_PARAM_UAPSD,
1194 uapsd);
1195 if (ret) {
1196 ath10k_warn("failed to set ap ps peer param uapsd: %d\n",
1197 ret);
1198 return ret;
1199 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001200
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001201 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1202 sta->addr,
1203 WMI_AP_PS_PEER_PARAM_MAX_SP,
1204 max_sp);
1205 if (ret) {
1206 ath10k_warn("failed to set ap ps peer param max sp: %d\n",
1207 ret);
1208 return ret;
1209 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001210
1211 /* TODO setup this based on STA listen interval and
1212 beacon interval. Currently we don't know
1213 sta->listen_interval - mac80211 patch required.
1214 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001215 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
1216 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME, 10);
1217 if (ret) {
1218 ath10k_warn("failed to set ap ps peer param ageout time: %d\n",
1219 ret);
1220 return ret;
1221 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001222 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001223
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001224 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001225}
1226
1227static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1228 struct ieee80211_sta *sta,
1229 struct wmi_peer_assoc_complete_arg *arg)
1230{
1231 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001232 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001233
1234 if (!vht_cap->vht_supported)
1235 return;
1236
1237 arg->peer_flags |= WMI_PEER_VHT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001238 arg->peer_vht_caps = vht_cap->cap;
1239
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001240
1241 ampdu_factor = (vht_cap->cap &
1242 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1243 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1244
1245 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1246 * zero in VHT IE. Using it would result in degraded throughput.
1247 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1248 * it if VHT max_mpdu is smaller. */
1249 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1250 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1251 ampdu_factor)) - 1);
1252
Kalle Valo5e3dd152013-06-12 20:52:10 +03001253 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1254 arg->peer_flags |= WMI_PEER_80MHZ;
1255
1256 arg->peer_vht_rates.rx_max_rate =
1257 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1258 arg->peer_vht_rates.rx_mcs_set =
1259 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1260 arg->peer_vht_rates.tx_max_rate =
1261 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1262 arg->peer_vht_rates.tx_mcs_set =
1263 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1264
Kalle Valo60c3daa2013-09-08 17:56:07 +03001265 ath10k_dbg(ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1266 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001267}
1268
1269static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1270 struct ath10k_vif *arvif,
1271 struct ieee80211_sta *sta,
1272 struct ieee80211_bss_conf *bss_conf,
1273 struct wmi_peer_assoc_complete_arg *arg)
1274{
1275 switch (arvif->vdev_type) {
1276 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001277 if (sta->wme)
1278 arg->peer_flags |= WMI_PEER_QOS;
1279
1280 if (sta->wme && sta->uapsd_queues) {
1281 arg->peer_flags |= WMI_PEER_APSD;
1282 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1283 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001284 break;
1285 case WMI_VDEV_TYPE_STA:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001286 if (bss_conf->qos)
1287 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001288 break;
1289 default:
1290 break;
1291 }
1292}
1293
1294static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1295 struct ath10k_vif *arvif,
1296 struct ieee80211_sta *sta,
1297 struct wmi_peer_assoc_complete_arg *arg)
1298{
1299 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1300
Kalle Valo5e3dd152013-06-12 20:52:10 +03001301 switch (ar->hw->conf.chandef.chan->band) {
1302 case IEEE80211_BAND_2GHZ:
1303 if (sta->ht_cap.ht_supported) {
1304 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1305 phymode = MODE_11NG_HT40;
1306 else
1307 phymode = MODE_11NG_HT20;
1308 } else {
1309 phymode = MODE_11G;
1310 }
1311
1312 break;
1313 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03001314 /*
1315 * Check VHT first.
1316 */
1317 if (sta->vht_cap.vht_supported) {
1318 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1319 phymode = MODE_11AC_VHT80;
1320 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1321 phymode = MODE_11AC_VHT40;
1322 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1323 phymode = MODE_11AC_VHT20;
1324 } else if (sta->ht_cap.ht_supported) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001325 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1326 phymode = MODE_11NA_HT40;
1327 else
1328 phymode = MODE_11NA_HT20;
1329 } else {
1330 phymode = MODE_11A;
1331 }
1332
1333 break;
1334 default:
1335 break;
1336 }
1337
Kalle Valo38a1d472013-09-08 17:56:14 +03001338 ath10k_dbg(ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1339 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03001340
Kalle Valo5e3dd152013-06-12 20:52:10 +03001341 arg->peer_phymode = phymode;
1342 WARN_ON(phymode == MODE_UNKNOWN);
1343}
1344
Kalle Valob9ada652013-10-16 15:44:46 +03001345static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1346 struct ath10k_vif *arvif,
1347 struct ieee80211_sta *sta,
1348 struct ieee80211_bss_conf *bss_conf,
1349 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001350{
Michal Kazior548db542013-07-05 16:15:15 +03001351 lockdep_assert_held(&ar->conf_mutex);
1352
Kalle Valob9ada652013-10-16 15:44:46 +03001353 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03001354
Kalle Valob9ada652013-10-16 15:44:46 +03001355 ath10k_peer_assoc_h_basic(ar, arvif, sta, bss_conf, arg);
1356 ath10k_peer_assoc_h_crypto(ar, arvif, arg);
1357 ath10k_peer_assoc_h_rates(ar, sta, arg);
1358 ath10k_peer_assoc_h_ht(ar, sta, arg);
1359 ath10k_peer_assoc_h_vht(ar, sta, arg);
1360 ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, arg);
1361 ath10k_peer_assoc_h_phymode(ar, arvif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001362
Kalle Valob9ada652013-10-16 15:44:46 +03001363 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001364}
1365
1366/* can be called only in mac80211 callbacks due to `key_count` usage */
1367static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1368 struct ieee80211_vif *vif,
1369 struct ieee80211_bss_conf *bss_conf)
1370{
1371 struct ath10k *ar = hw->priv;
1372 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Kalle Valob9ada652013-10-16 15:44:46 +03001373 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001374 struct ieee80211_sta *ap_sta;
1375 int ret;
1376
Michal Kazior548db542013-07-05 16:15:15 +03001377 lockdep_assert_held(&ar->conf_mutex);
1378
Kalle Valo5e3dd152013-06-12 20:52:10 +03001379 rcu_read_lock();
1380
1381 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1382 if (!ap_sta) {
1383 ath10k_warn("Failed to find station entry for %pM\n",
1384 bss_conf->bssid);
1385 rcu_read_unlock();
1386 return;
1387 }
1388
Kalle Valob9ada652013-10-16 15:44:46 +03001389 ret = ath10k_peer_assoc_prepare(ar, arvif, ap_sta,
1390 bss_conf, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001391 if (ret) {
Kalle Valob9ada652013-10-16 15:44:46 +03001392 ath10k_warn("Peer assoc prepare failed for %pM\n: %d",
1393 bss_conf->bssid, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001394 rcu_read_unlock();
1395 return;
1396 }
1397
1398 rcu_read_unlock();
1399
Kalle Valob9ada652013-10-16 15:44:46 +03001400 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1401 if (ret) {
1402 ath10k_warn("Peer assoc failed for %pM\n: %d",
1403 bss_conf->bssid, ret);
1404 return;
1405 }
1406
Kalle Valo60c3daa2013-09-08 17:56:07 +03001407 ath10k_dbg(ATH10K_DBG_MAC,
1408 "mac vdev %d up (associated) bssid %pM aid %d\n",
1409 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1410
Michal Kaziorc930f742014-01-23 11:38:25 +01001411 arvif->aid = bss_conf->aid;
1412 memcpy(arvif->bssid, bss_conf->bssid, ETH_ALEN);
1413
1414 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1415 if (ret) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001416 ath10k_warn("VDEV: %d up failed: ret %d\n",
1417 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001418 return;
1419 }
1420
1421 arvif->is_up = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001422}
1423
1424/*
1425 * FIXME: flush TIDs
1426 */
1427static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1428 struct ieee80211_vif *vif)
1429{
1430 struct ath10k *ar = hw->priv;
1431 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1432 int ret;
1433
Michal Kazior548db542013-07-05 16:15:15 +03001434 lockdep_assert_held(&ar->conf_mutex);
1435
Kalle Valo5e3dd152013-06-12 20:52:10 +03001436 /*
1437 * For some reason, calling VDEV-DOWN before VDEV-STOP
1438 * makes the FW to send frames via HTT after disassociation.
1439 * No idea why this happens, even though VDEV-DOWN is supposed
1440 * to be analogous to link down, so just stop the VDEV.
1441 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03001442 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d stop (disassociated\n",
1443 arvif->vdev_id);
1444
1445 /* FIXME: check return value */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001446 ret = ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001447
1448 /*
1449 * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1450 * report beacons from previously associated network through HTT.
1451 * This in turn would spam mac80211 WARN_ON if we bring down all
1452 * interfaces as it expects there is no rx when no interface is
1453 * running.
1454 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03001455 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d down\n", arvif->vdev_id);
1456
1457 /* FIXME: why don't we print error if wmi call fails? */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001458 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001459
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001460 arvif->def_wep_key_idx = 0;
Michal Kaziorc930f742014-01-23 11:38:25 +01001461
1462 arvif->is_started = false;
1463 arvif->is_up = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001464}
1465
1466static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
1467 struct ieee80211_sta *sta)
1468{
Kalle Valob9ada652013-10-16 15:44:46 +03001469 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001470 int ret = 0;
1471
Michal Kazior548db542013-07-05 16:15:15 +03001472 lockdep_assert_held(&ar->conf_mutex);
1473
Kalle Valob9ada652013-10-16 15:44:46 +03001474 ret = ath10k_peer_assoc_prepare(ar, arvif, sta, NULL, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001475 if (ret) {
Kalle Valob9ada652013-10-16 15:44:46 +03001476 ath10k_warn("WMI peer assoc prepare failed for %pM\n",
1477 sta->addr);
1478 return ret;
1479 }
1480
1481 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1482 if (ret) {
1483 ath10k_warn("Peer assoc failed for STA %pM\n: %d",
1484 sta->addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001485 return ret;
1486 }
1487
1488 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1489 if (ret) {
1490 ath10k_warn("could not install peer wep keys (%d)\n", ret);
1491 return ret;
1492 }
1493
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001494 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
1495 if (ret) {
1496 ath10k_warn("could not set qos params for STA %pM, %d\n",
1497 sta->addr, ret);
1498 return ret;
1499 }
1500
Kalle Valo5e3dd152013-06-12 20:52:10 +03001501 return ret;
1502}
1503
1504static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
1505 struct ieee80211_sta *sta)
1506{
1507 int ret = 0;
1508
Michal Kazior548db542013-07-05 16:15:15 +03001509 lockdep_assert_held(&ar->conf_mutex);
1510
Kalle Valo5e3dd152013-06-12 20:52:10 +03001511 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1512 if (ret) {
1513 ath10k_warn("could not clear all peer wep keys (%d)\n", ret);
1514 return ret;
1515 }
1516
1517 return ret;
1518}
1519
1520/**************/
1521/* Regulatory */
1522/**************/
1523
1524static int ath10k_update_channel_list(struct ath10k *ar)
1525{
1526 struct ieee80211_hw *hw = ar->hw;
1527 struct ieee80211_supported_band **bands;
1528 enum ieee80211_band band;
1529 struct ieee80211_channel *channel;
1530 struct wmi_scan_chan_list_arg arg = {0};
1531 struct wmi_channel_arg *ch;
1532 bool passive;
1533 int len;
1534 int ret;
1535 int i;
1536
Michal Kazior548db542013-07-05 16:15:15 +03001537 lockdep_assert_held(&ar->conf_mutex);
1538
Kalle Valo5e3dd152013-06-12 20:52:10 +03001539 bands = hw->wiphy->bands;
1540 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1541 if (!bands[band])
1542 continue;
1543
1544 for (i = 0; i < bands[band]->n_channels; i++) {
1545 if (bands[band]->channels[i].flags &
1546 IEEE80211_CHAN_DISABLED)
1547 continue;
1548
1549 arg.n_channels++;
1550 }
1551 }
1552
1553 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1554 arg.channels = kzalloc(len, GFP_KERNEL);
1555 if (!arg.channels)
1556 return -ENOMEM;
1557
1558 ch = arg.channels;
1559 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1560 if (!bands[band])
1561 continue;
1562
1563 for (i = 0; i < bands[band]->n_channels; i++) {
1564 channel = &bands[band]->channels[i];
1565
1566 if (channel->flags & IEEE80211_CHAN_DISABLED)
1567 continue;
1568
1569 ch->allow_ht = true;
1570
1571 /* FIXME: when should we really allow VHT? */
1572 ch->allow_vht = true;
1573
1574 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001575 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001576
1577 ch->ht40plus =
1578 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1579
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001580 ch->chan_radar =
1581 !!(channel->flags & IEEE80211_CHAN_RADAR);
1582
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001583 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001584 ch->passive = passive;
1585
1586 ch->freq = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07001587 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07001588 ch->max_power = channel->max_power * 2;
1589 ch->max_reg_power = channel->max_reg_power * 2;
1590 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001591 ch->reg_class_id = 0; /* FIXME */
1592
1593 /* FIXME: why use only legacy modes, why not any
1594 * HT/VHT modes? Would that even make any
1595 * difference? */
1596 if (channel->band == IEEE80211_BAND_2GHZ)
1597 ch->mode = MODE_11G;
1598 else
1599 ch->mode = MODE_11A;
1600
1601 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1602 continue;
1603
1604 ath10k_dbg(ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03001605 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1606 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001607 ch->freq, ch->max_power, ch->max_reg_power,
1608 ch->max_antenna_gain, ch->mode);
1609
1610 ch++;
1611 }
1612 }
1613
1614 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1615 kfree(arg.channels);
1616
1617 return ret;
1618}
1619
Michal Kaziorf7843d72013-07-16 09:38:52 +02001620static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001621{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001622 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001623 int ret;
1624
Michal Kaziorf7843d72013-07-16 09:38:52 +02001625 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001626
1627 ret = ath10k_update_channel_list(ar);
1628 if (ret)
1629 ath10k_warn("could not update channel list (%d)\n", ret);
1630
1631 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001632
Kalle Valo5e3dd152013-06-12 20:52:10 +03001633 /* Target allows setting up per-band regdomain but ath_common provides
1634 * a combined one only */
1635 ret = ath10k_wmi_pdev_set_regdomain(ar,
1636 regpair->regDmnEnum,
1637 regpair->regDmnEnum, /* 2ghz */
1638 regpair->regDmnEnum, /* 5ghz */
1639 regpair->reg_2ghz_ctl,
1640 regpair->reg_5ghz_ctl);
1641 if (ret)
1642 ath10k_warn("could not set pdev regdomain (%d)\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02001643}
Michal Kazior548db542013-07-05 16:15:15 +03001644
Michal Kaziorf7843d72013-07-16 09:38:52 +02001645static void ath10k_reg_notifier(struct wiphy *wiphy,
1646 struct regulatory_request *request)
1647{
1648 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1649 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001650 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001651
1652 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1653
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001654 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1655 ath10k_dbg(ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
1656 request->dfs_region);
1657 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1658 request->dfs_region);
1659 if (!result)
1660 ath10k_warn("dfs region 0x%X not supported, will trigger radar for every pulse\n",
1661 request->dfs_region);
1662 }
1663
Michal Kaziorf7843d72013-07-16 09:38:52 +02001664 mutex_lock(&ar->conf_mutex);
1665 if (ar->state == ATH10K_STATE_ON)
1666 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03001667 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001668}
1669
1670/***************/
1671/* TX handlers */
1672/***************/
1673
Michal Kazior42c3aa62013-10-02 11:03:38 +02001674static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1675{
1676 if (ieee80211_is_mgmt(hdr->frame_control))
1677 return HTT_DATA_TX_EXT_TID_MGMT;
1678
1679 if (!ieee80211_is_data_qos(hdr->frame_control))
1680 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1681
1682 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1683 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1684
1685 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1686}
1687
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001688static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar,
1689 struct ieee80211_tx_info *info)
1690{
1691 if (info->control.vif)
1692 return ath10k_vif_to_arvif(info->control.vif)->vdev_id;
1693
1694 if (ar->monitor_enabled)
1695 return ar->monitor_vdev_id;
1696
1697 ath10k_warn("could not resolve vdev id\n");
1698 return 0;
1699}
1700
Kalle Valo5e3dd152013-06-12 20:52:10 +03001701/*
1702 * Frames sent to the FW have to be in "Native Wifi" format.
1703 * Strip the QoS field from the 802.11 header.
1704 */
1705static void ath10k_tx_h_qos_workaround(struct ieee80211_hw *hw,
1706 struct ieee80211_tx_control *control,
1707 struct sk_buff *skb)
1708{
1709 struct ieee80211_hdr *hdr = (void *)skb->data;
1710 u8 *qos_ctl;
1711
1712 if (!ieee80211_is_data_qos(hdr->frame_control))
1713 return;
1714
1715 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02001716 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1717 skb->data, (void *)qos_ctl - (void *)skb->data);
1718 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001719}
1720
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001721static void ath10k_tx_wep_key_work(struct work_struct *work)
1722{
1723 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1724 wep_key_work);
1725 int ret, keyidx = arvif->def_wep_key_newidx;
1726
1727 if (arvif->def_wep_key_idx == keyidx)
1728 return;
1729
1730 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
1731 arvif->vdev_id, keyidx);
1732
1733 ret = ath10k_wmi_vdev_set_param(arvif->ar,
1734 arvif->vdev_id,
1735 arvif->ar->wmi.vdev_param->def_keyid,
1736 keyidx);
1737 if (ret) {
1738 ath10k_warn("could not update wep keyidx (%d)\n", ret);
1739 return;
1740 }
1741
1742 arvif->def_wep_key_idx = keyidx;
1743}
1744
Kalle Valo5e3dd152013-06-12 20:52:10 +03001745static void ath10k_tx_h_update_wep_key(struct sk_buff *skb)
1746{
1747 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1748 struct ieee80211_vif *vif = info->control.vif;
1749 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1750 struct ath10k *ar = arvif->ar;
1751 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1752 struct ieee80211_key_conf *key = info->control.hw_key;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001753
Kalle Valo5e3dd152013-06-12 20:52:10 +03001754 if (!ieee80211_has_protected(hdr->frame_control))
1755 return;
1756
1757 if (!key)
1758 return;
1759
1760 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1761 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1762 return;
1763
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001764 if (key->keyidx == arvif->def_wep_key_idx)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001765 return;
1766
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001767 /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1768 * queueing frames until key index is updated is not an option because
1769 * sk_buff may need more processing to be done, e.g. offchannel */
1770 arvif->def_wep_key_newidx = key->keyidx;
1771 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001772}
1773
1774static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, struct sk_buff *skb)
1775{
1776 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1777 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1778 struct ieee80211_vif *vif = info->control.vif;
1779 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1780
1781 /* This is case only for P2P_GO */
1782 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1783 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1784 return;
1785
1786 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1787 spin_lock_bh(&ar->data_lock);
1788 if (arvif->u.ap.noa_data)
1789 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
1790 GFP_ATOMIC))
1791 memcpy(skb_put(skb, arvif->u.ap.noa_len),
1792 arvif->u.ap.noa_data,
1793 arvif->u.ap.noa_len);
1794 spin_unlock_bh(&ar->data_lock);
1795 }
1796}
1797
1798static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
1799{
1800 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001801 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001802
Michal Kazior961d4c32013-08-09 10:13:34 +02001803 if (ar->htt.target_version_major >= 3) {
1804 /* Since HTT 3.0 there is no separate mgmt tx command */
1805 ret = ath10k_htt_tx(&ar->htt, skb);
1806 goto exit;
1807 }
1808
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001809 if (ieee80211_is_mgmt(hdr->frame_control)) {
1810 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1811 ar->fw_features)) {
1812 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
1813 ATH10K_MAX_NUM_MGMT_PENDING) {
1814 ath10k_warn("wmi mgmt_tx queue limit reached\n");
1815 ret = -EBUSY;
1816 goto exit;
1817 }
1818
1819 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
1820 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
1821 } else {
1822 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1823 }
1824 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1825 ar->fw_features) &&
1826 ieee80211_is_nullfunc(hdr->frame_control)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001827 /* FW does not report tx status properly for NullFunc frames
1828 * unless they are sent through mgmt tx path. mac80211 sends
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001829 * those frames when it detects link/beacon loss and depends
1830 * on the tx status to be correct. */
Michal Kazioredb82362013-07-05 16:15:14 +03001831 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001832 } else {
Michal Kazioredb82362013-07-05 16:15:14 +03001833 ret = ath10k_htt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001834 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001835
Michal Kazior961d4c32013-08-09 10:13:34 +02001836exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03001837 if (ret) {
1838 ath10k_warn("tx failed (%d). dropping packet.\n", ret);
1839 ieee80211_free_txskb(ar->hw, skb);
1840 }
1841}
1842
1843void ath10k_offchan_tx_purge(struct ath10k *ar)
1844{
1845 struct sk_buff *skb;
1846
1847 for (;;) {
1848 skb = skb_dequeue(&ar->offchan_tx_queue);
1849 if (!skb)
1850 break;
1851
1852 ieee80211_free_txskb(ar->hw, skb);
1853 }
1854}
1855
1856void ath10k_offchan_tx_work(struct work_struct *work)
1857{
1858 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
1859 struct ath10k_peer *peer;
1860 struct ieee80211_hdr *hdr;
1861 struct sk_buff *skb;
1862 const u8 *peer_addr;
1863 int vdev_id;
1864 int ret;
1865
1866 /* FW requirement: We must create a peer before FW will send out
1867 * an offchannel frame. Otherwise the frame will be stuck and
1868 * never transmitted. We delete the peer upon tx completion.
1869 * It is unlikely that a peer for offchannel tx will already be
1870 * present. However it may be in some rare cases so account for that.
1871 * Otherwise we might remove a legitimate peer and break stuff. */
1872
1873 for (;;) {
1874 skb = skb_dequeue(&ar->offchan_tx_queue);
1875 if (!skb)
1876 break;
1877
1878 mutex_lock(&ar->conf_mutex);
1879
Kalle Valo60c3daa2013-09-08 17:56:07 +03001880 ath10k_dbg(ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001881 skb);
1882
1883 hdr = (struct ieee80211_hdr *)skb->data;
1884 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001885 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001886
1887 spin_lock_bh(&ar->data_lock);
1888 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
1889 spin_unlock_bh(&ar->data_lock);
1890
1891 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03001892 /* FIXME: should this use ath10k_warn()? */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001893 ath10k_dbg(ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
1894 peer_addr, vdev_id);
1895
1896 if (!peer) {
1897 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
1898 if (ret)
1899 ath10k_warn("peer %pM on vdev %d not created (%d)\n",
1900 peer_addr, vdev_id, ret);
1901 }
1902
1903 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08001904 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001905 ar->offchan_tx_skb = skb;
1906 spin_unlock_bh(&ar->data_lock);
1907
1908 ath10k_tx_htt(ar, skb);
1909
1910 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
1911 3 * HZ);
1912 if (ret <= 0)
1913 ath10k_warn("timed out waiting for offchannel skb %p\n",
1914 skb);
1915
1916 if (!peer) {
1917 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
1918 if (ret)
1919 ath10k_warn("peer %pM on vdev %d not deleted (%d)\n",
1920 peer_addr, vdev_id, ret);
1921 }
1922
1923 mutex_unlock(&ar->conf_mutex);
1924 }
1925}
1926
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001927void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
1928{
1929 struct sk_buff *skb;
1930
1931 for (;;) {
1932 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
1933 if (!skb)
1934 break;
1935
1936 ieee80211_free_txskb(ar->hw, skb);
1937 }
1938}
1939
1940void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
1941{
1942 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
1943 struct sk_buff *skb;
1944 int ret;
1945
1946 for (;;) {
1947 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
1948 if (!skb)
1949 break;
1950
1951 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01001952 if (ret) {
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001953 ath10k_warn("wmi mgmt_tx failed (%d)\n", ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01001954 ieee80211_free_txskb(ar->hw, skb);
1955 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001956 }
1957}
1958
Kalle Valo5e3dd152013-06-12 20:52:10 +03001959/************/
1960/* Scanning */
1961/************/
1962
1963/*
1964 * This gets called if we dont get a heart-beat during scan.
1965 * This may indicate the FW has hung and we need to abort the
1966 * scan manually to prevent cancel_hw_scan() from deadlocking
1967 */
1968void ath10k_reset_scan(unsigned long ptr)
1969{
1970 struct ath10k *ar = (struct ath10k *)ptr;
1971
1972 spin_lock_bh(&ar->data_lock);
1973 if (!ar->scan.in_progress) {
1974 spin_unlock_bh(&ar->data_lock);
1975 return;
1976 }
1977
1978 ath10k_warn("scan timeout. resetting. fw issue?\n");
1979
1980 if (ar->scan.is_roc)
1981 ieee80211_remain_on_channel_expired(ar->hw);
1982 else
1983 ieee80211_scan_completed(ar->hw, 1 /* aborted */);
1984
1985 ar->scan.in_progress = false;
1986 complete_all(&ar->scan.completed);
1987 spin_unlock_bh(&ar->data_lock);
1988}
1989
1990static int ath10k_abort_scan(struct ath10k *ar)
1991{
1992 struct wmi_stop_scan_arg arg = {
1993 .req_id = 1, /* FIXME */
1994 .req_type = WMI_SCAN_STOP_ONE,
1995 .u.scan_id = ATH10K_SCAN_ID,
1996 };
1997 int ret;
1998
1999 lockdep_assert_held(&ar->conf_mutex);
2000
2001 del_timer_sync(&ar->scan.timeout);
2002
2003 spin_lock_bh(&ar->data_lock);
2004 if (!ar->scan.in_progress) {
2005 spin_unlock_bh(&ar->data_lock);
2006 return 0;
2007 }
2008
2009 ar->scan.aborting = true;
2010 spin_unlock_bh(&ar->data_lock);
2011
2012 ret = ath10k_wmi_stop_scan(ar, &arg);
2013 if (ret) {
2014 ath10k_warn("could not submit wmi stop scan (%d)\n", ret);
Michal Kazioradb8c9b2013-07-05 16:15:16 +03002015 spin_lock_bh(&ar->data_lock);
2016 ar->scan.in_progress = false;
2017 ath10k_offchan_tx_purge(ar);
2018 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002019 return -EIO;
2020 }
2021
Kalle Valo5e3dd152013-06-12 20:52:10 +03002022 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
2023 if (ret == 0)
2024 ath10k_warn("timed out while waiting for scan to stop\n");
2025
2026 /* scan completion may be done right after we timeout here, so let's
2027 * check the in_progress and tell mac80211 scan is completed. if we
2028 * don't do that and FW fails to send us scan completion indication
2029 * then userspace won't be able to scan anymore */
2030 ret = 0;
2031
2032 spin_lock_bh(&ar->data_lock);
2033 if (ar->scan.in_progress) {
2034 ath10k_warn("could not stop scan. its still in progress\n");
2035 ar->scan.in_progress = false;
2036 ath10k_offchan_tx_purge(ar);
2037 ret = -ETIMEDOUT;
2038 }
2039 spin_unlock_bh(&ar->data_lock);
2040
2041 return ret;
2042}
2043
2044static int ath10k_start_scan(struct ath10k *ar,
2045 const struct wmi_start_scan_arg *arg)
2046{
2047 int ret;
2048
2049 lockdep_assert_held(&ar->conf_mutex);
2050
2051 ret = ath10k_wmi_start_scan(ar, arg);
2052 if (ret)
2053 return ret;
2054
Kalle Valo5e3dd152013-06-12 20:52:10 +03002055 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2056 if (ret == 0) {
2057 ath10k_abort_scan(ar);
2058 return ret;
2059 }
2060
2061 /* the scan can complete earlier, before we even
2062 * start the timer. in that case the timer handler
2063 * checks ar->scan.in_progress and bails out if its
2064 * false. Add a 200ms margin to account event/command
2065 * processing. */
2066 mod_timer(&ar->scan.timeout, jiffies +
2067 msecs_to_jiffies(arg->max_scan_time+200));
2068 return 0;
2069}
2070
2071/**********************/
2072/* mac80211 callbacks */
2073/**********************/
2074
2075static void ath10k_tx(struct ieee80211_hw *hw,
2076 struct ieee80211_tx_control *control,
2077 struct sk_buff *skb)
2078{
2079 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2080 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2081 struct ath10k *ar = hw->priv;
Michal Kaziorddb6ad72013-10-02 11:03:39 +02002082 u8 tid, vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002083
2084 /* We should disable CCK RATE due to P2P */
2085 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2086 ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2087
2088 /* we must calculate tid before we apply qos workaround
2089 * as we'd lose the qos control field */
Michal Kazior42c3aa62013-10-02 11:03:38 +02002090 tid = ath10k_tx_h_get_tid(hdr);
Michal Kaziorddb6ad72013-10-02 11:03:39 +02002091 vdev_id = ath10k_tx_h_get_vdev_id(ar, info);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002092
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002093 /* it makes no sense to process injected frames like that */
2094 if (info->control.vif &&
2095 info->control.vif->type != NL80211_IFTYPE_MONITOR) {
2096 ath10k_tx_h_qos_workaround(hw, control, skb);
2097 ath10k_tx_h_update_wep_key(skb);
2098 ath10k_tx_h_add_p2p_noa_ie(ar, skb);
2099 ath10k_tx_h_seq_no(skb);
2100 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002101
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002102 ATH10K_SKB_CB(skb)->vdev_id = vdev_id;
Michal Kazior27bb1782013-09-18 14:43:19 +02002103 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002104 ATH10K_SKB_CB(skb)->htt.tid = tid;
2105
2106 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2107 spin_lock_bh(&ar->data_lock);
2108 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002109 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002110 spin_unlock_bh(&ar->data_lock);
2111
2112 ath10k_dbg(ATH10K_DBG_MAC, "queued offchannel skb %p\n", skb);
2113
2114 skb_queue_tail(&ar->offchan_tx_queue, skb);
2115 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2116 return;
2117 }
2118
2119 ath10k_tx_htt(ar, skb);
2120}
2121
2122/*
2123 * Initialize various parameters with default vaules.
2124 */
Michal Kazioraffd3212013-07-16 09:54:35 +02002125void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02002126{
2127 lockdep_assert_held(&ar->conf_mutex);
2128
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002129 ath10k_stop_cac(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02002130 del_timer_sync(&ar->scan.timeout);
2131 ath10k_offchan_tx_purge(ar);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002132 ath10k_mgmt_over_wmi_tx_purge(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02002133 ath10k_peer_cleanup_all(ar);
2134 ath10k_core_stop(ar);
2135 ath10k_hif_power_down(ar);
2136
2137 spin_lock_bh(&ar->data_lock);
2138 if (ar->scan.in_progress) {
2139 del_timer(&ar->scan.timeout);
2140 ar->scan.in_progress = false;
2141 ieee80211_scan_completed(ar->hw, true);
2142 }
2143 spin_unlock_bh(&ar->data_lock);
2144}
2145
Kalle Valo5e3dd152013-06-12 20:52:10 +03002146static int ath10k_start(struct ieee80211_hw *hw)
2147{
2148 struct ath10k *ar = hw->priv;
Michal Kazior818bdd12013-07-16 09:38:57 +02002149 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002150
Michal Kazior548db542013-07-05 16:15:15 +03002151 mutex_lock(&ar->conf_mutex);
2152
Michal Kazioraffd3212013-07-16 09:54:35 +02002153 if (ar->state != ATH10K_STATE_OFF &&
2154 ar->state != ATH10K_STATE_RESTARTING) {
Michal Kazior818bdd12013-07-16 09:38:57 +02002155 ret = -EINVAL;
2156 goto exit;
2157 }
2158
2159 ret = ath10k_hif_power_up(ar);
2160 if (ret) {
2161 ath10k_err("could not init hif (%d)\n", ret);
2162 ar->state = ATH10K_STATE_OFF;
2163 goto exit;
2164 }
2165
2166 ret = ath10k_core_start(ar);
2167 if (ret) {
2168 ath10k_err("could not init core (%d)\n", ret);
2169 ath10k_hif_power_down(ar);
2170 ar->state = ATH10K_STATE_OFF;
2171 goto exit;
2172 }
2173
Michal Kazioraffd3212013-07-16 09:54:35 +02002174 if (ar->state == ATH10K_STATE_OFF)
2175 ar->state = ATH10K_STATE_ON;
2176 else if (ar->state == ATH10K_STATE_RESTARTING)
2177 ar->state = ATH10K_STATE_RESTARTED;
2178
Bartosz Markowski226a3392013-09-26 17:47:16 +02002179 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002180 if (ret)
2181 ath10k_warn("could not enable WMI_PDEV_PARAM_PMF_QOS (%d)\n",
2182 ret);
2183
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01002184 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002185 if (ret)
2186 ath10k_warn("could not init WMI_PDEV_PARAM_DYNAMIC_BW (%d)\n",
2187 ret);
2188
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002189 /*
2190 * By default FW set ARP frames ac to voice (6). In that case ARP
2191 * exchange is not working properly for UAPSD enabled AP. ARP requests
2192 * which arrives with access category 0 are processed by network stack
2193 * and send back with access category 0, but FW changes access category
2194 * to 6. Set ARP frames access category to best effort (0) solves
2195 * this problem.
2196 */
2197
2198 ret = ath10k_wmi_pdev_set_param(ar,
2199 ar->wmi.pdev_param->arp_ac_override, 0);
2200 if (ret) {
2201 ath10k_warn("could not set arp ac override parameter: %d\n",
2202 ret);
2203 goto exit;
2204 }
2205
Michal Kaziorf7843d72013-07-16 09:38:52 +02002206 ath10k_regd_update(ar);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01002207 ret = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002208
Michal Kazior818bdd12013-07-16 09:38:57 +02002209exit:
Michal Kazior548db542013-07-05 16:15:15 +03002210 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01002211 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002212}
2213
2214static void ath10k_stop(struct ieee80211_hw *hw)
2215{
2216 struct ath10k *ar = hw->priv;
2217
Michal Kazior548db542013-07-05 16:15:15 +03002218 mutex_lock(&ar->conf_mutex);
Michal Kazioraffd3212013-07-16 09:54:35 +02002219 if (ar->state == ATH10K_STATE_ON ||
2220 ar->state == ATH10K_STATE_RESTARTED ||
2221 ar->state == ATH10K_STATE_WEDGED)
Michal Kazior818bdd12013-07-16 09:38:57 +02002222 ath10k_halt(ar);
Michal Kaziora96d7742013-07-16 09:38:56 +02002223
Michal Kaziorf7843d72013-07-16 09:38:52 +02002224 ar->state = ATH10K_STATE_OFF;
Michal Kazior548db542013-07-05 16:15:15 +03002225 mutex_unlock(&ar->conf_mutex);
2226
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002227 ath10k_mgmt_over_wmi_tx_purge(ar);
2228
Michal Kazior548db542013-07-05 16:15:15 +03002229 cancel_work_sync(&ar->offchan_tx_work);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002230 cancel_work_sync(&ar->wmi_mgmt_tx_work);
Michal Kazioraffd3212013-07-16 09:54:35 +02002231 cancel_work_sync(&ar->restart_work);
2232}
2233
Michal Kaziorad088bf2013-10-16 15:44:46 +03002234static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02002235{
Michal Kaziorad088bf2013-10-16 15:44:46 +03002236 struct ath10k_vif *arvif;
2237 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02002238
2239 lockdep_assert_held(&ar->conf_mutex);
2240
Michal Kaziorad088bf2013-10-16 15:44:46 +03002241 list_for_each_entry(arvif, &ar->arvifs, list) {
2242 ret = ath10k_mac_vif_setup_ps(arvif);
2243 if (ret) {
2244 ath10k_warn("could not setup powersave (%d)\n", ret);
2245 break;
2246 }
2247 }
Michal Kazioraffd3212013-07-16 09:54:35 +02002248
Michal Kaziorad088bf2013-10-16 15:44:46 +03002249 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002250}
2251
Michal Kaziorc930f742014-01-23 11:38:25 +01002252static const char *chandef_get_width(enum nl80211_chan_width width)
2253{
2254 switch (width) {
2255 case NL80211_CHAN_WIDTH_20_NOHT:
2256 return "20 (noht)";
2257 case NL80211_CHAN_WIDTH_20:
2258 return "20";
2259 case NL80211_CHAN_WIDTH_40:
2260 return "40";
2261 case NL80211_CHAN_WIDTH_80:
2262 return "80";
2263 case NL80211_CHAN_WIDTH_80P80:
2264 return "80+80";
2265 case NL80211_CHAN_WIDTH_160:
2266 return "160";
2267 case NL80211_CHAN_WIDTH_5:
2268 return "5";
2269 case NL80211_CHAN_WIDTH_10:
2270 return "10";
2271 }
2272 return "?";
2273}
2274
2275static void ath10k_config_chan(struct ath10k *ar)
2276{
2277 struct ath10k_vif *arvif;
2278 bool monitor_was_enabled;
2279 int ret;
2280
2281 lockdep_assert_held(&ar->conf_mutex);
2282
2283 ath10k_dbg(ATH10K_DBG_MAC,
2284 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2285 ar->chandef.chan->center_freq,
2286 ar->chandef.center_freq1,
2287 ar->chandef.center_freq2,
2288 chandef_get_width(ar->chandef.width));
2289
2290 /* First stop monitor interface. Some FW versions crash if there's a
2291 * lone monitor interface. */
2292 monitor_was_enabled = ar->monitor_enabled;
2293
2294 if (ar->monitor_enabled)
2295 ath10k_monitor_stop(ar);
2296
2297 list_for_each_entry(arvif, &ar->arvifs, list) {
2298 if (!arvif->is_started)
2299 continue;
2300
2301 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2302 continue;
2303
2304 ret = ath10k_vdev_stop(arvif);
2305 if (ret) {
2306 ath10k_warn("could not stop vdev %d (%d)\n",
2307 arvif->vdev_id, ret);
2308 continue;
2309 }
2310 }
2311
2312 /* all vdevs are now stopped - now attempt to restart them */
2313
2314 list_for_each_entry(arvif, &ar->arvifs, list) {
2315 if (!arvif->is_started)
2316 continue;
2317
2318 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2319 continue;
2320
2321 ret = ath10k_vdev_start(arvif);
2322 if (ret) {
2323 ath10k_warn("could not start vdev %d (%d)\n",
2324 arvif->vdev_id, ret);
2325 continue;
2326 }
2327
2328 if (!arvif->is_up)
2329 continue;
2330
2331 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
2332 arvif->bssid);
2333 if (ret) {
2334 ath10k_warn("could not bring vdev up %d (%d)\n",
2335 arvif->vdev_id, ret);
2336 continue;
2337 }
2338 }
2339
2340 if (monitor_was_enabled)
2341 ath10k_monitor_start(ar, ar->monitor_vdev_id);
2342}
2343
Kalle Valo5e3dd152013-06-12 20:52:10 +03002344static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2345{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002346 struct ath10k *ar = hw->priv;
2347 struct ieee80211_conf *conf = &hw->conf;
2348 int ret = 0;
Michal Kazior5474efe2013-10-23 04:02:15 -07002349 u32 param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002350
2351 mutex_lock(&ar->conf_mutex);
2352
2353 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002354 ath10k_dbg(ATH10K_DBG_MAC,
2355 "mac config channel %d mhz flags 0x%x\n",
2356 conf->chandef.chan->center_freq,
2357 conf->chandef.chan->flags);
2358
Kalle Valo5e3dd152013-06-12 20:52:10 +03002359 spin_lock_bh(&ar->data_lock);
2360 ar->rx_channel = conf->chandef.chan;
2361 spin_unlock_bh(&ar->data_lock);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002362
2363 ath10k_config_radar_detection(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002364
2365 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
2366 ar->chandef = conf->chandef;
2367 ath10k_config_chan(ar);
2368 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002369 }
2370
Michal Kazior5474efe2013-10-23 04:02:15 -07002371 if (changed & IEEE80211_CONF_CHANGE_POWER) {
2372 ath10k_dbg(ATH10K_DBG_MAC, "mac config power %d\n",
2373 hw->conf.power_level);
2374
2375 param = ar->wmi.pdev_param->txpower_limit2g;
2376 ret = ath10k_wmi_pdev_set_param(ar, param,
2377 hw->conf.power_level * 2);
2378 if (ret)
2379 ath10k_warn("mac failed to set 2g txpower %d (%d)\n",
2380 hw->conf.power_level, ret);
2381
2382 param = ar->wmi.pdev_param->txpower_limit5g;
2383 ret = ath10k_wmi_pdev_set_param(ar, param,
2384 hw->conf.power_level * 2);
2385 if (ret)
2386 ath10k_warn("mac failed to set 5g txpower %d (%d)\n",
2387 hw->conf.power_level, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002388 }
2389
Michal Kazioraffd3212013-07-16 09:54:35 +02002390 if (changed & IEEE80211_CONF_CHANGE_PS)
2391 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002392
2393 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
2394 if (conf->flags & IEEE80211_CONF_MONITOR)
2395 ret = ath10k_monitor_create(ar);
2396 else
2397 ret = ath10k_monitor_destroy(ar);
2398 }
2399
2400 mutex_unlock(&ar->conf_mutex);
2401 return ret;
2402}
2403
2404/*
2405 * TODO:
2406 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2407 * because we will send mgmt frames without CCK. This requirement
2408 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2409 * in the TX packet.
2410 */
2411static int ath10k_add_interface(struct ieee80211_hw *hw,
2412 struct ieee80211_vif *vif)
2413{
2414 struct ath10k *ar = hw->priv;
2415 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2416 enum wmi_sta_powersave_param param;
2417 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02002418 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002419 int bit;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002420 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002421
2422 mutex_lock(&ar->conf_mutex);
2423
Michal Kazior0dbd09e2013-07-31 10:55:14 +02002424 memset(arvif, 0, sizeof(*arvif));
2425
Kalle Valo5e3dd152013-06-12 20:52:10 +03002426 arvif->ar = ar;
2427 arvif->vif = vif;
2428
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002429 INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
Ben Greeare63b33f2013-10-22 14:54:14 -07002430 INIT_LIST_HEAD(&arvif->list);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002431
Kalle Valo5e3dd152013-06-12 20:52:10 +03002432 if ((vif->type == NL80211_IFTYPE_MONITOR) && ar->monitor_present) {
2433 ath10k_warn("Only one monitor interface allowed\n");
2434 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03002435 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002436 }
2437
2438 bit = ffs(ar->free_vdev_map);
2439 if (bit == 0) {
2440 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03002441 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002442 }
2443
2444 arvif->vdev_id = bit - 1;
2445 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002446
2447 if (ar->p2p)
2448 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2449
2450 switch (vif->type) {
2451 case NL80211_IFTYPE_UNSPECIFIED:
2452 case NL80211_IFTYPE_STATION:
2453 arvif->vdev_type = WMI_VDEV_TYPE_STA;
2454 if (vif->p2p)
2455 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2456 break;
2457 case NL80211_IFTYPE_ADHOC:
2458 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2459 break;
2460 case NL80211_IFTYPE_AP:
2461 arvif->vdev_type = WMI_VDEV_TYPE_AP;
2462
2463 if (vif->p2p)
2464 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2465 break;
2466 case NL80211_IFTYPE_MONITOR:
2467 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2468 break;
2469 default:
2470 WARN_ON(1);
2471 break;
2472 }
2473
Kalle Valo60c3daa2013-09-08 17:56:07 +03002474 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002475 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype);
2476
2477 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2478 arvif->vdev_subtype, vif->addr);
2479 if (ret) {
2480 ath10k_warn("WMI vdev create failed: ret %d\n", ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002481 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002482 }
2483
Michal Kazior9dad14a2013-10-16 15:44:45 +03002484 ar->free_vdev_map &= ~BIT(arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002485 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002486
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002487 vdev_param = ar->wmi.vdev_param->def_keyid;
2488 ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002489 arvif->def_wep_key_idx);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002490 if (ret) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002491 ath10k_warn("Failed to set default keyid: %d\n", ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002492 goto err_vdev_delete;
2493 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002494
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002495 vdev_param = ar->wmi.vdev_param->tx_encap_type;
2496 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002497 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02002498 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03002499 if (ret && ret != -EOPNOTSUPP) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002500 ath10k_warn("Failed to set TX encap: %d\n", ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002501 goto err_vdev_delete;
2502 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002503
2504 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2505 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
2506 if (ret) {
2507 ath10k_warn("Failed to create peer for AP: %d\n", ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002508 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002509 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01002510
Kalle Valo5a13e762014-01-20 11:01:46 +02002511 ret = ath10k_mac_set_kickout(arvif);
2512 if (ret) {
2513 ath10k_warn("Failed to set kickout parameters: %d\n",
2514 ret);
2515 goto err_peer_delete;
2516 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002517 }
2518
2519 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
2520 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
2521 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2522 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2523 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002524 if (ret) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002525 ath10k_warn("Failed to set RX wake policy: %d\n", ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002526 goto err_peer_delete;
2527 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002528
2529 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
2530 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
2531 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2532 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002533 if (ret) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002534 ath10k_warn("Failed to set TX wake thresh: %d\n", ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002535 goto err_peer_delete;
2536 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002537
2538 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
2539 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
2540 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2541 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002542 if (ret) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002543 ath10k_warn("Failed to set PSPOLL count: %d\n", ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002544 goto err_peer_delete;
2545 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002546 }
2547
Michal Kazior424121c2013-07-22 14:13:31 +02002548 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002549 if (ret) {
Michal Kazior679c54a2013-07-05 16:15:04 +03002550 ath10k_warn("failed to set rts threshold for vdev %d (%d)\n",
2551 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002552 goto err_peer_delete;
2553 }
Michal Kazior679c54a2013-07-05 16:15:04 +03002554
Michal Kazior424121c2013-07-22 14:13:31 +02002555 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002556 if (ret) {
Michal Kazior679c54a2013-07-05 16:15:04 +03002557 ath10k_warn("failed to set frag threshold for vdev %d (%d)\n",
2558 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002559 goto err_peer_delete;
2560 }
Michal Kazior679c54a2013-07-05 16:15:04 +03002561
Kalle Valo5e3dd152013-06-12 20:52:10 +03002562 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2563 ar->monitor_present = true;
2564
Kalle Valo5e3dd152013-06-12 20:52:10 +03002565 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002566 return 0;
2567
2568err_peer_delete:
2569 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
2570 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
2571
2572err_vdev_delete:
2573 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2574 ar->free_vdev_map &= ~BIT(arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002575 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002576
2577err:
2578 mutex_unlock(&ar->conf_mutex);
2579
Kalle Valo5e3dd152013-06-12 20:52:10 +03002580 return ret;
2581}
2582
2583static void ath10k_remove_interface(struct ieee80211_hw *hw,
2584 struct ieee80211_vif *vif)
2585{
2586 struct ath10k *ar = hw->priv;
2587 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2588 int ret;
2589
2590 mutex_lock(&ar->conf_mutex);
2591
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002592 cancel_work_sync(&arvif->wep_key_work);
2593
Michal Kaziored543882013-09-13 14:16:56 +02002594 spin_lock_bh(&ar->data_lock);
2595 if (arvif->beacon) {
2596 dev_kfree_skb_any(arvif->beacon);
2597 arvif->beacon = NULL;
2598 }
2599 spin_unlock_bh(&ar->data_lock);
2600
Kalle Valo5e3dd152013-06-12 20:52:10 +03002601 ar->free_vdev_map |= 1 << (arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002602 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002603
2604 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2605 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
2606 if (ret)
2607 ath10k_warn("Failed to remove peer for AP: %d\n", ret);
2608
2609 kfree(arvif->u.ap.noa_data);
2610 }
2611
Kalle Valo60c3daa2013-09-08 17:56:07 +03002612 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev delete %d (remove interface)\n",
2613 arvif->vdev_id);
2614
Kalle Valo5e3dd152013-06-12 20:52:10 +03002615 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2616 if (ret)
2617 ath10k_warn("WMI vdev delete failed: %d\n", ret);
2618
2619 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2620 ar->monitor_present = false;
2621
2622 ath10k_peer_cleanup(ar, arvif->vdev_id);
2623
2624 mutex_unlock(&ar->conf_mutex);
2625}
2626
2627/*
2628 * FIXME: Has to be verified.
2629 */
2630#define SUPPORTED_FILTERS \
2631 (FIF_PROMISC_IN_BSS | \
2632 FIF_ALLMULTI | \
2633 FIF_CONTROL | \
2634 FIF_PSPOLL | \
2635 FIF_OTHER_BSS | \
2636 FIF_BCN_PRBRESP_PROMISC | \
2637 FIF_PROBE_REQ | \
2638 FIF_FCSFAIL)
2639
2640static void ath10k_configure_filter(struct ieee80211_hw *hw,
2641 unsigned int changed_flags,
2642 unsigned int *total_flags,
2643 u64 multicast)
2644{
2645 struct ath10k *ar = hw->priv;
2646 int ret;
2647
2648 mutex_lock(&ar->conf_mutex);
2649
2650 changed_flags &= SUPPORTED_FILTERS;
2651 *total_flags &= SUPPORTED_FILTERS;
2652 ar->filter_flags = *total_flags;
2653
Michal Kaziorafd09222013-10-16 16:45:41 +03002654 /* Monitor must not be started if it wasn't created first.
2655 * Promiscuous mode may be started on a non-monitor interface - in
2656 * such case the monitor vdev is not created so starting the
2657 * monitor makes no sense. Since ath10k uses no special RX filters
2658 * (only BSS filter in STA mode) there's no need for any special
2659 * action here. */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002660 if ((ar->filter_flags & FIF_PROMISC_IN_BSS) &&
Michal Kaziorafd09222013-10-16 16:45:41 +03002661 !ar->monitor_enabled && ar->monitor_present) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03002662 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor %d start\n",
2663 ar->monitor_vdev_id);
2664
Kalle Valo5e3dd152013-06-12 20:52:10 +03002665 ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
2666 if (ret)
2667 ath10k_warn("Unable to start monitor mode\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002668 } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) &&
Michal Kaziorafd09222013-10-16 16:45:41 +03002669 ar->monitor_enabled && ar->monitor_present) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03002670 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor %d stop\n",
2671 ar->monitor_vdev_id);
2672
Kalle Valo5e3dd152013-06-12 20:52:10 +03002673 ret = ath10k_monitor_stop(ar);
2674 if (ret)
2675 ath10k_warn("Unable to stop monitor mode\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002676 }
2677
2678 mutex_unlock(&ar->conf_mutex);
2679}
2680
2681static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
2682 struct ieee80211_vif *vif,
2683 struct ieee80211_bss_conf *info,
2684 u32 changed)
2685{
2686 struct ath10k *ar = hw->priv;
2687 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2688 int ret = 0;
Bartosz Markowski226a3392013-09-26 17:47:16 +02002689 u32 vdev_param, pdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002690
2691 mutex_lock(&ar->conf_mutex);
2692
2693 if (changed & BSS_CHANGED_IBSS)
2694 ath10k_control_ibss(arvif, info, vif->addr);
2695
2696 if (changed & BSS_CHANGED_BEACON_INT) {
2697 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002698 vdev_param = ar->wmi.vdev_param->beacon_interval;
2699 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002700 arvif->beacon_interval);
Kalle Valo60c3daa2013-09-08 17:56:07 +03002701 ath10k_dbg(ATH10K_DBG_MAC,
2702 "mac vdev %d beacon_interval %d\n",
2703 arvif->vdev_id, arvif->beacon_interval);
2704
Kalle Valo5e3dd152013-06-12 20:52:10 +03002705 if (ret)
2706 ath10k_warn("Failed to set beacon interval for VDEV: %d\n",
2707 arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002708 }
2709
2710 if (changed & BSS_CHANGED_BEACON) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03002711 ath10k_dbg(ATH10K_DBG_MAC,
2712 "vdev %d set beacon tx mode to staggered\n",
2713 arvif->vdev_id);
2714
Bartosz Markowski226a3392013-09-26 17:47:16 +02002715 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
2716 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002717 WMI_BEACON_STAGGERED_MODE);
2718 if (ret)
2719 ath10k_warn("Failed to set beacon mode for VDEV: %d\n",
2720 arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002721 }
2722
John W. Linvilleb70727e2013-06-13 13:34:29 -04002723 if (changed & BSS_CHANGED_BEACON_INFO) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002724 arvif->dtim_period = info->dtim_period;
2725
Kalle Valo60c3daa2013-09-08 17:56:07 +03002726 ath10k_dbg(ATH10K_DBG_MAC,
2727 "mac vdev %d dtim_period %d\n",
2728 arvif->vdev_id, arvif->dtim_period);
2729
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002730 vdev_param = ar->wmi.vdev_param->dtim_period;
2731 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002732 arvif->dtim_period);
2733 if (ret)
2734 ath10k_warn("Failed to set dtim period for VDEV: %d\n",
2735 arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002736 }
2737
2738 if (changed & BSS_CHANGED_SSID &&
2739 vif->type == NL80211_IFTYPE_AP) {
2740 arvif->u.ap.ssid_len = info->ssid_len;
2741 if (info->ssid_len)
2742 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
2743 arvif->u.ap.hidden_ssid = info->hidden_ssid;
2744 }
2745
2746 if (changed & BSS_CHANGED_BSSID) {
2747 if (!is_zero_ether_addr(info->bssid)) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03002748 ath10k_dbg(ATH10K_DBG_MAC,
2749 "mac vdev %d create peer %pM\n",
2750 arvif->vdev_id, info->bssid);
2751
Kalle Valo5e3dd152013-06-12 20:52:10 +03002752 ret = ath10k_peer_create(ar, arvif->vdev_id,
2753 info->bssid);
2754 if (ret)
Ben Greear479398b2013-11-04 09:19:34 -08002755 ath10k_warn("Failed to add peer %pM for vdev %d when changin bssid: %i\n",
2756 info->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002757
2758 if (vif->type == NL80211_IFTYPE_STATION) {
2759 /*
2760 * this is never erased as we it for crypto key
2761 * clearing; this is FW requirement
2762 */
Michal Kaziorc930f742014-01-23 11:38:25 +01002763 memcpy(arvif->bssid, info->bssid, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002764
Kalle Valo60c3daa2013-09-08 17:56:07 +03002765 ath10k_dbg(ATH10K_DBG_MAC,
2766 "mac vdev %d start %pM\n",
2767 arvif->vdev_id, info->bssid);
2768
Kalle Valo5e3dd152013-06-12 20:52:10 +03002769 ret = ath10k_vdev_start(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +01002770 if (ret) {
2771 ath10k_warn("failed to start vdev: %d\n",
2772 ret);
2773 return;
2774 }
2775
2776 arvif->is_started = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002777 }
2778
2779 /*
2780 * Mac80211 does not keep IBSS bssid when leaving IBSS,
2781 * so driver need to store it. It is needed when leaving
2782 * IBSS in order to remove BSSID peer.
2783 */
2784 if (vif->type == NL80211_IFTYPE_ADHOC)
Michal Kaziorc930f742014-01-23 11:38:25 +01002785 memcpy(arvif->bssid, info->bssid,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002786 ETH_ALEN);
2787 }
2788 }
2789
2790 if (changed & BSS_CHANGED_BEACON_ENABLED)
2791 ath10k_control_beaconing(arvif, info);
2792
2793 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2794 u32 cts_prot;
2795 if (info->use_cts_prot)
2796 cts_prot = 1;
2797 else
2798 cts_prot = 0;
2799
Kalle Valo60c3daa2013-09-08 17:56:07 +03002800 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
2801 arvif->vdev_id, cts_prot);
2802
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002803 vdev_param = ar->wmi.vdev_param->enable_rtscts;
2804 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002805 cts_prot);
2806 if (ret)
2807 ath10k_warn("Failed to set CTS prot for VDEV: %d\n",
2808 arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002809 }
2810
2811 if (changed & BSS_CHANGED_ERP_SLOT) {
2812 u32 slottime;
2813 if (info->use_short_slot)
2814 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2815
2816 else
2817 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2818
Kalle Valo60c3daa2013-09-08 17:56:07 +03002819 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
2820 arvif->vdev_id, slottime);
2821
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002822 vdev_param = ar->wmi.vdev_param->slot_time;
2823 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002824 slottime);
2825 if (ret)
2826 ath10k_warn("Failed to set erp slot for VDEV: %d\n",
2827 arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002828 }
2829
2830 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2831 u32 preamble;
2832 if (info->use_short_preamble)
2833 preamble = WMI_VDEV_PREAMBLE_SHORT;
2834 else
2835 preamble = WMI_VDEV_PREAMBLE_LONG;
2836
Kalle Valo60c3daa2013-09-08 17:56:07 +03002837 ath10k_dbg(ATH10K_DBG_MAC,
2838 "mac vdev %d preamble %dn",
2839 arvif->vdev_id, preamble);
2840
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002841 vdev_param = ar->wmi.vdev_param->preamble;
2842 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002843 preamble);
2844 if (ret)
2845 ath10k_warn("Failed to set preamble for VDEV: %d\n",
2846 arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002847 }
2848
2849 if (changed & BSS_CHANGED_ASSOC) {
2850 if (info->assoc)
2851 ath10k_bss_assoc(hw, vif, info);
2852 }
2853
2854 mutex_unlock(&ar->conf_mutex);
2855}
2856
2857static int ath10k_hw_scan(struct ieee80211_hw *hw,
2858 struct ieee80211_vif *vif,
2859 struct cfg80211_scan_request *req)
2860{
2861 struct ath10k *ar = hw->priv;
2862 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2863 struct wmi_start_scan_arg arg;
2864 int ret = 0;
2865 int i;
2866
2867 mutex_lock(&ar->conf_mutex);
2868
2869 spin_lock_bh(&ar->data_lock);
2870 if (ar->scan.in_progress) {
2871 spin_unlock_bh(&ar->data_lock);
2872 ret = -EBUSY;
2873 goto exit;
2874 }
2875
Wolfram Sang16735d02013-11-14 14:32:02 -08002876 reinit_completion(&ar->scan.started);
2877 reinit_completion(&ar->scan.completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002878 ar->scan.in_progress = true;
2879 ar->scan.aborting = false;
2880 ar->scan.is_roc = false;
2881 ar->scan.vdev_id = arvif->vdev_id;
2882 spin_unlock_bh(&ar->data_lock);
2883
2884 memset(&arg, 0, sizeof(arg));
2885 ath10k_wmi_start_scan_init(ar, &arg);
2886 arg.vdev_id = arvif->vdev_id;
2887 arg.scan_id = ATH10K_SCAN_ID;
2888
2889 if (!req->no_cck)
2890 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
2891
2892 if (req->ie_len) {
2893 arg.ie_len = req->ie_len;
2894 memcpy(arg.ie, req->ie, arg.ie_len);
2895 }
2896
2897 if (req->n_ssids) {
2898 arg.n_ssids = req->n_ssids;
2899 for (i = 0; i < arg.n_ssids; i++) {
2900 arg.ssids[i].len = req->ssids[i].ssid_len;
2901 arg.ssids[i].ssid = req->ssids[i].ssid;
2902 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02002903 } else {
2904 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002905 }
2906
2907 if (req->n_channels) {
2908 arg.n_channels = req->n_channels;
2909 for (i = 0; i < arg.n_channels; i++)
2910 arg.channels[i] = req->channels[i]->center_freq;
2911 }
2912
2913 ret = ath10k_start_scan(ar, &arg);
2914 if (ret) {
2915 ath10k_warn("could not start hw scan (%d)\n", ret);
2916 spin_lock_bh(&ar->data_lock);
2917 ar->scan.in_progress = false;
2918 spin_unlock_bh(&ar->data_lock);
2919 }
2920
2921exit:
2922 mutex_unlock(&ar->conf_mutex);
2923 return ret;
2924}
2925
2926static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
2927 struct ieee80211_vif *vif)
2928{
2929 struct ath10k *ar = hw->priv;
2930 int ret;
2931
2932 mutex_lock(&ar->conf_mutex);
2933 ret = ath10k_abort_scan(ar);
2934 if (ret) {
2935 ath10k_warn("couldn't abort scan (%d). forcefully sending scan completion to mac80211\n",
2936 ret);
2937 ieee80211_scan_completed(hw, 1 /* aborted */);
2938 }
2939 mutex_unlock(&ar->conf_mutex);
2940}
2941
Michal Kaziorcfb27d22013-12-02 09:06:36 +01002942static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
2943 struct ath10k_vif *arvif,
2944 enum set_key_cmd cmd,
2945 struct ieee80211_key_conf *key)
2946{
2947 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
2948 int ret;
2949
2950 /* 10.1 firmware branch requires default key index to be set to group
2951 * key index after installing it. Otherwise FW/HW Txes corrupted
2952 * frames with multi-vif APs. This is not required for main firmware
2953 * branch (e.g. 636).
2954 *
2955 * FIXME: This has been tested only in AP. It remains unknown if this
2956 * is required for multi-vif STA interfaces on 10.1 */
2957
2958 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
2959 return;
2960
2961 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
2962 return;
2963
2964 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
2965 return;
2966
2967 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
2968 return;
2969
2970 if (cmd != SET_KEY)
2971 return;
2972
2973 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
2974 key->keyidx);
2975 if (ret)
2976 ath10k_warn("failed to set group key as default key: %d\n",
2977 ret);
2978}
2979
Kalle Valo5e3dd152013-06-12 20:52:10 +03002980static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2981 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2982 struct ieee80211_key_conf *key)
2983{
2984 struct ath10k *ar = hw->priv;
2985 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2986 struct ath10k_peer *peer;
2987 const u8 *peer_addr;
2988 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
2989 key->cipher == WLAN_CIPHER_SUITE_WEP104;
2990 int ret = 0;
2991
2992 if (key->keyidx > WMI_MAX_KEY_INDEX)
2993 return -ENOSPC;
2994
2995 mutex_lock(&ar->conf_mutex);
2996
2997 if (sta)
2998 peer_addr = sta->addr;
2999 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3000 peer_addr = vif->bss_conf.bssid;
3001 else
3002 peer_addr = vif->addr;
3003
3004 key->hw_key_idx = key->keyidx;
3005
3006 /* the peer should not disappear in mid-way (unless FW goes awry) since
3007 * we already hold conf_mutex. we just make sure its there now. */
3008 spin_lock_bh(&ar->data_lock);
3009 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3010 spin_unlock_bh(&ar->data_lock);
3011
3012 if (!peer) {
3013 if (cmd == SET_KEY) {
3014 ath10k_warn("cannot install key for non-existent peer %pM\n",
3015 peer_addr);
3016 ret = -EOPNOTSUPP;
3017 goto exit;
3018 } else {
3019 /* if the peer doesn't exist there is no key to disable
3020 * anymore */
3021 goto exit;
3022 }
3023 }
3024
3025 if (is_wep) {
3026 if (cmd == SET_KEY)
3027 arvif->wep_keys[key->keyidx] = key;
3028 else
3029 arvif->wep_keys[key->keyidx] = NULL;
3030
3031 if (cmd == DISABLE_KEY)
3032 ath10k_clear_vdev_key(arvif, key);
3033 }
3034
3035 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
3036 if (ret) {
3037 ath10k_warn("ath10k_install_key failed (%d)\n", ret);
3038 goto exit;
3039 }
3040
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003041 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
3042
Kalle Valo5e3dd152013-06-12 20:52:10 +03003043 spin_lock_bh(&ar->data_lock);
3044 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3045 if (peer && cmd == SET_KEY)
3046 peer->keys[key->keyidx] = key;
3047 else if (peer && cmd == DISABLE_KEY)
3048 peer->keys[key->keyidx] = NULL;
3049 else if (peer == NULL)
3050 /* impossible unless FW goes crazy */
3051 ath10k_warn("peer %pM disappeared!\n", peer_addr);
3052 spin_unlock_bh(&ar->data_lock);
3053
3054exit:
3055 mutex_unlock(&ar->conf_mutex);
3056 return ret;
3057}
3058
3059static int ath10k_sta_state(struct ieee80211_hw *hw,
3060 struct ieee80211_vif *vif,
3061 struct ieee80211_sta *sta,
3062 enum ieee80211_sta_state old_state,
3063 enum ieee80211_sta_state new_state)
3064{
3065 struct ath10k *ar = hw->priv;
3066 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003067 int max_num_peers;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003068 int ret = 0;
3069
3070 mutex_lock(&ar->conf_mutex);
3071
3072 if (old_state == IEEE80211_STA_NOTEXIST &&
3073 new_state == IEEE80211_STA_NONE &&
3074 vif->type != NL80211_IFTYPE_STATION) {
3075 /*
3076 * New station addition.
3077 */
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003078 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
3079 max_num_peers = TARGET_10X_NUM_PEERS_MAX - 1;
3080 else
3081 max_num_peers = TARGET_NUM_PEERS;
3082
3083 if (ar->num_peers >= max_num_peers) {
3084 ath10k_warn("Number of peers exceeded: peers number %d (max peers %d)\n",
3085 ar->num_peers, max_num_peers);
3086 ret = -ENOBUFS;
3087 goto exit;
3088 }
3089
Kalle Valo60c3daa2013-09-08 17:56:07 +03003090 ath10k_dbg(ATH10K_DBG_MAC,
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003091 "mac vdev %d peer create %pM (new sta) num_peers %d\n",
3092 arvif->vdev_id, sta->addr, ar->num_peers);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003093
Kalle Valo5e3dd152013-06-12 20:52:10 +03003094 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
3095 if (ret)
Ben Greear479398b2013-11-04 09:19:34 -08003096 ath10k_warn("Failed to add peer %pM for vdev %d when adding a new sta: %i\n",
3097 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003098 } else if ((old_state == IEEE80211_STA_NONE &&
3099 new_state == IEEE80211_STA_NOTEXIST)) {
3100 /*
3101 * Existing station deletion.
3102 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003103 ath10k_dbg(ATH10K_DBG_MAC,
3104 "mac vdev %d peer delete %pM (sta gone)\n",
3105 arvif->vdev_id, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003106 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
3107 if (ret)
3108 ath10k_warn("Failed to delete peer: %pM for VDEV: %d\n",
3109 sta->addr, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003110
3111 if (vif->type == NL80211_IFTYPE_STATION)
3112 ath10k_bss_disassoc(hw, vif);
3113 } else if (old_state == IEEE80211_STA_AUTH &&
3114 new_state == IEEE80211_STA_ASSOC &&
3115 (vif->type == NL80211_IFTYPE_AP ||
3116 vif->type == NL80211_IFTYPE_ADHOC)) {
3117 /*
3118 * New association.
3119 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003120 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM associated\n",
3121 sta->addr);
3122
Kalle Valo5e3dd152013-06-12 20:52:10 +03003123 ret = ath10k_station_assoc(ar, arvif, sta);
3124 if (ret)
3125 ath10k_warn("Failed to associate station: %pM\n",
3126 sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003127 } else if (old_state == IEEE80211_STA_ASSOC &&
3128 new_state == IEEE80211_STA_AUTH &&
3129 (vif->type == NL80211_IFTYPE_AP ||
3130 vif->type == NL80211_IFTYPE_ADHOC)) {
3131 /*
3132 * Disassociation.
3133 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003134 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
3135 sta->addr);
3136
Kalle Valo5e3dd152013-06-12 20:52:10 +03003137 ret = ath10k_station_disassoc(ar, arvif, sta);
3138 if (ret)
3139 ath10k_warn("Failed to disassociate station: %pM\n",
3140 sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003141 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003142exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003143 mutex_unlock(&ar->conf_mutex);
3144 return ret;
3145}
3146
3147static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
3148 u16 ac, bool enable)
3149{
3150 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3151 u32 value = 0;
3152 int ret = 0;
3153
Michal Kazior548db542013-07-05 16:15:15 +03003154 lockdep_assert_held(&ar->conf_mutex);
3155
Kalle Valo5e3dd152013-06-12 20:52:10 +03003156 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3157 return 0;
3158
3159 switch (ac) {
3160 case IEEE80211_AC_VO:
3161 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3162 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3163 break;
3164 case IEEE80211_AC_VI:
3165 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3166 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3167 break;
3168 case IEEE80211_AC_BE:
3169 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3170 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3171 break;
3172 case IEEE80211_AC_BK:
3173 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3174 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3175 break;
3176 }
3177
3178 if (enable)
3179 arvif->u.sta.uapsd |= value;
3180 else
3181 arvif->u.sta.uapsd &= ~value;
3182
3183 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3184 WMI_STA_PS_PARAM_UAPSD,
3185 arvif->u.sta.uapsd);
3186 if (ret) {
3187 ath10k_warn("could not set uapsd params %d\n", ret);
3188 goto exit;
3189 }
3190
3191 if (arvif->u.sta.uapsd)
3192 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
3193 else
3194 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3195
3196 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3197 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
3198 value);
3199 if (ret)
3200 ath10k_warn("could not set rx wake param %d\n", ret);
3201
3202exit:
3203 return ret;
3204}
3205
3206static int ath10k_conf_tx(struct ieee80211_hw *hw,
3207 struct ieee80211_vif *vif, u16 ac,
3208 const struct ieee80211_tx_queue_params *params)
3209{
3210 struct ath10k *ar = hw->priv;
3211 struct wmi_wmm_params_arg *p = NULL;
3212 int ret;
3213
3214 mutex_lock(&ar->conf_mutex);
3215
3216 switch (ac) {
3217 case IEEE80211_AC_VO:
3218 p = &ar->wmm_params.ac_vo;
3219 break;
3220 case IEEE80211_AC_VI:
3221 p = &ar->wmm_params.ac_vi;
3222 break;
3223 case IEEE80211_AC_BE:
3224 p = &ar->wmm_params.ac_be;
3225 break;
3226 case IEEE80211_AC_BK:
3227 p = &ar->wmm_params.ac_bk;
3228 break;
3229 }
3230
3231 if (WARN_ON(!p)) {
3232 ret = -EINVAL;
3233 goto exit;
3234 }
3235
3236 p->cwmin = params->cw_min;
3237 p->cwmax = params->cw_max;
3238 p->aifs = params->aifs;
3239
3240 /*
3241 * The channel time duration programmed in the HW is in absolute
3242 * microseconds, while mac80211 gives the txop in units of
3243 * 32 microseconds.
3244 */
3245 p->txop = params->txop * 32;
3246
3247 /* FIXME: FW accepts wmm params per hw, not per vif */
3248 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
3249 if (ret) {
3250 ath10k_warn("could not set wmm params %d\n", ret);
3251 goto exit;
3252 }
3253
3254 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3255 if (ret)
3256 ath10k_warn("could not set sta uapsd %d\n", ret);
3257
3258exit:
3259 mutex_unlock(&ar->conf_mutex);
3260 return ret;
3261}
3262
3263#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3264
3265static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
3266 struct ieee80211_vif *vif,
3267 struct ieee80211_channel *chan,
3268 int duration,
3269 enum ieee80211_roc_type type)
3270{
3271 struct ath10k *ar = hw->priv;
3272 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3273 struct wmi_start_scan_arg arg;
3274 int ret;
3275
3276 mutex_lock(&ar->conf_mutex);
3277
3278 spin_lock_bh(&ar->data_lock);
3279 if (ar->scan.in_progress) {
3280 spin_unlock_bh(&ar->data_lock);
3281 ret = -EBUSY;
3282 goto exit;
3283 }
3284
Wolfram Sang16735d02013-11-14 14:32:02 -08003285 reinit_completion(&ar->scan.started);
3286 reinit_completion(&ar->scan.completed);
3287 reinit_completion(&ar->scan.on_channel);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003288 ar->scan.in_progress = true;
3289 ar->scan.aborting = false;
3290 ar->scan.is_roc = true;
3291 ar->scan.vdev_id = arvif->vdev_id;
3292 ar->scan.roc_freq = chan->center_freq;
3293 spin_unlock_bh(&ar->data_lock);
3294
3295 memset(&arg, 0, sizeof(arg));
3296 ath10k_wmi_start_scan_init(ar, &arg);
3297 arg.vdev_id = arvif->vdev_id;
3298 arg.scan_id = ATH10K_SCAN_ID;
3299 arg.n_channels = 1;
3300 arg.channels[0] = chan->center_freq;
3301 arg.dwell_time_active = duration;
3302 arg.dwell_time_passive = duration;
3303 arg.max_scan_time = 2 * duration;
3304 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3305 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
3306
3307 ret = ath10k_start_scan(ar, &arg);
3308 if (ret) {
3309 ath10k_warn("could not start roc scan (%d)\n", ret);
3310 spin_lock_bh(&ar->data_lock);
3311 ar->scan.in_progress = false;
3312 spin_unlock_bh(&ar->data_lock);
3313 goto exit;
3314 }
3315
3316 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
3317 if (ret == 0) {
3318 ath10k_warn("could not switch to channel for roc scan\n");
3319 ath10k_abort_scan(ar);
3320 ret = -ETIMEDOUT;
3321 goto exit;
3322 }
3323
3324 ret = 0;
3325exit:
3326 mutex_unlock(&ar->conf_mutex);
3327 return ret;
3328}
3329
3330static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
3331{
3332 struct ath10k *ar = hw->priv;
3333
3334 mutex_lock(&ar->conf_mutex);
3335 ath10k_abort_scan(ar);
3336 mutex_unlock(&ar->conf_mutex);
3337
3338 return 0;
3339}
3340
3341/*
3342 * Both RTS and Fragmentation threshold are interface-specific
3343 * in ath10k, but device-specific in mac80211.
3344 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03003345
3346static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3347{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003348 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003349 struct ath10k_vif *arvif;
3350 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03003351
Michal Kaziorad088bf2013-10-16 15:44:46 +03003352 mutex_lock(&ar->conf_mutex);
3353 list_for_each_entry(arvif, &ar->arvifs, list) {
3354 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
3355 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003356
Michal Kaziorad088bf2013-10-16 15:44:46 +03003357 ret = ath10k_mac_set_rts(arvif, value);
3358 if (ret) {
3359 ath10k_warn("could not set rts threshold for vdev %d (%d)\n",
3360 arvif->vdev_id, ret);
3361 break;
3362 }
3363 }
3364 mutex_unlock(&ar->conf_mutex);
3365
3366 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003367}
3368
3369static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3370{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003371 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003372 struct ath10k_vif *arvif;
3373 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003374
Kalle Valo5e3dd152013-06-12 20:52:10 +03003375 mutex_lock(&ar->conf_mutex);
Michal Kaziorad088bf2013-10-16 15:44:46 +03003376 list_for_each_entry(arvif, &ar->arvifs, list) {
3377 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
3378 arvif->vdev_id, value);
3379
3380 ret = ath10k_mac_set_rts(arvif, value);
3381 if (ret) {
3382 ath10k_warn("could not set fragmentation threshold for vdev %d (%d)\n",
3383 arvif->vdev_id, ret);
3384 break;
3385 }
3386 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003387 mutex_unlock(&ar->conf_mutex);
3388
Michal Kaziorad088bf2013-10-16 15:44:46 +03003389 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003390}
3391
3392static void ath10k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
3393{
3394 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02003395 bool skip;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003396 int ret;
3397
3398 /* mac80211 doesn't care if we really xmit queued frames or not
3399 * we'll collect those frames either way if we stop/delete vdevs */
3400 if (drop)
3401 return;
3402
Michal Kazior548db542013-07-05 16:15:15 +03003403 mutex_lock(&ar->conf_mutex);
3404
Michal Kazioraffd3212013-07-16 09:54:35 +02003405 if (ar->state == ATH10K_STATE_WEDGED)
3406 goto skip;
3407
Michal Kazioredb82362013-07-05 16:15:14 +03003408 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03003409 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02003410
Michal Kazioredb82362013-07-05 16:15:14 +03003411 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02003412 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03003413 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02003414
3415 skip = (ar->state == ATH10K_STATE_WEDGED);
3416
3417 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003418 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02003419
3420 if (ret <= 0 || skip)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003421 ath10k_warn("tx not flushed\n");
Michal Kazior548db542013-07-05 16:15:15 +03003422
Michal Kazioraffd3212013-07-16 09:54:35 +02003423skip:
Michal Kazior548db542013-07-05 16:15:15 +03003424 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003425}
3426
3427/* TODO: Implement this function properly
3428 * For now it is needed to reply to Probe Requests in IBSS mode.
3429 * Propably we need this information from FW.
3430 */
3431static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
3432{
3433 return 1;
3434}
3435
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003436#ifdef CONFIG_PM
3437static int ath10k_suspend(struct ieee80211_hw *hw,
3438 struct cfg80211_wowlan *wowlan)
3439{
3440 struct ath10k *ar = hw->priv;
3441 int ret;
3442
Marek Puzyniak9042e172014-02-10 17:14:23 +01003443 mutex_lock(&ar->conf_mutex);
3444
3445 reinit_completion(&ar->target_suspend);
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003446
3447 ret = ath10k_wmi_pdev_suspend_target(ar);
3448 if (ret) {
3449 ath10k_warn("could not suspend target (%d)\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003450 ret = 1;
3451 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003452 }
3453
Marek Puzyniak9042e172014-02-10 17:14:23 +01003454 ret = wait_for_completion_timeout(&ar->target_suspend, 1 * HZ);
3455
3456 if (ret == 0) {
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003457 ath10k_warn("suspend timed out - target pause event never came\n");
3458 goto resume;
3459 }
3460
3461 ret = ath10k_hif_suspend(ar);
3462 if (ret) {
3463 ath10k_warn("could not suspend hif (%d)\n", ret);
3464 goto resume;
3465 }
3466
Marek Puzyniak9042e172014-02-10 17:14:23 +01003467 ret = 0;
3468 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003469resume:
3470 ret = ath10k_wmi_pdev_resume_target(ar);
3471 if (ret)
3472 ath10k_warn("could not resume target (%d)\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003473
3474 ret = 1;
3475exit:
3476 mutex_unlock(&ar->conf_mutex);
3477 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003478}
3479
3480static int ath10k_resume(struct ieee80211_hw *hw)
3481{
3482 struct ath10k *ar = hw->priv;
3483 int ret;
3484
Marek Puzyniak9042e172014-02-10 17:14:23 +01003485 mutex_lock(&ar->conf_mutex);
3486
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003487 ret = ath10k_hif_resume(ar);
3488 if (ret) {
3489 ath10k_warn("could not resume hif (%d)\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003490 ret = 1;
3491 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003492 }
3493
3494 ret = ath10k_wmi_pdev_resume_target(ar);
3495 if (ret) {
3496 ath10k_warn("could not resume target (%d)\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003497 ret = 1;
3498 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003499 }
3500
Marek Puzyniak9042e172014-02-10 17:14:23 +01003501 ret = 0;
3502exit:
3503 mutex_unlock(&ar->conf_mutex);
3504 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003505}
3506#endif
3507
Michal Kazioraffd3212013-07-16 09:54:35 +02003508static void ath10k_restart_complete(struct ieee80211_hw *hw)
3509{
3510 struct ath10k *ar = hw->priv;
3511
3512 mutex_lock(&ar->conf_mutex);
3513
3514 /* If device failed to restart it will be in a different state, e.g.
3515 * ATH10K_STATE_WEDGED */
3516 if (ar->state == ATH10K_STATE_RESTARTED) {
3517 ath10k_info("device successfully recovered\n");
3518 ar->state = ATH10K_STATE_ON;
3519 }
3520
3521 mutex_unlock(&ar->conf_mutex);
3522}
3523
Michal Kazior2e1dea42013-07-31 10:32:40 +02003524static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
3525 struct survey_info *survey)
3526{
3527 struct ath10k *ar = hw->priv;
3528 struct ieee80211_supported_band *sband;
3529 struct survey_info *ar_survey = &ar->survey[idx];
3530 int ret = 0;
3531
3532 mutex_lock(&ar->conf_mutex);
3533
3534 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
3535 if (sband && idx >= sband->n_channels) {
3536 idx -= sband->n_channels;
3537 sband = NULL;
3538 }
3539
3540 if (!sband)
3541 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
3542
3543 if (!sband || idx >= sband->n_channels) {
3544 ret = -ENOENT;
3545 goto exit;
3546 }
3547
3548 spin_lock_bh(&ar->data_lock);
3549 memcpy(survey, ar_survey, sizeof(*survey));
3550 spin_unlock_bh(&ar->data_lock);
3551
3552 survey->channel = &sband->channels[idx];
3553
3554exit:
3555 mutex_unlock(&ar->conf_mutex);
3556 return ret;
3557}
3558
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01003559/* Helper table for legacy fixed_rate/bitrate_mask */
3560static const u8 cck_ofdm_rate[] = {
3561 /* CCK */
3562 3, /* 1Mbps */
3563 2, /* 2Mbps */
3564 1, /* 5.5Mbps */
3565 0, /* 11Mbps */
3566 /* OFDM */
3567 3, /* 6Mbps */
3568 7, /* 9Mbps */
3569 2, /* 12Mbps */
3570 6, /* 18Mbps */
3571 1, /* 24Mbps */
3572 5, /* 36Mbps */
3573 0, /* 48Mbps */
3574 4, /* 54Mbps */
3575};
3576
3577/* Check if only one bit set */
3578static int ath10k_check_single_mask(u32 mask)
3579{
3580 int bit;
3581
3582 bit = ffs(mask);
3583 if (!bit)
3584 return 0;
3585
3586 mask &= ~BIT(bit - 1);
3587 if (mask)
3588 return 2;
3589
3590 return 1;
3591}
3592
3593static bool
3594ath10k_default_bitrate_mask(struct ath10k *ar,
3595 enum ieee80211_band band,
3596 const struct cfg80211_bitrate_mask *mask)
3597{
3598 u32 legacy = 0x00ff;
3599 u8 ht = 0xff, i;
3600 u16 vht = 0x3ff;
3601
3602 switch (band) {
3603 case IEEE80211_BAND_2GHZ:
3604 legacy = 0x00fff;
3605 vht = 0;
3606 break;
3607 case IEEE80211_BAND_5GHZ:
3608 break;
3609 default:
3610 return false;
3611 }
3612
3613 if (mask->control[band].legacy != legacy)
3614 return false;
3615
3616 for (i = 0; i < ar->num_rf_chains; i++)
3617 if (mask->control[band].ht_mcs[i] != ht)
3618 return false;
3619
3620 for (i = 0; i < ar->num_rf_chains; i++)
3621 if (mask->control[band].vht_mcs[i] != vht)
3622 return false;
3623
3624 return true;
3625}
3626
3627static bool
3628ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
3629 enum ieee80211_band band,
3630 u8 *fixed_nss)
3631{
3632 int ht_nss = 0, vht_nss = 0, i;
3633
3634 /* check legacy */
3635 if (ath10k_check_single_mask(mask->control[band].legacy))
3636 return false;
3637
3638 /* check HT */
3639 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3640 if (mask->control[band].ht_mcs[i] == 0xff)
3641 continue;
3642 else if (mask->control[band].ht_mcs[i] == 0x00)
3643 break;
3644 else
3645 return false;
3646 }
3647
3648 ht_nss = i;
3649
3650 /* check VHT */
3651 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
3652 if (mask->control[band].vht_mcs[i] == 0x03ff)
3653 continue;
3654 else if (mask->control[band].vht_mcs[i] == 0x0000)
3655 break;
3656 else
3657 return false;
3658 }
3659
3660 vht_nss = i;
3661
3662 if (ht_nss > 0 && vht_nss > 0)
3663 return false;
3664
3665 if (ht_nss)
3666 *fixed_nss = ht_nss;
3667 else if (vht_nss)
3668 *fixed_nss = vht_nss;
3669 else
3670 return false;
3671
3672 return true;
3673}
3674
3675static bool
3676ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
3677 enum ieee80211_band band,
3678 enum wmi_rate_preamble *preamble)
3679{
3680 int legacy = 0, ht = 0, vht = 0, i;
3681
3682 *preamble = WMI_RATE_PREAMBLE_OFDM;
3683
3684 /* check legacy */
3685 legacy = ath10k_check_single_mask(mask->control[band].legacy);
3686 if (legacy > 1)
3687 return false;
3688
3689 /* check HT */
3690 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3691 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
3692 if (ht > 1)
3693 return false;
3694
3695 /* check VHT */
3696 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3697 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
3698 if (vht > 1)
3699 return false;
3700
3701 /* Currently we support only one fixed_rate */
3702 if ((legacy + ht + vht) != 1)
3703 return false;
3704
3705 if (ht)
3706 *preamble = WMI_RATE_PREAMBLE_HT;
3707 else if (vht)
3708 *preamble = WMI_RATE_PREAMBLE_VHT;
3709
3710 return true;
3711}
3712
3713static bool
3714ath10k_bitrate_mask_rate(const struct cfg80211_bitrate_mask *mask,
3715 enum ieee80211_band band,
3716 u8 *fixed_rate,
3717 u8 *fixed_nss)
3718{
3719 u8 rate = 0, pream = 0, nss = 0, i;
3720 enum wmi_rate_preamble preamble;
3721
3722 /* Check if single rate correct */
3723 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
3724 return false;
3725
3726 pream = preamble;
3727
3728 switch (preamble) {
3729 case WMI_RATE_PREAMBLE_CCK:
3730 case WMI_RATE_PREAMBLE_OFDM:
3731 i = ffs(mask->control[band].legacy) - 1;
3732
3733 if (band == IEEE80211_BAND_2GHZ && i < 4)
3734 pream = WMI_RATE_PREAMBLE_CCK;
3735
3736 if (band == IEEE80211_BAND_5GHZ)
3737 i += 4;
3738
3739 if (i >= ARRAY_SIZE(cck_ofdm_rate))
3740 return false;
3741
3742 rate = cck_ofdm_rate[i];
3743 break;
3744 case WMI_RATE_PREAMBLE_HT:
3745 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3746 if (mask->control[band].ht_mcs[i])
3747 break;
3748
3749 if (i == IEEE80211_HT_MCS_MASK_LEN)
3750 return false;
3751
3752 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
3753 nss = i;
3754 break;
3755 case WMI_RATE_PREAMBLE_VHT:
3756 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3757 if (mask->control[band].vht_mcs[i])
3758 break;
3759
3760 if (i == NL80211_VHT_NSS_MAX)
3761 return false;
3762
3763 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3764 nss = i;
3765 break;
3766 }
3767
3768 *fixed_nss = nss + 1;
3769 nss <<= 4;
3770 pream <<= 6;
3771
3772 ath10k_dbg(ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
3773 pream, nss, rate);
3774
3775 *fixed_rate = pream | nss | rate;
3776
3777 return true;
3778}
3779
3780static bool ath10k_get_fixed_rate_nss(const struct cfg80211_bitrate_mask *mask,
3781 enum ieee80211_band band,
3782 u8 *fixed_rate,
3783 u8 *fixed_nss)
3784{
3785 /* First check full NSS mask, if we can simply limit NSS */
3786 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
3787 return true;
3788
3789 /* Next Check single rate is set */
3790 return ath10k_bitrate_mask_rate(mask, band, fixed_rate, fixed_nss);
3791}
3792
3793static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
3794 u8 fixed_rate,
3795 u8 fixed_nss)
3796{
3797 struct ath10k *ar = arvif->ar;
3798 u32 vdev_param;
3799 int ret = 0;
3800
3801 mutex_lock(&ar->conf_mutex);
3802
3803 if (arvif->fixed_rate == fixed_rate &&
3804 arvif->fixed_nss == fixed_nss)
3805 goto exit;
3806
3807 if (fixed_rate == WMI_FIXED_RATE_NONE)
3808 ath10k_dbg(ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
3809
3810 vdev_param = ar->wmi.vdev_param->fixed_rate;
3811 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
3812 vdev_param, fixed_rate);
3813 if (ret) {
3814 ath10k_warn("Could not set fixed_rate param 0x%02x: %d\n",
3815 fixed_rate, ret);
3816 ret = -EINVAL;
3817 goto exit;
3818 }
3819
3820 arvif->fixed_rate = fixed_rate;
3821
3822 vdev_param = ar->wmi.vdev_param->nss;
3823 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
3824 vdev_param, fixed_nss);
3825
3826 if (ret) {
3827 ath10k_warn("Could not set fixed_nss param %d: %d\n",
3828 fixed_nss, ret);
3829 ret = -EINVAL;
3830 goto exit;
3831 }
3832
3833 arvif->fixed_nss = fixed_nss;
3834
3835exit:
3836 mutex_unlock(&ar->conf_mutex);
3837 return ret;
3838}
3839
3840static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
3841 struct ieee80211_vif *vif,
3842 const struct cfg80211_bitrate_mask *mask)
3843{
3844 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3845 struct ath10k *ar = arvif->ar;
3846 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
3847 u8 fixed_rate = WMI_FIXED_RATE_NONE;
3848 u8 fixed_nss = ar->num_rf_chains;
3849
3850 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
3851 if (!ath10k_get_fixed_rate_nss(mask, band,
3852 &fixed_rate,
3853 &fixed_nss))
3854 return -EINVAL;
3855 }
3856
3857 return ath10k_set_fixed_rate_param(arvif, fixed_rate, fixed_nss);
3858}
3859
Michal Kaziorc2df44b2014-01-23 11:38:26 +01003860static void ath10k_channel_switch_beacon(struct ieee80211_hw *hw,
3861 struct ieee80211_vif *vif,
3862 struct cfg80211_chan_def *chandef)
3863{
3864 /* there's no need to do anything here. vif->csa_active is enough */
3865 return;
3866}
3867
Kalle Valo5e3dd152013-06-12 20:52:10 +03003868static const struct ieee80211_ops ath10k_ops = {
3869 .tx = ath10k_tx,
3870 .start = ath10k_start,
3871 .stop = ath10k_stop,
3872 .config = ath10k_config,
3873 .add_interface = ath10k_add_interface,
3874 .remove_interface = ath10k_remove_interface,
3875 .configure_filter = ath10k_configure_filter,
3876 .bss_info_changed = ath10k_bss_info_changed,
3877 .hw_scan = ath10k_hw_scan,
3878 .cancel_hw_scan = ath10k_cancel_hw_scan,
3879 .set_key = ath10k_set_key,
3880 .sta_state = ath10k_sta_state,
3881 .conf_tx = ath10k_conf_tx,
3882 .remain_on_channel = ath10k_remain_on_channel,
3883 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
3884 .set_rts_threshold = ath10k_set_rts_threshold,
3885 .set_frag_threshold = ath10k_set_frag_threshold,
3886 .flush = ath10k_flush,
3887 .tx_last_beacon = ath10k_tx_last_beacon,
Michal Kazioraffd3212013-07-16 09:54:35 +02003888 .restart_complete = ath10k_restart_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02003889 .get_survey = ath10k_get_survey,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01003890 .set_bitrate_mask = ath10k_set_bitrate_mask,
Michal Kaziorc2df44b2014-01-23 11:38:26 +01003891 .channel_switch_beacon = ath10k_channel_switch_beacon,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003892#ifdef CONFIG_PM
3893 .suspend = ath10k_suspend,
3894 .resume = ath10k_resume,
3895#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03003896};
3897
3898#define RATETAB_ENT(_rate, _rateid, _flags) { \
3899 .bitrate = (_rate), \
3900 .flags = (_flags), \
3901 .hw_value = (_rateid), \
3902}
3903
3904#define CHAN2G(_channel, _freq, _flags) { \
3905 .band = IEEE80211_BAND_2GHZ, \
3906 .hw_value = (_channel), \
3907 .center_freq = (_freq), \
3908 .flags = (_flags), \
3909 .max_antenna_gain = 0, \
3910 .max_power = 30, \
3911}
3912
3913#define CHAN5G(_channel, _freq, _flags) { \
3914 .band = IEEE80211_BAND_5GHZ, \
3915 .hw_value = (_channel), \
3916 .center_freq = (_freq), \
3917 .flags = (_flags), \
3918 .max_antenna_gain = 0, \
3919 .max_power = 30, \
3920}
3921
3922static const struct ieee80211_channel ath10k_2ghz_channels[] = {
3923 CHAN2G(1, 2412, 0),
3924 CHAN2G(2, 2417, 0),
3925 CHAN2G(3, 2422, 0),
3926 CHAN2G(4, 2427, 0),
3927 CHAN2G(5, 2432, 0),
3928 CHAN2G(6, 2437, 0),
3929 CHAN2G(7, 2442, 0),
3930 CHAN2G(8, 2447, 0),
3931 CHAN2G(9, 2452, 0),
3932 CHAN2G(10, 2457, 0),
3933 CHAN2G(11, 2462, 0),
3934 CHAN2G(12, 2467, 0),
3935 CHAN2G(13, 2472, 0),
3936 CHAN2G(14, 2484, 0),
3937};
3938
3939static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02003940 CHAN5G(36, 5180, 0),
3941 CHAN5G(40, 5200, 0),
3942 CHAN5G(44, 5220, 0),
3943 CHAN5G(48, 5240, 0),
3944 CHAN5G(52, 5260, 0),
3945 CHAN5G(56, 5280, 0),
3946 CHAN5G(60, 5300, 0),
3947 CHAN5G(64, 5320, 0),
3948 CHAN5G(100, 5500, 0),
3949 CHAN5G(104, 5520, 0),
3950 CHAN5G(108, 5540, 0),
3951 CHAN5G(112, 5560, 0),
3952 CHAN5G(116, 5580, 0),
3953 CHAN5G(120, 5600, 0),
3954 CHAN5G(124, 5620, 0),
3955 CHAN5G(128, 5640, 0),
3956 CHAN5G(132, 5660, 0),
3957 CHAN5G(136, 5680, 0),
3958 CHAN5G(140, 5700, 0),
3959 CHAN5G(149, 5745, 0),
3960 CHAN5G(153, 5765, 0),
3961 CHAN5G(157, 5785, 0),
3962 CHAN5G(161, 5805, 0),
3963 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03003964};
3965
3966static struct ieee80211_rate ath10k_rates[] = {
3967 /* CCK */
3968 RATETAB_ENT(10, 0x82, 0),
3969 RATETAB_ENT(20, 0x84, 0),
3970 RATETAB_ENT(55, 0x8b, 0),
3971 RATETAB_ENT(110, 0x96, 0),
3972 /* OFDM */
3973 RATETAB_ENT(60, 0x0c, 0),
3974 RATETAB_ENT(90, 0x12, 0),
3975 RATETAB_ENT(120, 0x18, 0),
3976 RATETAB_ENT(180, 0x24, 0),
3977 RATETAB_ENT(240, 0x30, 0),
3978 RATETAB_ENT(360, 0x48, 0),
3979 RATETAB_ENT(480, 0x60, 0),
3980 RATETAB_ENT(540, 0x6c, 0),
3981};
3982
3983#define ath10k_a_rates (ath10k_rates + 4)
3984#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
3985#define ath10k_g_rates (ath10k_rates + 0)
3986#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
3987
3988struct ath10k *ath10k_mac_create(void)
3989{
3990 struct ieee80211_hw *hw;
3991 struct ath10k *ar;
3992
3993 hw = ieee80211_alloc_hw(sizeof(struct ath10k), &ath10k_ops);
3994 if (!hw)
3995 return NULL;
3996
3997 ar = hw->priv;
3998 ar->hw = hw;
3999
4000 return ar;
4001}
4002
4003void ath10k_mac_destroy(struct ath10k *ar)
4004{
4005 ieee80211_free_hw(ar->hw);
4006}
4007
4008static const struct ieee80211_iface_limit ath10k_if_limits[] = {
4009 {
4010 .max = 8,
4011 .types = BIT(NL80211_IFTYPE_STATION)
4012 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02004013 },
4014 {
4015 .max = 3,
4016 .types = BIT(NL80211_IFTYPE_P2P_GO)
4017 },
4018 {
4019 .max = 7,
4020 .types = BIT(NL80211_IFTYPE_AP)
4021 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004022};
4023
Bartosz Markowskif2595092013-12-10 16:20:39 +01004024static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004025 {
4026 .max = 8,
4027 .types = BIT(NL80211_IFTYPE_AP)
4028 },
4029};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004030
4031static const struct ieee80211_iface_combination ath10k_if_comb[] = {
4032 {
4033 .limits = ath10k_if_limits,
4034 .n_limits = ARRAY_SIZE(ath10k_if_limits),
4035 .max_interfaces = 8,
4036 .num_different_channels = 1,
4037 .beacon_int_infra_match = true,
4038 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01004039};
4040
4041static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004042 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01004043 .limits = ath10k_10x_if_limits,
4044 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004045 .max_interfaces = 8,
4046 .num_different_channels = 1,
4047 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01004048#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004049 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
4050 BIT(NL80211_CHAN_WIDTH_20) |
4051 BIT(NL80211_CHAN_WIDTH_40) |
4052 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004053#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01004054 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004055};
4056
4057static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4058{
4059 struct ieee80211_sta_vht_cap vht_cap = {0};
4060 u16 mcs_map;
Michal Kazior8865bee42013-07-24 12:36:46 +02004061 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004062
4063 vht_cap.vht_supported = 1;
4064 vht_cap.cap = ar->vht_cap_info;
4065
Michal Kazior8865bee42013-07-24 12:36:46 +02004066 mcs_map = 0;
4067 for (i = 0; i < 8; i++) {
4068 if (i < ar->num_rf_chains)
4069 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
4070 else
4071 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
4072 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004073
4074 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4075 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4076
4077 return vht_cap;
4078}
4079
4080static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4081{
4082 int i;
4083 struct ieee80211_sta_ht_cap ht_cap = {0};
4084
4085 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4086 return ht_cap;
4087
4088 ht_cap.ht_supported = 1;
4089 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4090 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4091 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4092 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4093 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4094
4095 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4096 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4097
4098 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4099 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4100
4101 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4102 u32 smps;
4103
4104 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4105 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4106
4107 ht_cap.cap |= smps;
4108 }
4109
4110 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
4111 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4112
4113 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4114 u32 stbc;
4115
4116 stbc = ar->ht_cap_info;
4117 stbc &= WMI_HT_CAP_RX_STBC;
4118 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4119 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4120 stbc &= IEEE80211_HT_CAP_RX_STBC;
4121
4122 ht_cap.cap |= stbc;
4123 }
4124
4125 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4126 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4127
4128 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4129 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4130
4131 /* max AMSDU is implicitly taken from vht_cap_info */
4132 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4133 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4134
Michal Kazior8865bee42013-07-24 12:36:46 +02004135 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004136 ht_cap.mcs.rx_mask[i] = 0xFF;
4137
4138 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4139
4140 return ht_cap;
4141}
4142
4143
4144static void ath10k_get_arvif_iter(void *data, u8 *mac,
4145 struct ieee80211_vif *vif)
4146{
4147 struct ath10k_vif_iter *arvif_iter = data;
4148 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4149
4150 if (arvif->vdev_id == arvif_iter->vdev_id)
4151 arvif_iter->arvif = arvif;
4152}
4153
4154struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
4155{
4156 struct ath10k_vif_iter arvif_iter;
4157 u32 flags;
4158
4159 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
4160 arvif_iter.vdev_id = vdev_id;
4161
4162 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
4163 ieee80211_iterate_active_interfaces_atomic(ar->hw,
4164 flags,
4165 ath10k_get_arvif_iter,
4166 &arvif_iter);
4167 if (!arvif_iter.arvif) {
4168 ath10k_warn("No VIF found for VDEV: %d\n", vdev_id);
4169 return NULL;
4170 }
4171
4172 return arvif_iter.arvif;
4173}
4174
4175int ath10k_mac_register(struct ath10k *ar)
4176{
4177 struct ieee80211_supported_band *band;
4178 struct ieee80211_sta_vht_cap vht_cap;
4179 struct ieee80211_sta_ht_cap ht_cap;
4180 void *channels;
4181 int ret;
4182
4183 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
4184
4185 SET_IEEE80211_DEV(ar->hw, ar->dev);
4186
4187 ht_cap = ath10k_get_ht_cap(ar);
4188 vht_cap = ath10k_create_vht_cap(ar);
4189
4190 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4191 channels = kmemdup(ath10k_2ghz_channels,
4192 sizeof(ath10k_2ghz_channels),
4193 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02004194 if (!channels) {
4195 ret = -ENOMEM;
4196 goto err_free;
4197 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004198
4199 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
4200 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
4201 band->channels = channels;
4202 band->n_bitrates = ath10k_g_rates_size;
4203 band->bitrates = ath10k_g_rates;
4204 band->ht_cap = ht_cap;
4205
4206 /* vht is not supported in 2.4 GHz */
4207
4208 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
4209 }
4210
4211 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4212 channels = kmemdup(ath10k_5ghz_channels,
4213 sizeof(ath10k_5ghz_channels),
4214 GFP_KERNEL);
4215 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02004216 ret = -ENOMEM;
4217 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004218 }
4219
4220 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
4221 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
4222 band->channels = channels;
4223 band->n_bitrates = ath10k_a_rates_size;
4224 band->bitrates = ath10k_a_rates;
4225 band->ht_cap = ht_cap;
4226 band->vht_cap = vht_cap;
4227 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
4228 }
4229
4230 ar->hw->wiphy->interface_modes =
4231 BIT(NL80211_IFTYPE_STATION) |
4232 BIT(NL80211_IFTYPE_ADHOC) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01004233 BIT(NL80211_IFTYPE_AP);
4234
4235 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
4236 ar->hw->wiphy->interface_modes |=
4237 BIT(NL80211_IFTYPE_P2P_CLIENT) |
4238 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004239
4240 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
4241 IEEE80211_HW_SUPPORTS_PS |
4242 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
4243 IEEE80211_HW_SUPPORTS_UAPSD |
4244 IEEE80211_HW_MFP_CAPABLE |
4245 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
4246 IEEE80211_HW_HAS_RATE_CONTROL |
4247 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
4248 IEEE80211_HW_WANT_MONITOR_VIF |
4249 IEEE80211_HW_AP_LINK_PS;
4250
Michal Kazior1f8bb152013-09-18 14:43:22 +02004251 /* MSDU can have HTT TX fragment pushed in front. The additional 4
4252 * bytes is used for padding/alignment if necessary. */
4253 ar->hw->extra_tx_headroom += sizeof(struct htt_data_tx_desc_frag)*2 + 4;
4254
Kalle Valo5e3dd152013-06-12 20:52:10 +03004255 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4256 ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
4257
4258 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
4259 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
4260 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
4261 }
4262
4263 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
4264 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
4265
4266 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
4267
Kalle Valo5e3dd152013-06-12 20:52:10 +03004268 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
4269
4270 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01004271 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004272 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
4273
4274 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
4275 /*
4276 * on LL hardware queues are managed entirely by the FW
4277 * so we only advertise to mac we can do the queues thing
4278 */
4279 ar->hw->queues = 4;
4280
Bartosz Markowskif2595092013-12-10 16:20:39 +01004281 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4282 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
4283 ar->hw->wiphy->n_iface_combinations =
4284 ARRAY_SIZE(ath10k_10x_if_comb);
4285 } else {
4286 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
4287 ar->hw->wiphy->n_iface_combinations =
4288 ARRAY_SIZE(ath10k_if_comb);
4289 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004290
Michal Kazior7c199992013-07-31 10:47:57 +02004291 ar->hw->netdev_features = NETIF_F_HW_CSUM;
4292
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004293 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
4294 /* Init ath dfs pattern detector */
4295 ar->ath_common.debug_mask = ATH_DBG_DFS;
4296 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
4297 NL80211_DFS_UNSET);
4298
4299 if (!ar->dfs_detector)
4300 ath10k_warn("dfs pattern detector init failed\n");
4301 }
4302
Kalle Valo5e3dd152013-06-12 20:52:10 +03004303 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
4304 ath10k_reg_notifier);
4305 if (ret) {
4306 ath10k_err("Regulatory initialization failed\n");
Michal Kaziord6015b22013-07-22 14:13:30 +02004307 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004308 }
4309
4310 ret = ieee80211_register_hw(ar->hw);
4311 if (ret) {
4312 ath10k_err("ieee80211 registration failed: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02004313 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004314 }
4315
4316 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
4317 ret = regulatory_hint(ar->hw->wiphy,
4318 ar->ath_common.regulatory.alpha2);
4319 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02004320 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004321 }
4322
4323 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02004324
4325err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004326 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02004327err_free:
4328 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4329 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4330
Kalle Valo5e3dd152013-06-12 20:52:10 +03004331 return ret;
4332}
4333
4334void ath10k_mac_unregister(struct ath10k *ar)
4335{
4336 ieee80211_unregister_hw(ar->hw);
4337
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004338 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
4339 ar->dfs_detector->exit(ar->dfs_detector);
4340
Kalle Valo5e3dd152013-06-12 20:52:10 +03004341 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4342 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4343
4344 SET_IEEE80211_DEV(ar->hw, NULL);
4345}