blob: 5d3751d7541914131d18f2e7a747facbe8cf3ca9 [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) {
Ben Greear69244e52014-02-27 18:50:00 +0200326 ath10k_warn("Failed to create wmi peer %pM on vdev %i: %i\n",
327 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300328 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800329 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300330
331 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800332 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200333 ath10k_warn("Failed to wait for created wmi peer %pM on vdev %i: %i\n",
334 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300335 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800336 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100337 spin_lock_bh(&ar->data_lock);
338 ar->num_peers++;
339 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300340
341 return 0;
342}
343
Kalle Valo5a13e762014-01-20 11:01:46 +0200344static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
345{
346 struct ath10k *ar = arvif->ar;
347 u32 param;
348 int ret;
349
350 param = ar->wmi.pdev_param->sta_kickout_th;
351 ret = ath10k_wmi_pdev_set_param(ar, param,
352 ATH10K_KICKOUT_THRESHOLD);
353 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200354 ath10k_warn("Failed to set kickout threshold on vdev %i: %d\n",
355 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200356 return ret;
357 }
358
359 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
360 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
361 ATH10K_KEEPALIVE_MIN_IDLE);
362 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200363 ath10k_warn("Failed to set keepalive minimum idle time on vdev %i : %d\n",
364 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200365 return ret;
366 }
367
368 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
369 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
370 ATH10K_KEEPALIVE_MAX_IDLE);
371 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200372 ath10k_warn("Failed to set keepalive maximum idle time on vdev %i: %d\n",
373 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200374 return ret;
375 }
376
377 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
378 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
379 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
380 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200381 ath10k_warn("Failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
382 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200383 return ret;
384 }
385
386 return 0;
387}
388
Michal Kazior424121c2013-07-22 14:13:31 +0200389static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
390{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200391 struct ath10k *ar = arvif->ar;
392 u32 vdev_param;
393
Michal Kazior424121c2013-07-22 14:13:31 +0200394 if (value != 0xFFFFFFFF)
395 value = min_t(u32, arvif->ar->hw->wiphy->rts_threshold,
396 ATH10K_RTS_MAX);
397
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200398 vdev_param = ar->wmi.vdev_param->rts_threshold;
399 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200400}
401
402static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
403{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200404 struct ath10k *ar = arvif->ar;
405 u32 vdev_param;
406
Michal Kazior424121c2013-07-22 14:13:31 +0200407 if (value != 0xFFFFFFFF)
408 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
409 ATH10K_FRAGMT_THRESHOLD_MIN,
410 ATH10K_FRAGMT_THRESHOLD_MAX);
411
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200412 vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
413 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200414}
415
Kalle Valo5e3dd152013-06-12 20:52:10 +0300416static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
417{
418 int ret;
419
420 lockdep_assert_held(&ar->conf_mutex);
421
422 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
423 if (ret)
424 return ret;
425
426 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
427 if (ret)
428 return ret;
429
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100430 spin_lock_bh(&ar->data_lock);
431 ar->num_peers--;
432 spin_unlock_bh(&ar->data_lock);
433
Kalle Valo5e3dd152013-06-12 20:52:10 +0300434 return 0;
435}
436
437static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
438{
439 struct ath10k_peer *peer, *tmp;
440
441 lockdep_assert_held(&ar->conf_mutex);
442
443 spin_lock_bh(&ar->data_lock);
444 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
445 if (peer->vdev_id != vdev_id)
446 continue;
447
448 ath10k_warn("removing stale peer %pM from vdev_id %d\n",
449 peer->addr, vdev_id);
450
451 list_del(&peer->list);
452 kfree(peer);
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100453 ar->num_peers--;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300454 }
455 spin_unlock_bh(&ar->data_lock);
456}
457
Michal Kaziora96d7742013-07-16 09:38:56 +0200458static void ath10k_peer_cleanup_all(struct ath10k *ar)
459{
460 struct ath10k_peer *peer, *tmp;
461
462 lockdep_assert_held(&ar->conf_mutex);
463
464 spin_lock_bh(&ar->data_lock);
465 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
466 list_del(&peer->list);
467 kfree(peer);
468 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100469 ar->num_peers = 0;
Michal Kaziora96d7742013-07-16 09:38:56 +0200470 spin_unlock_bh(&ar->data_lock);
471}
472
Kalle Valo5e3dd152013-06-12 20:52:10 +0300473/************************/
474/* Interface management */
475/************************/
476
477static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
478{
479 int ret;
480
Michal Kazior548db542013-07-05 16:15:15 +0300481 lockdep_assert_held(&ar->conf_mutex);
482
Kalle Valo5e3dd152013-06-12 20:52:10 +0300483 ret = wait_for_completion_timeout(&ar->vdev_setup_done,
484 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
485 if (ret == 0)
486 return -ETIMEDOUT;
487
488 return 0;
489}
490
491static int ath10k_vdev_start(struct ath10k_vif *arvif)
492{
493 struct ath10k *ar = arvif->ar;
Michal Kaziorc930f742014-01-23 11:38:25 +0100494 struct cfg80211_chan_def *chandef = &ar->chandef;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300495 struct wmi_vdev_start_request_arg arg = {};
496 int ret = 0;
497
498 lockdep_assert_held(&ar->conf_mutex);
499
Wolfram Sang16735d02013-11-14 14:32:02 -0800500 reinit_completion(&ar->vdev_setup_done);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300501
502 arg.vdev_id = arvif->vdev_id;
503 arg.dtim_period = arvif->dtim_period;
504 arg.bcn_intval = arvif->beacon_interval;
505
Michal Kaziorc930f742014-01-23 11:38:25 +0100506 arg.channel.freq = chandef->chan->center_freq;
507 arg.channel.band_center_freq1 = chandef->center_freq1;
508 arg.channel.mode = chan_to_phymode(chandef);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300509
Michal Kazior89c5c842013-10-23 04:02:13 -0700510 arg.channel.min_power = 0;
Michal Kaziorc930f742014-01-23 11:38:25 +0100511 arg.channel.max_power = chandef->chan->max_power * 2;
512 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
513 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300514
515 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
516 arg.ssid = arvif->u.ap.ssid;
517 arg.ssid_len = arvif->u.ap.ssid_len;
518 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200519
520 /* For now allow DFS for AP mode */
521 arg.channel.chan_radar =
Michal Kaziorc930f742014-01-23 11:38:25 +0100522 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300523 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
524 arg.ssid = arvif->vif->bss_conf.ssid;
525 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
526 }
527
Kalle Valo38a1d472013-09-08 17:56:14 +0300528 ath10k_dbg(ATH10K_DBG_MAC,
529 "mac vdev %d start center_freq %d phymode %s\n",
530 arg.vdev_id, arg.channel.freq,
531 ath10k_wmi_phymode_str(arg.channel.mode));
532
Kalle Valo5e3dd152013-06-12 20:52:10 +0300533 ret = ath10k_wmi_vdev_start(ar, &arg);
534 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200535 ath10k_warn("WMI vdev %i start failed: ret %d\n",
536 arg.vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300537 return ret;
538 }
539
540 ret = ath10k_vdev_setup_sync(ar);
541 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200542 ath10k_warn("vdev %i setup failed %d\n",
543 arg.vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300544 return ret;
545 }
546
547 return ret;
548}
549
550static int ath10k_vdev_stop(struct ath10k_vif *arvif)
551{
552 struct ath10k *ar = arvif->ar;
553 int ret;
554
555 lockdep_assert_held(&ar->conf_mutex);
556
Wolfram Sang16735d02013-11-14 14:32:02 -0800557 reinit_completion(&ar->vdev_setup_done);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300558
559 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
560 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200561 ath10k_warn("WMI vdev %i stop failed: ret %d\n",
562 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300563 return ret;
564 }
565
566 ret = ath10k_vdev_setup_sync(ar);
567 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200568 ath10k_warn("vdev %i setup sync failed %d\n",
569 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300570 return ret;
571 }
572
573 return ret;
574}
575
576static int ath10k_monitor_start(struct ath10k *ar, int vdev_id)
577{
Michal Kaziorc930f742014-01-23 11:38:25 +0100578 struct cfg80211_chan_def *chandef = &ar->chandef;
579 struct ieee80211_channel *channel = chandef->chan;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300580 struct wmi_vdev_start_request_arg arg = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300581 int ret = 0;
582
583 lockdep_assert_held(&ar->conf_mutex);
584
Michal Kazior0ed00ee2013-10-16 16:45:48 +0300585 if (!ar->monitor_present) {
586 ath10k_warn("mac montor stop -- monitor is not present\n");
587 return -EINVAL;
588 }
589
Kalle Valo5e3dd152013-06-12 20:52:10 +0300590 arg.vdev_id = vdev_id;
591 arg.channel.freq = channel->center_freq;
Michal Kaziorc930f742014-01-23 11:38:25 +0100592 arg.channel.band_center_freq1 = chandef->center_freq1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300593
594 /* TODO setup this dynamically, what in case we
595 don't have any vifs? */
Michal Kaziorc930f742014-01-23 11:38:25 +0100596 arg.channel.mode = chan_to_phymode(chandef);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200597 arg.channel.chan_radar =
598 !!(channel->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300599
Michal Kazior89c5c842013-10-23 04:02:13 -0700600 arg.channel.min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -0700601 arg.channel.max_power = channel->max_power * 2;
602 arg.channel.max_reg_power = channel->max_reg_power * 2;
603 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300604
605 ret = ath10k_wmi_vdev_start(ar, &arg);
606 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200607 ath10k_warn("Monitor vdev %i start failed: ret %d\n",
608 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300609 return ret;
610 }
611
612 ret = ath10k_vdev_setup_sync(ar);
613 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200614 ath10k_warn("Monitor vdev %i setup failed %d\n",
615 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300616 return ret;
617 }
618
619 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
620 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200621 ath10k_warn("Monitor vdev %i up failed: %d\n",
622 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300623 goto vdev_stop;
624 }
625
626 ar->monitor_vdev_id = vdev_id;
627 ar->monitor_enabled = true;
628
629 return 0;
630
631vdev_stop:
632 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
633 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +0200634 ath10k_warn("Monitor vdev %i stop failed: %d\n",
635 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300636
637 return ret;
638}
639
640static int ath10k_monitor_stop(struct ath10k *ar)
641{
642 int ret = 0;
643
644 lockdep_assert_held(&ar->conf_mutex);
645
Michal Kazior0ed00ee2013-10-16 16:45:48 +0300646 if (!ar->monitor_present) {
647 ath10k_warn("mac montor stop -- monitor is not present\n");
648 return -EINVAL;
649 }
650
651 if (!ar->monitor_enabled) {
652 ath10k_warn("mac montor stop -- monitor is not enabled\n");
653 return -EINVAL;
654 }
655
Marek Puzyniak52fa0192013-09-24 14:06:24 +0200656 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
657 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +0200658 ath10k_warn("Monitor vdev %i down failed: %d\n",
659 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300660
661 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
662 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +0200663 ath10k_warn("Monitor vdev %i stop failed: %d\n",
664 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300665
666 ret = ath10k_vdev_setup_sync(ar);
667 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +0200668 ath10k_warn("Monitor_down sync failed, vdev %i: %d\n",
669 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300670
671 ar->monitor_enabled = false;
672 return ret;
673}
674
675static int ath10k_monitor_create(struct ath10k *ar)
676{
677 int bit, ret = 0;
678
679 lockdep_assert_held(&ar->conf_mutex);
680
681 if (ar->monitor_present) {
682 ath10k_warn("Monitor mode already enabled\n");
683 return 0;
684 }
685
686 bit = ffs(ar->free_vdev_map);
687 if (bit == 0) {
688 ath10k_warn("No free VDEV slots\n");
689 return -ENOMEM;
690 }
691
692 ar->monitor_vdev_id = bit - 1;
693 ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id);
694
695 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
696 WMI_VDEV_TYPE_MONITOR,
697 0, ar->mac_addr);
698 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200699 ath10k_warn("WMI vdev %i monitor create failed: ret %d\n",
700 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300701 goto vdev_fail;
702 }
703
Kalle Valo60c3daa2013-09-08 17:56:07 +0300704 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300705 ar->monitor_vdev_id);
706
707 ar->monitor_present = true;
708 return 0;
709
710vdev_fail:
711 /*
712 * Restore the ID to the global map.
713 */
714 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
715 return ret;
716}
717
718static int ath10k_monitor_destroy(struct ath10k *ar)
719{
720 int ret = 0;
721
722 lockdep_assert_held(&ar->conf_mutex);
723
724 if (!ar->monitor_present)
725 return 0;
726
727 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
728 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200729 ath10k_warn("WMI vdev %i monitor delete failed: %d\n",
730 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300731 return ret;
732 }
733
734 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
735 ar->monitor_present = false;
736
Kalle Valo60c3daa2013-09-08 17:56:07 +0300737 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300738 ar->monitor_vdev_id);
739 return ret;
740}
741
Marek Kwaczynskie81bd102014-03-11 12:58:00 +0200742static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
743{
744 struct ath10k *ar = arvif->ar;
745 u32 vdev_param, rts_cts = 0;
746
747 lockdep_assert_held(&ar->conf_mutex);
748
749 vdev_param = ar->wmi.vdev_param->enable_rtscts;
750
751 if (arvif->use_cts_prot || arvif->num_legacy_stations > 0)
752 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
753
754 if (arvif->num_legacy_stations > 0)
755 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
756 WMI_RTSCTS_PROFILE);
757
758 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
759 rts_cts);
760}
761
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200762static int ath10k_start_cac(struct ath10k *ar)
763{
764 int ret;
765
766 lockdep_assert_held(&ar->conf_mutex);
767
768 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
769
770 ret = ath10k_monitor_create(ar);
771 if (ret) {
772 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
773 return ret;
774 }
775
776 ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
777 if (ret) {
778 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
779 ath10k_monitor_destroy(ar);
780 return ret;
781 }
782
783 ath10k_dbg(ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
784 ar->monitor_vdev_id);
785
786 return 0;
787}
788
789static int ath10k_stop_cac(struct ath10k *ar)
790{
791 lockdep_assert_held(&ar->conf_mutex);
792
793 /* CAC is not running - do nothing */
794 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
795 return 0;
796
797 ath10k_monitor_stop(ar);
798 ath10k_monitor_destroy(ar);
799 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
800
801 ath10k_dbg(ATH10K_DBG_MAC, "mac cac finished\n");
802
803 return 0;
804}
805
806static const char *ath10k_dfs_state(enum nl80211_dfs_state dfs_state)
807{
808 switch (dfs_state) {
809 case NL80211_DFS_USABLE:
810 return "USABLE";
811 case NL80211_DFS_UNAVAILABLE:
812 return "UNAVAILABLE";
813 case NL80211_DFS_AVAILABLE:
814 return "AVAILABLE";
815 default:
816 WARN_ON(1);
817 return "bug";
818 }
819}
820
821static void ath10k_config_radar_detection(struct ath10k *ar)
822{
823 struct ieee80211_channel *chan = ar->hw->conf.chandef.chan;
824 bool radar = ar->hw->conf.radar_enabled;
825 bool chan_radar = !!(chan->flags & IEEE80211_CHAN_RADAR);
826 enum nl80211_dfs_state dfs_state = chan->dfs_state;
827 int ret;
828
829 lockdep_assert_held(&ar->conf_mutex);
830
831 ath10k_dbg(ATH10K_DBG_MAC,
832 "mac radar config update: chan %dMHz radar %d chan radar %d chan state %s\n",
833 chan->center_freq, radar, chan_radar,
834 ath10k_dfs_state(dfs_state));
835
836 /*
837 * It's safe to call it even if CAC is not started.
838 * This call here guarantees changing channel, etc. will stop CAC.
839 */
840 ath10k_stop_cac(ar);
841
842 if (!radar)
843 return;
844
845 if (!chan_radar)
846 return;
847
848 if (dfs_state != NL80211_DFS_USABLE)
849 return;
850
851 ret = ath10k_start_cac(ar);
852 if (ret) {
853 /*
854 * Not possible to start CAC on current channel so starting
855 * radiation is not allowed, make this channel DFS_UNAVAILABLE
856 * by indicating that radar was detected.
857 */
858 ath10k_warn("failed to start CAC (%d)\n", ret);
859 ieee80211_radar_detected(ar->hw);
860 }
861}
862
Kalle Valo5e3dd152013-06-12 20:52:10 +0300863static void ath10k_control_beaconing(struct ath10k_vif *arvif,
864 struct ieee80211_bss_conf *info)
865{
866 int ret = 0;
867
Michal Kazior548db542013-07-05 16:15:15 +0300868 lockdep_assert_held(&arvif->ar->conf_mutex);
869
Kalle Valo5e3dd152013-06-12 20:52:10 +0300870 if (!info->enable_beacon) {
871 ath10k_vdev_stop(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +0100872
873 arvif->is_started = false;
874 arvif->is_up = false;
875
Michal Kazior748afc42014-01-23 12:48:21 +0100876 spin_lock_bh(&arvif->ar->data_lock);
877 if (arvif->beacon) {
Michal Kazior767d34f2014-02-27 18:50:03 +0200878 dma_unmap_single(arvif->ar->dev,
879 ATH10K_SKB_CB(arvif->beacon)->paddr,
880 arvif->beacon->len, DMA_TO_DEVICE);
Michal Kazior748afc42014-01-23 12:48:21 +0100881 dev_kfree_skb_any(arvif->beacon);
882
883 arvif->beacon = NULL;
884 arvif->beacon_sent = false;
885 }
886 spin_unlock_bh(&arvif->ar->data_lock);
887
Kalle Valo5e3dd152013-06-12 20:52:10 +0300888 return;
889 }
890
891 arvif->tx_seq_no = 0x1000;
892
893 ret = ath10k_vdev_start(arvif);
894 if (ret)
895 return;
896
Michal Kaziorc930f742014-01-23 11:38:25 +0100897 arvif->aid = 0;
898 memcpy(arvif->bssid, info->bssid, ETH_ALEN);
899
900 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
901 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300902 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200903 ath10k_warn("Failed to bring up vdev %d: %i\n",
904 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +0100905 ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300906 return;
907 }
Michal Kaziorc930f742014-01-23 11:38:25 +0100908
909 arvif->is_started = true;
910 arvif->is_up = true;
911
Kalle Valo60c3daa2013-09-08 17:56:07 +0300912 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300913}
914
915static void ath10k_control_ibss(struct ath10k_vif *arvif,
916 struct ieee80211_bss_conf *info,
917 const u8 self_peer[ETH_ALEN])
918{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200919 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300920 int ret = 0;
921
Michal Kazior548db542013-07-05 16:15:15 +0300922 lockdep_assert_held(&arvif->ar->conf_mutex);
923
Kalle Valo5e3dd152013-06-12 20:52:10 +0300924 if (!info->ibss_joined) {
925 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
926 if (ret)
927 ath10k_warn("Failed to delete IBSS self peer:%pM for VDEV:%d ret:%d\n",
928 self_peer, arvif->vdev_id, ret);
929
Michal Kaziorc930f742014-01-23 11:38:25 +0100930 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +0300931 return;
932
933 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id,
Michal Kaziorc930f742014-01-23 11:38:25 +0100934 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300935 if (ret) {
936 ath10k_warn("Failed to delete IBSS BSSID peer:%pM for VDEV:%d ret:%d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +0100937 arvif->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300938 return;
939 }
940
Michal Kaziorc930f742014-01-23 11:38:25 +0100941 memset(arvif->bssid, 0, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300942
943 return;
944 }
945
946 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
947 if (ret) {
948 ath10k_warn("Failed to create IBSS self peer:%pM for VDEV:%d ret:%d\n",
949 self_peer, arvif->vdev_id, ret);
950 return;
951 }
952
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200953 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
954 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +0300955 ATH10K_DEFAULT_ATIM);
956 if (ret)
957 ath10k_warn("Failed to set IBSS ATIM for VDEV:%d ret:%d\n",
958 arvif->vdev_id, ret);
959}
960
961/*
962 * Review this when mac80211 gains per-interface powersave support.
963 */
Michal Kaziorad088bf2013-10-16 15:44:46 +0300964static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300965{
Michal Kaziorad088bf2013-10-16 15:44:46 +0300966 struct ath10k *ar = arvif->ar;
967 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300968 enum wmi_sta_powersave_param param;
969 enum wmi_sta_ps_mode psmode;
970 int ret;
971
Michal Kazior548db542013-07-05 16:15:15 +0300972 lockdep_assert_held(&arvif->ar->conf_mutex);
973
Michal Kaziorad088bf2013-10-16 15:44:46 +0300974 if (arvif->vif->type != NL80211_IFTYPE_STATION)
975 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300976
977 if (conf->flags & IEEE80211_CONF_PS) {
978 psmode = WMI_STA_PS_MODE_ENABLED;
979 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
980
Michal Kaziorad088bf2013-10-16 15:44:46 +0300981 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Kalle Valo5e3dd152013-06-12 20:52:10 +0300982 conf->dynamic_ps_timeout);
983 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +0200984 ath10k_warn("Failed to set inactivity time for vdev %d: %i\n",
985 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +0300986 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300987 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300988 } else {
989 psmode = WMI_STA_PS_MODE_DISABLED;
990 }
991
Kalle Valo60c3daa2013-09-08 17:56:07 +0300992 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
993 arvif->vdev_id, psmode ? "enable" : "disable");
994
Michal Kaziorad088bf2013-10-16 15:44:46 +0300995 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
996 if (ret) {
Kalle Valo5e3dd152013-06-12 20:52:10 +0300997 ath10k_warn("Failed to set PS Mode: %d for VDEV: %d\n",
998 psmode, arvif->vdev_id);
Michal Kaziorad088bf2013-10-16 15:44:46 +0300999 return ret;
1000 }
1001
1002 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001003}
1004
1005/**********************/
1006/* Station management */
1007/**********************/
1008
1009static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
1010 struct ath10k_vif *arvif,
1011 struct ieee80211_sta *sta,
1012 struct ieee80211_bss_conf *bss_conf,
1013 struct wmi_peer_assoc_complete_arg *arg)
1014{
Michal Kazior548db542013-07-05 16:15:15 +03001015 lockdep_assert_held(&ar->conf_mutex);
1016
Kalle Valo5e3dd152013-06-12 20:52:10 +03001017 memcpy(arg->addr, sta->addr, ETH_ALEN);
1018 arg->vdev_id = arvif->vdev_id;
1019 arg->peer_aid = sta->aid;
1020 arg->peer_flags |= WMI_PEER_AUTH;
1021
1022 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
1023 /*
1024 * Seems FW have problems with Power Save in STA
1025 * mode when we setup this parameter to high (eg. 5).
1026 * Often we see that FW don't send NULL (with clean P flags)
1027 * frame even there is info about buffered frames in beacons.
1028 * Sometimes we have to wait more than 10 seconds before FW
1029 * will wakeup. Often sending one ping from AP to our device
1030 * just fail (more than 50%).
1031 *
1032 * Seems setting this FW parameter to 1 couse FW
1033 * will check every beacon and will wakup immediately
1034 * after detection buffered data.
1035 */
1036 arg->peer_listen_intval = 1;
1037 else
1038 arg->peer_listen_intval = ar->hw->conf.listen_interval;
1039
1040 arg->peer_num_spatial_streams = 1;
1041
1042 /*
1043 * The assoc capabilities are available only in managed mode.
1044 */
1045 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && bss_conf)
1046 arg->peer_caps = bss_conf->assoc_capability;
1047}
1048
1049static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1050 struct ath10k_vif *arvif,
1051 struct wmi_peer_assoc_complete_arg *arg)
1052{
1053 struct ieee80211_vif *vif = arvif->vif;
1054 struct ieee80211_bss_conf *info = &vif->bss_conf;
1055 struct cfg80211_bss *bss;
1056 const u8 *rsnie = NULL;
1057 const u8 *wpaie = NULL;
1058
Michal Kazior548db542013-07-05 16:15:15 +03001059 lockdep_assert_held(&ar->conf_mutex);
1060
Kalle Valo5e3dd152013-06-12 20:52:10 +03001061 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1062 info->bssid, NULL, 0, 0, 0);
1063 if (bss) {
1064 const struct cfg80211_bss_ies *ies;
1065
1066 rcu_read_lock();
1067 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1068
1069 ies = rcu_dereference(bss->ies);
1070
1071 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1072 WLAN_OUI_TYPE_MICROSOFT_WPA,
1073 ies->data,
1074 ies->len);
1075 rcu_read_unlock();
1076 cfg80211_put_bss(ar->hw->wiphy, bss);
1077 }
1078
1079 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1080 if (rsnie || wpaie) {
1081 ath10k_dbg(ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
1082 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1083 }
1084
1085 if (wpaie) {
1086 ath10k_dbg(ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
1087 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1088 }
1089}
1090
1091static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
1092 struct ieee80211_sta *sta,
1093 struct wmi_peer_assoc_complete_arg *arg)
1094{
1095 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1096 const struct ieee80211_supported_band *sband;
1097 const struct ieee80211_rate *rates;
1098 u32 ratemask;
1099 int i;
1100
Michal Kazior548db542013-07-05 16:15:15 +03001101 lockdep_assert_held(&ar->conf_mutex);
1102
Kalle Valo5e3dd152013-06-12 20:52:10 +03001103 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1104 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1105 rates = sband->bitrates;
1106
1107 rateset->num_rates = 0;
1108
1109 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1110 if (!(ratemask & 1))
1111 continue;
1112
1113 rateset->rates[rateset->num_rates] = rates->hw_value;
1114 rateset->num_rates++;
1115 }
1116}
1117
1118static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1119 struct ieee80211_sta *sta,
1120 struct wmi_peer_assoc_complete_arg *arg)
1121{
1122 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001123 int i, n;
1124
Michal Kazior548db542013-07-05 16:15:15 +03001125 lockdep_assert_held(&ar->conf_mutex);
1126
Kalle Valo5e3dd152013-06-12 20:52:10 +03001127 if (!ht_cap->ht_supported)
1128 return;
1129
1130 arg->peer_flags |= WMI_PEER_HT;
1131 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1132 ht_cap->ampdu_factor)) - 1;
1133
1134 arg->peer_mpdu_density =
1135 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1136
1137 arg->peer_ht_caps = ht_cap->cap;
1138 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1139
1140 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1141 arg->peer_flags |= WMI_PEER_LDPC;
1142
1143 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1144 arg->peer_flags |= WMI_PEER_40MHZ;
1145 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1146 }
1147
1148 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1149 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1150
1151 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1152 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1153
1154 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1155 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1156 arg->peer_flags |= WMI_PEER_STBC;
1157 }
1158
1159 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1160 u32 stbc;
1161 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1162 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1163 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1164 arg->peer_rate_caps |= stbc;
1165 arg->peer_flags |= WMI_PEER_STBC;
1166 }
1167
Kalle Valo5e3dd152013-06-12 20:52:10 +03001168 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1169 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1170 else if (ht_cap->mcs.rx_mask[1])
1171 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1172
1173 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1174 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1175 arg->peer_ht_rates.rates[n++] = i;
1176
Bartosz Markowskifd71f802014-02-10 13:12:55 +01001177 /*
1178 * This is a workaround for HT-enabled STAs which break the spec
1179 * and have no HT capabilities RX mask (no HT RX MCS map).
1180 *
1181 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1182 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1183 *
1184 * Firmware asserts if such situation occurs.
1185 */
1186 if (n == 0) {
1187 arg->peer_ht_rates.num_rates = 8;
1188 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1189 arg->peer_ht_rates.rates[i] = i;
1190 } else {
1191 arg->peer_ht_rates.num_rates = n;
1192 arg->peer_num_spatial_streams = sta->rx_nss;
1193 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001194
Kalle Valo60c3daa2013-09-08 17:56:07 +03001195 ath10k_dbg(ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1196 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001197 arg->peer_ht_rates.num_rates,
1198 arg->peer_num_spatial_streams);
1199}
1200
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001201static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1202 struct ath10k_vif *arvif,
1203 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001204{
1205 u32 uapsd = 0;
1206 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001207 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001208
Michal Kazior548db542013-07-05 16:15:15 +03001209 lockdep_assert_held(&ar->conf_mutex);
1210
Kalle Valo5e3dd152013-06-12 20:52:10 +03001211 if (sta->wme && sta->uapsd_queues) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03001212 ath10k_dbg(ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001213 sta->uapsd_queues, sta->max_sp);
1214
Kalle Valo5e3dd152013-06-12 20:52:10 +03001215 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1216 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1217 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1218 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1219 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1220 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1221 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1222 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1223 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1224 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1225 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1226 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1227
1228
1229 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1230 max_sp = sta->max_sp;
1231
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001232 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1233 sta->addr,
1234 WMI_AP_PS_PEER_PARAM_UAPSD,
1235 uapsd);
1236 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001237 ath10k_warn("failed to set ap ps peer param uapsd for vdev %i: %d\n",
1238 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001239 return ret;
1240 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001241
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001242 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1243 sta->addr,
1244 WMI_AP_PS_PEER_PARAM_MAX_SP,
1245 max_sp);
1246 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001247 ath10k_warn("failed to set ap ps peer param max sp for vdev %i: %d\n",
1248 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001249 return ret;
1250 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001251
1252 /* TODO setup this based on STA listen interval and
1253 beacon interval. Currently we don't know
1254 sta->listen_interval - mac80211 patch required.
1255 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001256 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
1257 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME, 10);
1258 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001259 ath10k_warn("failed to set ap ps peer param ageout time for vdev %i: %d\n",
1260 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001261 return ret;
1262 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001263 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001264
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001265 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001266}
1267
1268static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1269 struct ieee80211_sta *sta,
1270 struct wmi_peer_assoc_complete_arg *arg)
1271{
1272 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001273 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001274
1275 if (!vht_cap->vht_supported)
1276 return;
1277
1278 arg->peer_flags |= WMI_PEER_VHT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001279 arg->peer_vht_caps = vht_cap->cap;
1280
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001281
1282 ampdu_factor = (vht_cap->cap &
1283 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1284 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1285
1286 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1287 * zero in VHT IE. Using it would result in degraded throughput.
1288 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1289 * it if VHT max_mpdu is smaller. */
1290 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1291 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1292 ampdu_factor)) - 1);
1293
Kalle Valo5e3dd152013-06-12 20:52:10 +03001294 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1295 arg->peer_flags |= WMI_PEER_80MHZ;
1296
1297 arg->peer_vht_rates.rx_max_rate =
1298 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1299 arg->peer_vht_rates.rx_mcs_set =
1300 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1301 arg->peer_vht_rates.tx_max_rate =
1302 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1303 arg->peer_vht_rates.tx_mcs_set =
1304 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1305
Kalle Valo60c3daa2013-09-08 17:56:07 +03001306 ath10k_dbg(ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1307 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001308}
1309
1310static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1311 struct ath10k_vif *arvif,
1312 struct ieee80211_sta *sta,
1313 struct ieee80211_bss_conf *bss_conf,
1314 struct wmi_peer_assoc_complete_arg *arg)
1315{
1316 switch (arvif->vdev_type) {
1317 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001318 if (sta->wme)
1319 arg->peer_flags |= WMI_PEER_QOS;
1320
1321 if (sta->wme && sta->uapsd_queues) {
1322 arg->peer_flags |= WMI_PEER_APSD;
1323 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1324 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001325 break;
1326 case WMI_VDEV_TYPE_STA:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001327 if (bss_conf->qos)
1328 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001329 break;
1330 default:
1331 break;
1332 }
1333}
1334
1335static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1336 struct ath10k_vif *arvif,
1337 struct ieee80211_sta *sta,
1338 struct wmi_peer_assoc_complete_arg *arg)
1339{
1340 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1341
Kalle Valo5e3dd152013-06-12 20:52:10 +03001342 switch (ar->hw->conf.chandef.chan->band) {
1343 case IEEE80211_BAND_2GHZ:
1344 if (sta->ht_cap.ht_supported) {
1345 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1346 phymode = MODE_11NG_HT40;
1347 else
1348 phymode = MODE_11NG_HT20;
1349 } else {
1350 phymode = MODE_11G;
1351 }
1352
1353 break;
1354 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03001355 /*
1356 * Check VHT first.
1357 */
1358 if (sta->vht_cap.vht_supported) {
1359 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1360 phymode = MODE_11AC_VHT80;
1361 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1362 phymode = MODE_11AC_VHT40;
1363 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1364 phymode = MODE_11AC_VHT20;
1365 } else if (sta->ht_cap.ht_supported) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001366 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1367 phymode = MODE_11NA_HT40;
1368 else
1369 phymode = MODE_11NA_HT20;
1370 } else {
1371 phymode = MODE_11A;
1372 }
1373
1374 break;
1375 default:
1376 break;
1377 }
1378
Kalle Valo38a1d472013-09-08 17:56:14 +03001379 ath10k_dbg(ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1380 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03001381
Kalle Valo5e3dd152013-06-12 20:52:10 +03001382 arg->peer_phymode = phymode;
1383 WARN_ON(phymode == MODE_UNKNOWN);
1384}
1385
Kalle Valob9ada652013-10-16 15:44:46 +03001386static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1387 struct ath10k_vif *arvif,
1388 struct ieee80211_sta *sta,
1389 struct ieee80211_bss_conf *bss_conf,
1390 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001391{
Michal Kazior548db542013-07-05 16:15:15 +03001392 lockdep_assert_held(&ar->conf_mutex);
1393
Kalle Valob9ada652013-10-16 15:44:46 +03001394 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03001395
Kalle Valob9ada652013-10-16 15:44:46 +03001396 ath10k_peer_assoc_h_basic(ar, arvif, sta, bss_conf, arg);
1397 ath10k_peer_assoc_h_crypto(ar, arvif, arg);
1398 ath10k_peer_assoc_h_rates(ar, sta, arg);
1399 ath10k_peer_assoc_h_ht(ar, sta, arg);
1400 ath10k_peer_assoc_h_vht(ar, sta, arg);
1401 ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, arg);
1402 ath10k_peer_assoc_h_phymode(ar, arvif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001403
Kalle Valob9ada652013-10-16 15:44:46 +03001404 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001405}
1406
Michal Kazior90046f52014-02-14 14:45:51 +01001407static const u32 ath10k_smps_map[] = {
1408 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
1409 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
1410 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
1411 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
1412};
1413
1414static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1415 const u8 *addr,
1416 const struct ieee80211_sta_ht_cap *ht_cap)
1417{
1418 int smps;
1419
1420 if (!ht_cap->ht_supported)
1421 return 0;
1422
1423 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1424 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1425
1426 if (smps >= ARRAY_SIZE(ath10k_smps_map))
1427 return -EINVAL;
1428
1429 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
1430 WMI_PEER_SMPS_STATE,
1431 ath10k_smps_map[smps]);
1432}
1433
Kalle Valo5e3dd152013-06-12 20:52:10 +03001434/* can be called only in mac80211 callbacks due to `key_count` usage */
1435static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1436 struct ieee80211_vif *vif,
1437 struct ieee80211_bss_conf *bss_conf)
1438{
1439 struct ath10k *ar = hw->priv;
1440 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01001441 struct ieee80211_sta_ht_cap ht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03001442 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001443 struct ieee80211_sta *ap_sta;
1444 int ret;
1445
Michal Kazior548db542013-07-05 16:15:15 +03001446 lockdep_assert_held(&ar->conf_mutex);
1447
Kalle Valo5e3dd152013-06-12 20:52:10 +03001448 rcu_read_lock();
1449
1450 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1451 if (!ap_sta) {
Ben Greear69244e52014-02-27 18:50:00 +02001452 ath10k_warn("Failed to find station entry for %pM, vdev %i\n",
1453 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001454 rcu_read_unlock();
1455 return;
1456 }
1457
Michal Kazior90046f52014-02-14 14:45:51 +01001458 /* ap_sta must be accessed only within rcu section which must be left
1459 * before calling ath10k_setup_peer_smps() which might sleep. */
1460 ht_cap = ap_sta->ht_cap;
1461
Kalle Valob9ada652013-10-16 15:44:46 +03001462 ret = ath10k_peer_assoc_prepare(ar, arvif, ap_sta,
1463 bss_conf, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001464 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001465 ath10k_warn("Peer assoc prepare failed for %pM vdev %i\n: %d",
1466 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001467 rcu_read_unlock();
1468 return;
1469 }
1470
1471 rcu_read_unlock();
1472
Kalle Valob9ada652013-10-16 15:44:46 +03001473 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1474 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001475 ath10k_warn("Peer assoc failed for %pM vdev %i\n: %d",
1476 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001477 return;
1478 }
1479
Michal Kazior90046f52014-02-14 14:45:51 +01001480 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
1481 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001482 ath10k_warn("failed to setup peer SMPS for vdev %i: %d\n",
1483 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01001484 return;
1485 }
1486
Kalle Valo60c3daa2013-09-08 17:56:07 +03001487 ath10k_dbg(ATH10K_DBG_MAC,
1488 "mac vdev %d up (associated) bssid %pM aid %d\n",
1489 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1490
Michal Kaziorc930f742014-01-23 11:38:25 +01001491 arvif->aid = bss_conf->aid;
1492 memcpy(arvif->bssid, bss_conf->bssid, ETH_ALEN);
1493
1494 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1495 if (ret) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001496 ath10k_warn("VDEV: %d up failed: ret %d\n",
1497 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001498 return;
1499 }
1500
1501 arvif->is_up = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001502}
1503
1504/*
1505 * FIXME: flush TIDs
1506 */
1507static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1508 struct ieee80211_vif *vif)
1509{
1510 struct ath10k *ar = hw->priv;
1511 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1512 int ret;
1513
Michal Kazior548db542013-07-05 16:15:15 +03001514 lockdep_assert_held(&ar->conf_mutex);
1515
Kalle Valo5e3dd152013-06-12 20:52:10 +03001516 /*
1517 * For some reason, calling VDEV-DOWN before VDEV-STOP
1518 * makes the FW to send frames via HTT after disassociation.
1519 * No idea why this happens, even though VDEV-DOWN is supposed
1520 * to be analogous to link down, so just stop the VDEV.
1521 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03001522 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d stop (disassociated\n",
1523 arvif->vdev_id);
1524
1525 /* FIXME: check return value */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001526 ret = ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001527
1528 /*
1529 * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1530 * report beacons from previously associated network through HTT.
1531 * This in turn would spam mac80211 WARN_ON if we bring down all
1532 * interfaces as it expects there is no rx when no interface is
1533 * running.
1534 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03001535 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d down\n", arvif->vdev_id);
1536
1537 /* FIXME: why don't we print error if wmi call fails? */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001538 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001539
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001540 arvif->def_wep_key_idx = 0;
Michal Kaziorc930f742014-01-23 11:38:25 +01001541
1542 arvif->is_started = false;
1543 arvif->is_up = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001544}
1545
1546static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02001547 struct ieee80211_sta *sta, bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001548{
Kalle Valob9ada652013-10-16 15:44:46 +03001549 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001550 int ret = 0;
1551
Michal Kazior548db542013-07-05 16:15:15 +03001552 lockdep_assert_held(&ar->conf_mutex);
1553
Kalle Valob9ada652013-10-16 15:44:46 +03001554 ret = ath10k_peer_assoc_prepare(ar, arvif, sta, NULL, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001555 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001556 ath10k_warn("WMI peer assoc prepare failed for %pM vdev %i: %i\n",
1557 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001558 return ret;
1559 }
1560
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02001561 peer_arg.peer_reassoc = reassoc;
Kalle Valob9ada652013-10-16 15:44:46 +03001562 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1563 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001564 ath10k_warn("Peer assoc failed for STA %pM vdev %i: %d\n",
1565 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001566 return ret;
1567 }
1568
Michal Kazior90046f52014-02-14 14:45:51 +01001569 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr, &sta->ht_cap);
1570 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001571 ath10k_warn("failed to setup peer SMPS for vdev: %d\n", ret);
Michal Kazior90046f52014-02-14 14:45:51 +01001572 return ret;
1573 }
1574
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001575 if (!sta->wme) {
1576 arvif->num_legacy_stations++;
1577 ret = ath10k_recalc_rtscts_prot(arvif);
1578 if (ret) {
1579 ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
1580 arvif->vdev_id, ret);
1581 return ret;
1582 }
1583 }
1584
Kalle Valo5e3dd152013-06-12 20:52:10 +03001585 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1586 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001587 ath10k_warn("could not install peer wep keys for vdev %i: %d\n",
1588 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001589 return ret;
1590 }
1591
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001592 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
1593 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001594 ath10k_warn("could not set qos params for STA %pM for vdev %i: %d\n",
1595 sta->addr, arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001596 return ret;
1597 }
1598
Kalle Valo5e3dd152013-06-12 20:52:10 +03001599 return ret;
1600}
1601
1602static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
1603 struct ieee80211_sta *sta)
1604{
1605 int ret = 0;
1606
Michal Kazior548db542013-07-05 16:15:15 +03001607 lockdep_assert_held(&ar->conf_mutex);
1608
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001609 if (!sta->wme) {
1610 arvif->num_legacy_stations--;
1611 ret = ath10k_recalc_rtscts_prot(arvif);
1612 if (ret) {
1613 ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
1614 arvif->vdev_id, ret);
1615 return ret;
1616 }
1617 }
1618
Kalle Valo5e3dd152013-06-12 20:52:10 +03001619 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1620 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001621 ath10k_warn("could not clear all peer wep keys for vdev %i: %d\n",
1622 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001623 return ret;
1624 }
1625
1626 return ret;
1627}
1628
1629/**************/
1630/* Regulatory */
1631/**************/
1632
1633static int ath10k_update_channel_list(struct ath10k *ar)
1634{
1635 struct ieee80211_hw *hw = ar->hw;
1636 struct ieee80211_supported_band **bands;
1637 enum ieee80211_band band;
1638 struct ieee80211_channel *channel;
1639 struct wmi_scan_chan_list_arg arg = {0};
1640 struct wmi_channel_arg *ch;
1641 bool passive;
1642 int len;
1643 int ret;
1644 int i;
1645
Michal Kazior548db542013-07-05 16:15:15 +03001646 lockdep_assert_held(&ar->conf_mutex);
1647
Kalle Valo5e3dd152013-06-12 20:52:10 +03001648 bands = hw->wiphy->bands;
1649 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1650 if (!bands[band])
1651 continue;
1652
1653 for (i = 0; i < bands[band]->n_channels; i++) {
1654 if (bands[band]->channels[i].flags &
1655 IEEE80211_CHAN_DISABLED)
1656 continue;
1657
1658 arg.n_channels++;
1659 }
1660 }
1661
1662 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1663 arg.channels = kzalloc(len, GFP_KERNEL);
1664 if (!arg.channels)
1665 return -ENOMEM;
1666
1667 ch = arg.channels;
1668 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1669 if (!bands[band])
1670 continue;
1671
1672 for (i = 0; i < bands[band]->n_channels; i++) {
1673 channel = &bands[band]->channels[i];
1674
1675 if (channel->flags & IEEE80211_CHAN_DISABLED)
1676 continue;
1677
1678 ch->allow_ht = true;
1679
1680 /* FIXME: when should we really allow VHT? */
1681 ch->allow_vht = true;
1682
1683 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001684 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001685
1686 ch->ht40plus =
1687 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1688
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001689 ch->chan_radar =
1690 !!(channel->flags & IEEE80211_CHAN_RADAR);
1691
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001692 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001693 ch->passive = passive;
1694
1695 ch->freq = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07001696 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07001697 ch->max_power = channel->max_power * 2;
1698 ch->max_reg_power = channel->max_reg_power * 2;
1699 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001700 ch->reg_class_id = 0; /* FIXME */
1701
1702 /* FIXME: why use only legacy modes, why not any
1703 * HT/VHT modes? Would that even make any
1704 * difference? */
1705 if (channel->band == IEEE80211_BAND_2GHZ)
1706 ch->mode = MODE_11G;
1707 else
1708 ch->mode = MODE_11A;
1709
1710 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1711 continue;
1712
1713 ath10k_dbg(ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03001714 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1715 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001716 ch->freq, ch->max_power, ch->max_reg_power,
1717 ch->max_antenna_gain, ch->mode);
1718
1719 ch++;
1720 }
1721 }
1722
1723 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1724 kfree(arg.channels);
1725
1726 return ret;
1727}
1728
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001729static enum wmi_dfs_region
1730ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
1731{
1732 switch (dfs_region) {
1733 case NL80211_DFS_UNSET:
1734 return WMI_UNINIT_DFS_DOMAIN;
1735 case NL80211_DFS_FCC:
1736 return WMI_FCC_DFS_DOMAIN;
1737 case NL80211_DFS_ETSI:
1738 return WMI_ETSI_DFS_DOMAIN;
1739 case NL80211_DFS_JP:
1740 return WMI_MKK4_DFS_DOMAIN;
1741 }
1742 return WMI_UNINIT_DFS_DOMAIN;
1743}
1744
Michal Kaziorf7843d72013-07-16 09:38:52 +02001745static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001746{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001747 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001748 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001749 enum wmi_dfs_region wmi_dfs_reg;
1750 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001751
Michal Kaziorf7843d72013-07-16 09:38:52 +02001752 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001753
1754 ret = ath10k_update_channel_list(ar);
1755 if (ret)
1756 ath10k_warn("could not update channel list (%d)\n", ret);
1757
1758 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001759
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001760 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1761 nl_dfs_reg = ar->dfs_detector->region;
1762 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
1763 } else {
1764 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
1765 }
1766
Kalle Valo5e3dd152013-06-12 20:52:10 +03001767 /* Target allows setting up per-band regdomain but ath_common provides
1768 * a combined one only */
1769 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02001770 regpair->reg_domain,
1771 regpair->reg_domain, /* 2ghz */
1772 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001773 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001774 regpair->reg_5ghz_ctl,
1775 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001776 if (ret)
1777 ath10k_warn("could not set pdev regdomain (%d)\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02001778}
Michal Kazior548db542013-07-05 16:15:15 +03001779
Michal Kaziorf7843d72013-07-16 09:38:52 +02001780static void ath10k_reg_notifier(struct wiphy *wiphy,
1781 struct regulatory_request *request)
1782{
1783 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1784 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001785 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001786
1787 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1788
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001789 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1790 ath10k_dbg(ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
1791 request->dfs_region);
1792 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1793 request->dfs_region);
1794 if (!result)
1795 ath10k_warn("dfs region 0x%X not supported, will trigger radar for every pulse\n",
1796 request->dfs_region);
1797 }
1798
Michal Kaziorf7843d72013-07-16 09:38:52 +02001799 mutex_lock(&ar->conf_mutex);
1800 if (ar->state == ATH10K_STATE_ON)
1801 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03001802 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001803}
1804
1805/***************/
1806/* TX handlers */
1807/***************/
1808
Michal Kazior42c3aa62013-10-02 11:03:38 +02001809static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1810{
1811 if (ieee80211_is_mgmt(hdr->frame_control))
1812 return HTT_DATA_TX_EXT_TID_MGMT;
1813
1814 if (!ieee80211_is_data_qos(hdr->frame_control))
1815 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1816
1817 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1818 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1819
1820 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1821}
1822
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001823static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar,
1824 struct ieee80211_tx_info *info)
1825{
1826 if (info->control.vif)
1827 return ath10k_vif_to_arvif(info->control.vif)->vdev_id;
1828
1829 if (ar->monitor_enabled)
1830 return ar->monitor_vdev_id;
1831
1832 ath10k_warn("could not resolve vdev id\n");
1833 return 0;
1834}
1835
Kalle Valo5e3dd152013-06-12 20:52:10 +03001836/*
1837 * Frames sent to the FW have to be in "Native Wifi" format.
1838 * Strip the QoS field from the 802.11 header.
1839 */
1840static void ath10k_tx_h_qos_workaround(struct ieee80211_hw *hw,
1841 struct ieee80211_tx_control *control,
1842 struct sk_buff *skb)
1843{
1844 struct ieee80211_hdr *hdr = (void *)skb->data;
1845 u8 *qos_ctl;
1846
1847 if (!ieee80211_is_data_qos(hdr->frame_control))
1848 return;
1849
1850 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02001851 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1852 skb->data, (void *)qos_ctl - (void *)skb->data);
1853 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001854}
1855
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001856static void ath10k_tx_wep_key_work(struct work_struct *work)
1857{
1858 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1859 wep_key_work);
1860 int ret, keyidx = arvif->def_wep_key_newidx;
1861
1862 if (arvif->def_wep_key_idx == keyidx)
1863 return;
1864
1865 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
1866 arvif->vdev_id, keyidx);
1867
1868 ret = ath10k_wmi_vdev_set_param(arvif->ar,
1869 arvif->vdev_id,
1870 arvif->ar->wmi.vdev_param->def_keyid,
1871 keyidx);
1872 if (ret) {
1873 ath10k_warn("could not update wep keyidx (%d)\n", ret);
1874 return;
1875 }
1876
1877 arvif->def_wep_key_idx = keyidx;
1878}
1879
Kalle Valo5e3dd152013-06-12 20:52:10 +03001880static void ath10k_tx_h_update_wep_key(struct sk_buff *skb)
1881{
1882 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1883 struct ieee80211_vif *vif = info->control.vif;
1884 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1885 struct ath10k *ar = arvif->ar;
1886 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1887 struct ieee80211_key_conf *key = info->control.hw_key;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001888
Kalle Valo5e3dd152013-06-12 20:52:10 +03001889 if (!ieee80211_has_protected(hdr->frame_control))
1890 return;
1891
1892 if (!key)
1893 return;
1894
1895 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1896 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1897 return;
1898
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001899 if (key->keyidx == arvif->def_wep_key_idx)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001900 return;
1901
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001902 /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1903 * queueing frames until key index is updated is not an option because
1904 * sk_buff may need more processing to be done, e.g. offchannel */
1905 arvif->def_wep_key_newidx = key->keyidx;
1906 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001907}
1908
1909static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, struct sk_buff *skb)
1910{
1911 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1912 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1913 struct ieee80211_vif *vif = info->control.vif;
1914 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1915
1916 /* This is case only for P2P_GO */
1917 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1918 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1919 return;
1920
1921 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1922 spin_lock_bh(&ar->data_lock);
1923 if (arvif->u.ap.noa_data)
1924 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
1925 GFP_ATOMIC))
1926 memcpy(skb_put(skb, arvif->u.ap.noa_len),
1927 arvif->u.ap.noa_data,
1928 arvif->u.ap.noa_len);
1929 spin_unlock_bh(&ar->data_lock);
1930 }
1931}
1932
1933static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
1934{
1935 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001936 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001937
Michal Kazior961d4c32013-08-09 10:13:34 +02001938 if (ar->htt.target_version_major >= 3) {
1939 /* Since HTT 3.0 there is no separate mgmt tx command */
1940 ret = ath10k_htt_tx(&ar->htt, skb);
1941 goto exit;
1942 }
1943
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001944 if (ieee80211_is_mgmt(hdr->frame_control)) {
1945 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1946 ar->fw_features)) {
1947 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
1948 ATH10K_MAX_NUM_MGMT_PENDING) {
1949 ath10k_warn("wmi mgmt_tx queue limit reached\n");
1950 ret = -EBUSY;
1951 goto exit;
1952 }
1953
1954 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
1955 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
1956 } else {
1957 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1958 }
1959 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1960 ar->fw_features) &&
1961 ieee80211_is_nullfunc(hdr->frame_control)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001962 /* FW does not report tx status properly for NullFunc frames
1963 * unless they are sent through mgmt tx path. mac80211 sends
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001964 * those frames when it detects link/beacon loss and depends
1965 * on the tx status to be correct. */
Michal Kazioredb82362013-07-05 16:15:14 +03001966 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001967 } else {
Michal Kazioredb82362013-07-05 16:15:14 +03001968 ret = ath10k_htt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001969 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001970
Michal Kazior961d4c32013-08-09 10:13:34 +02001971exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03001972 if (ret) {
1973 ath10k_warn("tx failed (%d). dropping packet.\n", ret);
1974 ieee80211_free_txskb(ar->hw, skb);
1975 }
1976}
1977
1978void ath10k_offchan_tx_purge(struct ath10k *ar)
1979{
1980 struct sk_buff *skb;
1981
1982 for (;;) {
1983 skb = skb_dequeue(&ar->offchan_tx_queue);
1984 if (!skb)
1985 break;
1986
1987 ieee80211_free_txskb(ar->hw, skb);
1988 }
1989}
1990
1991void ath10k_offchan_tx_work(struct work_struct *work)
1992{
1993 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
1994 struct ath10k_peer *peer;
1995 struct ieee80211_hdr *hdr;
1996 struct sk_buff *skb;
1997 const u8 *peer_addr;
1998 int vdev_id;
1999 int ret;
2000
2001 /* FW requirement: We must create a peer before FW will send out
2002 * an offchannel frame. Otherwise the frame will be stuck and
2003 * never transmitted. We delete the peer upon tx completion.
2004 * It is unlikely that a peer for offchannel tx will already be
2005 * present. However it may be in some rare cases so account for that.
2006 * Otherwise we might remove a legitimate peer and break stuff. */
2007
2008 for (;;) {
2009 skb = skb_dequeue(&ar->offchan_tx_queue);
2010 if (!skb)
2011 break;
2012
2013 mutex_lock(&ar->conf_mutex);
2014
Kalle Valo60c3daa2013-09-08 17:56:07 +03002015 ath10k_dbg(ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002016 skb);
2017
2018 hdr = (struct ieee80211_hdr *)skb->data;
2019 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002020 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002021
2022 spin_lock_bh(&ar->data_lock);
2023 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
2024 spin_unlock_bh(&ar->data_lock);
2025
2026 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03002027 /* FIXME: should this use ath10k_warn()? */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002028 ath10k_dbg(ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
2029 peer_addr, vdev_id);
2030
2031 if (!peer) {
2032 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
2033 if (ret)
2034 ath10k_warn("peer %pM on vdev %d not created (%d)\n",
2035 peer_addr, vdev_id, ret);
2036 }
2037
2038 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08002039 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002040 ar->offchan_tx_skb = skb;
2041 spin_unlock_bh(&ar->data_lock);
2042
2043 ath10k_tx_htt(ar, skb);
2044
2045 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
2046 3 * HZ);
2047 if (ret <= 0)
2048 ath10k_warn("timed out waiting for offchannel skb %p\n",
2049 skb);
2050
2051 if (!peer) {
2052 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
2053 if (ret)
2054 ath10k_warn("peer %pM on vdev %d not deleted (%d)\n",
2055 peer_addr, vdev_id, ret);
2056 }
2057
2058 mutex_unlock(&ar->conf_mutex);
2059 }
2060}
2061
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002062void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
2063{
2064 struct sk_buff *skb;
2065
2066 for (;;) {
2067 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2068 if (!skb)
2069 break;
2070
2071 ieee80211_free_txskb(ar->hw, skb);
2072 }
2073}
2074
2075void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
2076{
2077 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
2078 struct sk_buff *skb;
2079 int ret;
2080
2081 for (;;) {
2082 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2083 if (!skb)
2084 break;
2085
2086 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002087 if (ret) {
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002088 ath10k_warn("wmi mgmt_tx failed (%d)\n", ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002089 ieee80211_free_txskb(ar->hw, skb);
2090 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002091 }
2092}
2093
Kalle Valo5e3dd152013-06-12 20:52:10 +03002094/************/
2095/* Scanning */
2096/************/
2097
2098/*
2099 * This gets called if we dont get a heart-beat during scan.
2100 * This may indicate the FW has hung and we need to abort the
2101 * scan manually to prevent cancel_hw_scan() from deadlocking
2102 */
2103void ath10k_reset_scan(unsigned long ptr)
2104{
2105 struct ath10k *ar = (struct ath10k *)ptr;
2106
2107 spin_lock_bh(&ar->data_lock);
2108 if (!ar->scan.in_progress) {
2109 spin_unlock_bh(&ar->data_lock);
2110 return;
2111 }
2112
2113 ath10k_warn("scan timeout. resetting. fw issue?\n");
2114
2115 if (ar->scan.is_roc)
2116 ieee80211_remain_on_channel_expired(ar->hw);
2117 else
2118 ieee80211_scan_completed(ar->hw, 1 /* aborted */);
2119
2120 ar->scan.in_progress = false;
2121 complete_all(&ar->scan.completed);
2122 spin_unlock_bh(&ar->data_lock);
2123}
2124
2125static int ath10k_abort_scan(struct ath10k *ar)
2126{
2127 struct wmi_stop_scan_arg arg = {
2128 .req_id = 1, /* FIXME */
2129 .req_type = WMI_SCAN_STOP_ONE,
2130 .u.scan_id = ATH10K_SCAN_ID,
2131 };
2132 int ret;
2133
2134 lockdep_assert_held(&ar->conf_mutex);
2135
2136 del_timer_sync(&ar->scan.timeout);
2137
2138 spin_lock_bh(&ar->data_lock);
2139 if (!ar->scan.in_progress) {
2140 spin_unlock_bh(&ar->data_lock);
2141 return 0;
2142 }
2143
2144 ar->scan.aborting = true;
2145 spin_unlock_bh(&ar->data_lock);
2146
2147 ret = ath10k_wmi_stop_scan(ar, &arg);
2148 if (ret) {
2149 ath10k_warn("could not submit wmi stop scan (%d)\n", ret);
Michal Kazioradb8c9b2013-07-05 16:15:16 +03002150 spin_lock_bh(&ar->data_lock);
2151 ar->scan.in_progress = false;
2152 ath10k_offchan_tx_purge(ar);
2153 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002154 return -EIO;
2155 }
2156
Kalle Valo5e3dd152013-06-12 20:52:10 +03002157 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
2158 if (ret == 0)
2159 ath10k_warn("timed out while waiting for scan to stop\n");
2160
2161 /* scan completion may be done right after we timeout here, so let's
2162 * check the in_progress and tell mac80211 scan is completed. if we
2163 * don't do that and FW fails to send us scan completion indication
2164 * then userspace won't be able to scan anymore */
2165 ret = 0;
2166
2167 spin_lock_bh(&ar->data_lock);
2168 if (ar->scan.in_progress) {
2169 ath10k_warn("could not stop scan. its still in progress\n");
2170 ar->scan.in_progress = false;
2171 ath10k_offchan_tx_purge(ar);
2172 ret = -ETIMEDOUT;
2173 }
2174 spin_unlock_bh(&ar->data_lock);
2175
2176 return ret;
2177}
2178
2179static int ath10k_start_scan(struct ath10k *ar,
2180 const struct wmi_start_scan_arg *arg)
2181{
2182 int ret;
2183
2184 lockdep_assert_held(&ar->conf_mutex);
2185
2186 ret = ath10k_wmi_start_scan(ar, arg);
2187 if (ret)
2188 return ret;
2189
Kalle Valo5e3dd152013-06-12 20:52:10 +03002190 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2191 if (ret == 0) {
2192 ath10k_abort_scan(ar);
2193 return ret;
2194 }
2195
2196 /* the scan can complete earlier, before we even
2197 * start the timer. in that case the timer handler
2198 * checks ar->scan.in_progress and bails out if its
2199 * false. Add a 200ms margin to account event/command
2200 * processing. */
2201 mod_timer(&ar->scan.timeout, jiffies +
2202 msecs_to_jiffies(arg->max_scan_time+200));
2203 return 0;
2204}
2205
2206/**********************/
2207/* mac80211 callbacks */
2208/**********************/
2209
2210static void ath10k_tx(struct ieee80211_hw *hw,
2211 struct ieee80211_tx_control *control,
2212 struct sk_buff *skb)
2213{
2214 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2215 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2216 struct ath10k *ar = hw->priv;
Michal Kaziorddb6ad72013-10-02 11:03:39 +02002217 u8 tid, vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002218
2219 /* We should disable CCK RATE due to P2P */
2220 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2221 ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2222
2223 /* we must calculate tid before we apply qos workaround
2224 * as we'd lose the qos control field */
Michal Kazior42c3aa62013-10-02 11:03:38 +02002225 tid = ath10k_tx_h_get_tid(hdr);
Michal Kaziorddb6ad72013-10-02 11:03:39 +02002226 vdev_id = ath10k_tx_h_get_vdev_id(ar, info);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002227
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002228 /* it makes no sense to process injected frames like that */
2229 if (info->control.vif &&
2230 info->control.vif->type != NL80211_IFTYPE_MONITOR) {
2231 ath10k_tx_h_qos_workaround(hw, control, skb);
2232 ath10k_tx_h_update_wep_key(skb);
2233 ath10k_tx_h_add_p2p_noa_ie(ar, skb);
2234 ath10k_tx_h_seq_no(skb);
2235 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002236
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002237 ATH10K_SKB_CB(skb)->vdev_id = vdev_id;
Michal Kazior27bb1782013-09-18 14:43:19 +02002238 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002239 ATH10K_SKB_CB(skb)->htt.tid = tid;
2240
2241 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2242 spin_lock_bh(&ar->data_lock);
2243 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002244 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002245 spin_unlock_bh(&ar->data_lock);
2246
2247 ath10k_dbg(ATH10K_DBG_MAC, "queued offchannel skb %p\n", skb);
2248
2249 skb_queue_tail(&ar->offchan_tx_queue, skb);
2250 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2251 return;
2252 }
2253
2254 ath10k_tx_htt(ar, skb);
2255}
2256
2257/*
2258 * Initialize various parameters with default vaules.
2259 */
Michal Kazioraffd3212013-07-16 09:54:35 +02002260void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02002261{
2262 lockdep_assert_held(&ar->conf_mutex);
2263
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002264 ath10k_stop_cac(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02002265 del_timer_sync(&ar->scan.timeout);
2266 ath10k_offchan_tx_purge(ar);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002267 ath10k_mgmt_over_wmi_tx_purge(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02002268 ath10k_peer_cleanup_all(ar);
2269 ath10k_core_stop(ar);
2270 ath10k_hif_power_down(ar);
2271
2272 spin_lock_bh(&ar->data_lock);
2273 if (ar->scan.in_progress) {
2274 del_timer(&ar->scan.timeout);
2275 ar->scan.in_progress = false;
2276 ieee80211_scan_completed(ar->hw, true);
2277 }
2278 spin_unlock_bh(&ar->data_lock);
2279}
2280
Kalle Valo5e3dd152013-06-12 20:52:10 +03002281static int ath10k_start(struct ieee80211_hw *hw)
2282{
2283 struct ath10k *ar = hw->priv;
Michal Kazior818bdd12013-07-16 09:38:57 +02002284 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002285
Michal Kazior548db542013-07-05 16:15:15 +03002286 mutex_lock(&ar->conf_mutex);
2287
Michal Kazioraffd3212013-07-16 09:54:35 +02002288 if (ar->state != ATH10K_STATE_OFF &&
2289 ar->state != ATH10K_STATE_RESTARTING) {
Michal Kazior818bdd12013-07-16 09:38:57 +02002290 ret = -EINVAL;
2291 goto exit;
2292 }
2293
2294 ret = ath10k_hif_power_up(ar);
2295 if (ret) {
2296 ath10k_err("could not init hif (%d)\n", ret);
2297 ar->state = ATH10K_STATE_OFF;
2298 goto exit;
2299 }
2300
2301 ret = ath10k_core_start(ar);
2302 if (ret) {
2303 ath10k_err("could not init core (%d)\n", ret);
2304 ath10k_hif_power_down(ar);
2305 ar->state = ATH10K_STATE_OFF;
2306 goto exit;
2307 }
2308
Michal Kazioraffd3212013-07-16 09:54:35 +02002309 if (ar->state == ATH10K_STATE_OFF)
2310 ar->state = ATH10K_STATE_ON;
2311 else if (ar->state == ATH10K_STATE_RESTARTING)
2312 ar->state = ATH10K_STATE_RESTARTED;
2313
Bartosz Markowski226a3392013-09-26 17:47:16 +02002314 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002315 if (ret)
2316 ath10k_warn("could not enable WMI_PDEV_PARAM_PMF_QOS (%d)\n",
2317 ret);
2318
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01002319 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002320 if (ret)
2321 ath10k_warn("could not init WMI_PDEV_PARAM_DYNAMIC_BW (%d)\n",
2322 ret);
2323
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002324 /*
2325 * By default FW set ARP frames ac to voice (6). In that case ARP
2326 * exchange is not working properly for UAPSD enabled AP. ARP requests
2327 * which arrives with access category 0 are processed by network stack
2328 * and send back with access category 0, but FW changes access category
2329 * to 6. Set ARP frames access category to best effort (0) solves
2330 * this problem.
2331 */
2332
2333 ret = ath10k_wmi_pdev_set_param(ar,
2334 ar->wmi.pdev_param->arp_ac_override, 0);
2335 if (ret) {
2336 ath10k_warn("could not set arp ac override parameter: %d\n",
2337 ret);
2338 goto exit;
2339 }
2340
Michal Kaziorf7843d72013-07-16 09:38:52 +02002341 ath10k_regd_update(ar);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01002342 ret = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002343
Michal Kazior818bdd12013-07-16 09:38:57 +02002344exit:
Michal Kazior548db542013-07-05 16:15:15 +03002345 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01002346 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002347}
2348
2349static void ath10k_stop(struct ieee80211_hw *hw)
2350{
2351 struct ath10k *ar = hw->priv;
2352
Michal Kazior548db542013-07-05 16:15:15 +03002353 mutex_lock(&ar->conf_mutex);
Michal Kazioraffd3212013-07-16 09:54:35 +02002354 if (ar->state == ATH10K_STATE_ON ||
2355 ar->state == ATH10K_STATE_RESTARTED ||
2356 ar->state == ATH10K_STATE_WEDGED)
Michal Kazior818bdd12013-07-16 09:38:57 +02002357 ath10k_halt(ar);
Michal Kaziora96d7742013-07-16 09:38:56 +02002358
Michal Kaziorf7843d72013-07-16 09:38:52 +02002359 ar->state = ATH10K_STATE_OFF;
Michal Kazior548db542013-07-05 16:15:15 +03002360 mutex_unlock(&ar->conf_mutex);
2361
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002362 ath10k_mgmt_over_wmi_tx_purge(ar);
2363
Michal Kazior548db542013-07-05 16:15:15 +03002364 cancel_work_sync(&ar->offchan_tx_work);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002365 cancel_work_sync(&ar->wmi_mgmt_tx_work);
Michal Kazioraffd3212013-07-16 09:54:35 +02002366 cancel_work_sync(&ar->restart_work);
2367}
2368
Michal Kaziorad088bf2013-10-16 15:44:46 +03002369static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02002370{
Michal Kaziorad088bf2013-10-16 15:44:46 +03002371 struct ath10k_vif *arvif;
2372 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02002373
2374 lockdep_assert_held(&ar->conf_mutex);
2375
Michal Kaziorad088bf2013-10-16 15:44:46 +03002376 list_for_each_entry(arvif, &ar->arvifs, list) {
2377 ret = ath10k_mac_vif_setup_ps(arvif);
2378 if (ret) {
2379 ath10k_warn("could not setup powersave (%d)\n", ret);
2380 break;
2381 }
2382 }
Michal Kazioraffd3212013-07-16 09:54:35 +02002383
Michal Kaziorad088bf2013-10-16 15:44:46 +03002384 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002385}
2386
Michal Kaziorc930f742014-01-23 11:38:25 +01002387static const char *chandef_get_width(enum nl80211_chan_width width)
2388{
2389 switch (width) {
2390 case NL80211_CHAN_WIDTH_20_NOHT:
2391 return "20 (noht)";
2392 case NL80211_CHAN_WIDTH_20:
2393 return "20";
2394 case NL80211_CHAN_WIDTH_40:
2395 return "40";
2396 case NL80211_CHAN_WIDTH_80:
2397 return "80";
2398 case NL80211_CHAN_WIDTH_80P80:
2399 return "80+80";
2400 case NL80211_CHAN_WIDTH_160:
2401 return "160";
2402 case NL80211_CHAN_WIDTH_5:
2403 return "5";
2404 case NL80211_CHAN_WIDTH_10:
2405 return "10";
2406 }
2407 return "?";
2408}
2409
2410static void ath10k_config_chan(struct ath10k *ar)
2411{
2412 struct ath10k_vif *arvif;
2413 bool monitor_was_enabled;
2414 int ret;
2415
2416 lockdep_assert_held(&ar->conf_mutex);
2417
2418 ath10k_dbg(ATH10K_DBG_MAC,
2419 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2420 ar->chandef.chan->center_freq,
2421 ar->chandef.center_freq1,
2422 ar->chandef.center_freq2,
2423 chandef_get_width(ar->chandef.width));
2424
2425 /* First stop monitor interface. Some FW versions crash if there's a
2426 * lone monitor interface. */
2427 monitor_was_enabled = ar->monitor_enabled;
2428
2429 if (ar->monitor_enabled)
2430 ath10k_monitor_stop(ar);
2431
2432 list_for_each_entry(arvif, &ar->arvifs, list) {
2433 if (!arvif->is_started)
2434 continue;
2435
2436 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2437 continue;
2438
2439 ret = ath10k_vdev_stop(arvif);
2440 if (ret) {
2441 ath10k_warn("could not stop vdev %d (%d)\n",
2442 arvif->vdev_id, ret);
2443 continue;
2444 }
2445 }
2446
2447 /* all vdevs are now stopped - now attempt to restart them */
2448
2449 list_for_each_entry(arvif, &ar->arvifs, list) {
2450 if (!arvif->is_started)
2451 continue;
2452
2453 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2454 continue;
2455
2456 ret = ath10k_vdev_start(arvif);
2457 if (ret) {
2458 ath10k_warn("could not start vdev %d (%d)\n",
2459 arvif->vdev_id, ret);
2460 continue;
2461 }
2462
2463 if (!arvif->is_up)
2464 continue;
2465
2466 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
2467 arvif->bssid);
2468 if (ret) {
2469 ath10k_warn("could not bring vdev up %d (%d)\n",
2470 arvif->vdev_id, ret);
2471 continue;
2472 }
2473 }
2474
2475 if (monitor_was_enabled)
2476 ath10k_monitor_start(ar, ar->monitor_vdev_id);
2477}
2478
Kalle Valo5e3dd152013-06-12 20:52:10 +03002479static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2480{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002481 struct ath10k *ar = hw->priv;
2482 struct ieee80211_conf *conf = &hw->conf;
2483 int ret = 0;
Michal Kazior5474efe2013-10-23 04:02:15 -07002484 u32 param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002485
2486 mutex_lock(&ar->conf_mutex);
2487
2488 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002489 ath10k_dbg(ATH10K_DBG_MAC,
2490 "mac config channel %d mhz flags 0x%x\n",
2491 conf->chandef.chan->center_freq,
2492 conf->chandef.chan->flags);
2493
Kalle Valo5e3dd152013-06-12 20:52:10 +03002494 spin_lock_bh(&ar->data_lock);
2495 ar->rx_channel = conf->chandef.chan;
2496 spin_unlock_bh(&ar->data_lock);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002497
2498 ath10k_config_radar_detection(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002499
2500 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
2501 ar->chandef = conf->chandef;
2502 ath10k_config_chan(ar);
2503 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002504 }
2505
Michal Kazior5474efe2013-10-23 04:02:15 -07002506 if (changed & IEEE80211_CONF_CHANGE_POWER) {
2507 ath10k_dbg(ATH10K_DBG_MAC, "mac config power %d\n",
2508 hw->conf.power_level);
2509
2510 param = ar->wmi.pdev_param->txpower_limit2g;
2511 ret = ath10k_wmi_pdev_set_param(ar, param,
2512 hw->conf.power_level * 2);
2513 if (ret)
2514 ath10k_warn("mac failed to set 2g txpower %d (%d)\n",
2515 hw->conf.power_level, ret);
2516
2517 param = ar->wmi.pdev_param->txpower_limit5g;
2518 ret = ath10k_wmi_pdev_set_param(ar, param,
2519 hw->conf.power_level * 2);
2520 if (ret)
2521 ath10k_warn("mac failed to set 5g txpower %d (%d)\n",
2522 hw->conf.power_level, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002523 }
2524
Michal Kazioraffd3212013-07-16 09:54:35 +02002525 if (changed & IEEE80211_CONF_CHANGE_PS)
2526 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002527
2528 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
2529 if (conf->flags & IEEE80211_CONF_MONITOR)
2530 ret = ath10k_monitor_create(ar);
2531 else
2532 ret = ath10k_monitor_destroy(ar);
2533 }
2534
2535 mutex_unlock(&ar->conf_mutex);
2536 return ret;
2537}
2538
2539/*
2540 * TODO:
2541 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2542 * because we will send mgmt frames without CCK. This requirement
2543 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2544 * in the TX packet.
2545 */
2546static int ath10k_add_interface(struct ieee80211_hw *hw,
2547 struct ieee80211_vif *vif)
2548{
2549 struct ath10k *ar = hw->priv;
2550 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2551 enum wmi_sta_powersave_param param;
2552 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02002553 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002554 int bit;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002555 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002556
2557 mutex_lock(&ar->conf_mutex);
2558
Michal Kazior0dbd09e2013-07-31 10:55:14 +02002559 memset(arvif, 0, sizeof(*arvif));
2560
Kalle Valo5e3dd152013-06-12 20:52:10 +03002561 arvif->ar = ar;
2562 arvif->vif = vif;
2563
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002564 INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
Ben Greeare63b33f2013-10-22 14:54:14 -07002565 INIT_LIST_HEAD(&arvif->list);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002566
Kalle Valo5e3dd152013-06-12 20:52:10 +03002567 if ((vif->type == NL80211_IFTYPE_MONITOR) && ar->monitor_present) {
2568 ath10k_warn("Only one monitor interface allowed\n");
2569 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03002570 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002571 }
2572
2573 bit = ffs(ar->free_vdev_map);
2574 if (bit == 0) {
2575 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03002576 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002577 }
2578
2579 arvif->vdev_id = bit - 1;
2580 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002581
2582 if (ar->p2p)
2583 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2584
2585 switch (vif->type) {
2586 case NL80211_IFTYPE_UNSPECIFIED:
2587 case NL80211_IFTYPE_STATION:
2588 arvif->vdev_type = WMI_VDEV_TYPE_STA;
2589 if (vif->p2p)
2590 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2591 break;
2592 case NL80211_IFTYPE_ADHOC:
2593 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2594 break;
2595 case NL80211_IFTYPE_AP:
2596 arvif->vdev_type = WMI_VDEV_TYPE_AP;
2597
2598 if (vif->p2p)
2599 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2600 break;
2601 case NL80211_IFTYPE_MONITOR:
2602 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2603 break;
2604 default:
2605 WARN_ON(1);
2606 break;
2607 }
2608
Kalle Valo60c3daa2013-09-08 17:56:07 +03002609 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002610 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype);
2611
2612 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2613 arvif->vdev_subtype, vif->addr);
2614 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02002615 ath10k_warn("WMI vdev %i create failed: ret %d\n",
2616 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002617 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002618 }
2619
Michal Kazior9dad14a2013-10-16 15:44:45 +03002620 ar->free_vdev_map &= ~BIT(arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002621 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002622
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002623 vdev_param = ar->wmi.vdev_param->def_keyid;
2624 ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002625 arvif->def_wep_key_idx);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002626 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02002627 ath10k_warn("Failed to set vdev %i default keyid: %d\n",
2628 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002629 goto err_vdev_delete;
2630 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002631
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002632 vdev_param = ar->wmi.vdev_param->tx_encap_type;
2633 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002634 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02002635 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03002636 if (ret && ret != -EOPNOTSUPP) {
Ben Greear69244e52014-02-27 18:50:00 +02002637 ath10k_warn("Failed to set vdev %i TX encap: %d\n",
2638 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002639 goto err_vdev_delete;
2640 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002641
2642 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2643 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
2644 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02002645 ath10k_warn("Failed to create vdev %i peer for AP: %d\n",
2646 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002647 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002648 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01002649
Kalle Valo5a13e762014-01-20 11:01:46 +02002650 ret = ath10k_mac_set_kickout(arvif);
2651 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02002652 ath10k_warn("Failed to set vdev %i kickout parameters: %d\n",
2653 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02002654 goto err_peer_delete;
2655 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002656 }
2657
2658 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
2659 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
2660 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2661 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2662 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002663 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02002664 ath10k_warn("Failed to set vdev %i RX wake policy: %d\n",
2665 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002666 goto err_peer_delete;
2667 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002668
2669 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
2670 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
2671 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2672 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002673 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02002674 ath10k_warn("Failed to set vdev %i TX wake thresh: %d\n",
2675 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002676 goto err_peer_delete;
2677 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002678
2679 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
2680 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
2681 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2682 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002683 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02002684 ath10k_warn("Failed to set vdev %i PSPOLL count: %d\n",
2685 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002686 goto err_peer_delete;
2687 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002688 }
2689
Michal Kazior424121c2013-07-22 14:13:31 +02002690 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002691 if (ret) {
Michal Kazior679c54a2013-07-05 16:15:04 +03002692 ath10k_warn("failed to set rts threshold for vdev %d (%d)\n",
2693 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002694 goto err_peer_delete;
2695 }
Michal Kazior679c54a2013-07-05 16:15:04 +03002696
Michal Kazior424121c2013-07-22 14:13:31 +02002697 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002698 if (ret) {
Michal Kazior679c54a2013-07-05 16:15:04 +03002699 ath10k_warn("failed to set frag threshold for vdev %d (%d)\n",
2700 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002701 goto err_peer_delete;
2702 }
Michal Kazior679c54a2013-07-05 16:15:04 +03002703
Kalle Valo5e3dd152013-06-12 20:52:10 +03002704 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2705 ar->monitor_present = true;
2706
Kalle Valo5e3dd152013-06-12 20:52:10 +03002707 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002708 return 0;
2709
2710err_peer_delete:
2711 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
2712 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
2713
2714err_vdev_delete:
2715 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2716 ar->free_vdev_map &= ~BIT(arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002717 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002718
2719err:
2720 mutex_unlock(&ar->conf_mutex);
2721
Kalle Valo5e3dd152013-06-12 20:52:10 +03002722 return ret;
2723}
2724
2725static void ath10k_remove_interface(struct ieee80211_hw *hw,
2726 struct ieee80211_vif *vif)
2727{
2728 struct ath10k *ar = hw->priv;
2729 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2730 int ret;
2731
2732 mutex_lock(&ar->conf_mutex);
2733
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002734 cancel_work_sync(&arvif->wep_key_work);
2735
Michal Kaziored543882013-09-13 14:16:56 +02002736 spin_lock_bh(&ar->data_lock);
2737 if (arvif->beacon) {
2738 dev_kfree_skb_any(arvif->beacon);
2739 arvif->beacon = NULL;
2740 }
2741 spin_unlock_bh(&ar->data_lock);
2742
Kalle Valo5e3dd152013-06-12 20:52:10 +03002743 ar->free_vdev_map |= 1 << (arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002744 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002745
2746 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2747 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
2748 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02002749 ath10k_warn("Failed to remove peer for AP vdev %i: %d\n",
2750 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002751
2752 kfree(arvif->u.ap.noa_data);
2753 }
2754
Ben Greear69244e52014-02-27 18:50:00 +02002755 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002756 arvif->vdev_id);
2757
Kalle Valo5e3dd152013-06-12 20:52:10 +03002758 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2759 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02002760 ath10k_warn("WMI vdev %i delete failed: %d\n",
2761 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002762
2763 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2764 ar->monitor_present = false;
2765
2766 ath10k_peer_cleanup(ar, arvif->vdev_id);
2767
2768 mutex_unlock(&ar->conf_mutex);
2769}
2770
2771/*
2772 * FIXME: Has to be verified.
2773 */
2774#define SUPPORTED_FILTERS \
2775 (FIF_PROMISC_IN_BSS | \
2776 FIF_ALLMULTI | \
2777 FIF_CONTROL | \
2778 FIF_PSPOLL | \
2779 FIF_OTHER_BSS | \
2780 FIF_BCN_PRBRESP_PROMISC | \
2781 FIF_PROBE_REQ | \
2782 FIF_FCSFAIL)
2783
2784static void ath10k_configure_filter(struct ieee80211_hw *hw,
2785 unsigned int changed_flags,
2786 unsigned int *total_flags,
2787 u64 multicast)
2788{
2789 struct ath10k *ar = hw->priv;
2790 int ret;
2791
2792 mutex_lock(&ar->conf_mutex);
2793
2794 changed_flags &= SUPPORTED_FILTERS;
2795 *total_flags &= SUPPORTED_FILTERS;
2796 ar->filter_flags = *total_flags;
2797
Michal Kaziorafd09222013-10-16 16:45:41 +03002798 /* Monitor must not be started if it wasn't created first.
2799 * Promiscuous mode may be started on a non-monitor interface - in
2800 * such case the monitor vdev is not created so starting the
2801 * monitor makes no sense. Since ath10k uses no special RX filters
2802 * (only BSS filter in STA mode) there's no need for any special
2803 * action here. */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002804 if ((ar->filter_flags & FIF_PROMISC_IN_BSS) &&
Michal Kaziorafd09222013-10-16 16:45:41 +03002805 !ar->monitor_enabled && ar->monitor_present) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03002806 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor %d start\n",
2807 ar->monitor_vdev_id);
2808
Kalle Valo5e3dd152013-06-12 20:52:10 +03002809 ret = ath10k_monitor_start(ar, ar->monitor_vdev_id);
2810 if (ret)
2811 ath10k_warn("Unable to start monitor mode\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002812 } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) &&
Michal Kaziorafd09222013-10-16 16:45:41 +03002813 ar->monitor_enabled && ar->monitor_present) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03002814 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor %d stop\n",
2815 ar->monitor_vdev_id);
2816
Kalle Valo5e3dd152013-06-12 20:52:10 +03002817 ret = ath10k_monitor_stop(ar);
2818 if (ret)
2819 ath10k_warn("Unable to stop monitor mode\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002820 }
2821
2822 mutex_unlock(&ar->conf_mutex);
2823}
2824
2825static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
2826 struct ieee80211_vif *vif,
2827 struct ieee80211_bss_conf *info,
2828 u32 changed)
2829{
2830 struct ath10k *ar = hw->priv;
2831 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2832 int ret = 0;
Bartosz Markowski226a3392013-09-26 17:47:16 +02002833 u32 vdev_param, pdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002834
2835 mutex_lock(&ar->conf_mutex);
2836
2837 if (changed & BSS_CHANGED_IBSS)
2838 ath10k_control_ibss(arvif, info, vif->addr);
2839
2840 if (changed & BSS_CHANGED_BEACON_INT) {
2841 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002842 vdev_param = ar->wmi.vdev_param->beacon_interval;
2843 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002844 arvif->beacon_interval);
Kalle Valo60c3daa2013-09-08 17:56:07 +03002845 ath10k_dbg(ATH10K_DBG_MAC,
2846 "mac vdev %d beacon_interval %d\n",
2847 arvif->vdev_id, arvif->beacon_interval);
2848
Kalle Valo5e3dd152013-06-12 20:52:10 +03002849 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02002850 ath10k_warn("Failed to set beacon interval for vdev %d: %i\n",
2851 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002852 }
2853
2854 if (changed & BSS_CHANGED_BEACON) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03002855 ath10k_dbg(ATH10K_DBG_MAC,
2856 "vdev %d set beacon tx mode to staggered\n",
2857 arvif->vdev_id);
2858
Bartosz Markowski226a3392013-09-26 17:47:16 +02002859 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
2860 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002861 WMI_BEACON_STAGGERED_MODE);
2862 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02002863 ath10k_warn("Failed to set beacon mode for vdev %d: %i\n",
2864 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002865 }
2866
John W. Linvilleb70727e2013-06-13 13:34:29 -04002867 if (changed & BSS_CHANGED_BEACON_INFO) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002868 arvif->dtim_period = info->dtim_period;
2869
Kalle Valo60c3daa2013-09-08 17:56:07 +03002870 ath10k_dbg(ATH10K_DBG_MAC,
2871 "mac vdev %d dtim_period %d\n",
2872 arvif->vdev_id, arvif->dtim_period);
2873
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002874 vdev_param = ar->wmi.vdev_param->dtim_period;
2875 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002876 arvif->dtim_period);
2877 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02002878 ath10k_warn("Failed to set dtim period for vdev %d: %i\n",
2879 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002880 }
2881
2882 if (changed & BSS_CHANGED_SSID &&
2883 vif->type == NL80211_IFTYPE_AP) {
2884 arvif->u.ap.ssid_len = info->ssid_len;
2885 if (info->ssid_len)
2886 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
2887 arvif->u.ap.hidden_ssid = info->hidden_ssid;
2888 }
2889
2890 if (changed & BSS_CHANGED_BSSID) {
2891 if (!is_zero_ether_addr(info->bssid)) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03002892 ath10k_dbg(ATH10K_DBG_MAC,
2893 "mac vdev %d create peer %pM\n",
2894 arvif->vdev_id, info->bssid);
2895
Kalle Valo5e3dd152013-06-12 20:52:10 +03002896 ret = ath10k_peer_create(ar, arvif->vdev_id,
2897 info->bssid);
2898 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02002899 ath10k_warn("Failed to add peer %pM for vdev %d when changing bssid: %i\n",
Ben Greear479398b2013-11-04 09:19:34 -08002900 info->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002901
2902 if (vif->type == NL80211_IFTYPE_STATION) {
2903 /*
2904 * this is never erased as we it for crypto key
2905 * clearing; this is FW requirement
2906 */
Michal Kaziorc930f742014-01-23 11:38:25 +01002907 memcpy(arvif->bssid, info->bssid, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002908
Kalle Valo60c3daa2013-09-08 17:56:07 +03002909 ath10k_dbg(ATH10K_DBG_MAC,
2910 "mac vdev %d start %pM\n",
2911 arvif->vdev_id, info->bssid);
2912
Kalle Valo5e3dd152013-06-12 20:52:10 +03002913 ret = ath10k_vdev_start(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +01002914 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02002915 ath10k_warn("failed to start vdev %i: %d\n",
2916 arvif->vdev_id, ret);
Kalle Valo75459e32014-02-13 18:13:12 +02002917 goto exit;
Michal Kaziorc930f742014-01-23 11:38:25 +01002918 }
2919
2920 arvif->is_started = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002921 }
2922
2923 /*
2924 * Mac80211 does not keep IBSS bssid when leaving IBSS,
2925 * so driver need to store it. It is needed when leaving
2926 * IBSS in order to remove BSSID peer.
2927 */
2928 if (vif->type == NL80211_IFTYPE_ADHOC)
Michal Kaziorc930f742014-01-23 11:38:25 +01002929 memcpy(arvif->bssid, info->bssid,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002930 ETH_ALEN);
2931 }
2932 }
2933
2934 if (changed & BSS_CHANGED_BEACON_ENABLED)
2935 ath10k_control_beaconing(arvif, info);
2936
2937 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002938 arvif->use_cts_prot = info->use_cts_prot;
Kalle Valo60c3daa2013-09-08 17:56:07 +03002939 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002940 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03002941
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002942 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002943 if (ret)
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02002944 ath10k_warn("Failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002945 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002946 }
2947
2948 if (changed & BSS_CHANGED_ERP_SLOT) {
2949 u32 slottime;
2950 if (info->use_short_slot)
2951 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2952
2953 else
2954 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2955
Kalle Valo60c3daa2013-09-08 17:56:07 +03002956 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
2957 arvif->vdev_id, slottime);
2958
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002959 vdev_param = ar->wmi.vdev_param->slot_time;
2960 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002961 slottime);
2962 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02002963 ath10k_warn("Failed to set erp slot for vdev %d: %i\n",
2964 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002965 }
2966
2967 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2968 u32 preamble;
2969 if (info->use_short_preamble)
2970 preamble = WMI_VDEV_PREAMBLE_SHORT;
2971 else
2972 preamble = WMI_VDEV_PREAMBLE_LONG;
2973
Kalle Valo60c3daa2013-09-08 17:56:07 +03002974 ath10k_dbg(ATH10K_DBG_MAC,
2975 "mac vdev %d preamble %dn",
2976 arvif->vdev_id, preamble);
2977
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002978 vdev_param = ar->wmi.vdev_param->preamble;
2979 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002980 preamble);
2981 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02002982 ath10k_warn("Failed to set preamble for vdev %d: %i\n",
2983 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002984 }
2985
2986 if (changed & BSS_CHANGED_ASSOC) {
2987 if (info->assoc)
2988 ath10k_bss_assoc(hw, vif, info);
2989 }
2990
Kalle Valo75459e32014-02-13 18:13:12 +02002991exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03002992 mutex_unlock(&ar->conf_mutex);
2993}
2994
2995static int ath10k_hw_scan(struct ieee80211_hw *hw,
2996 struct ieee80211_vif *vif,
2997 struct cfg80211_scan_request *req)
2998{
2999 struct ath10k *ar = hw->priv;
3000 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3001 struct wmi_start_scan_arg arg;
3002 int ret = 0;
3003 int i;
3004
3005 mutex_lock(&ar->conf_mutex);
3006
3007 spin_lock_bh(&ar->data_lock);
3008 if (ar->scan.in_progress) {
3009 spin_unlock_bh(&ar->data_lock);
3010 ret = -EBUSY;
3011 goto exit;
3012 }
3013
Wolfram Sang16735d02013-11-14 14:32:02 -08003014 reinit_completion(&ar->scan.started);
3015 reinit_completion(&ar->scan.completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003016 ar->scan.in_progress = true;
3017 ar->scan.aborting = false;
3018 ar->scan.is_roc = false;
3019 ar->scan.vdev_id = arvif->vdev_id;
3020 spin_unlock_bh(&ar->data_lock);
3021
3022 memset(&arg, 0, sizeof(arg));
3023 ath10k_wmi_start_scan_init(ar, &arg);
3024 arg.vdev_id = arvif->vdev_id;
3025 arg.scan_id = ATH10K_SCAN_ID;
3026
3027 if (!req->no_cck)
3028 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
3029
3030 if (req->ie_len) {
3031 arg.ie_len = req->ie_len;
3032 memcpy(arg.ie, req->ie, arg.ie_len);
3033 }
3034
3035 if (req->n_ssids) {
3036 arg.n_ssids = req->n_ssids;
3037 for (i = 0; i < arg.n_ssids; i++) {
3038 arg.ssids[i].len = req->ssids[i].ssid_len;
3039 arg.ssids[i].ssid = req->ssids[i].ssid;
3040 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02003041 } else {
3042 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003043 }
3044
3045 if (req->n_channels) {
3046 arg.n_channels = req->n_channels;
3047 for (i = 0; i < arg.n_channels; i++)
3048 arg.channels[i] = req->channels[i]->center_freq;
3049 }
3050
3051 ret = ath10k_start_scan(ar, &arg);
3052 if (ret) {
3053 ath10k_warn("could not start hw scan (%d)\n", ret);
3054 spin_lock_bh(&ar->data_lock);
3055 ar->scan.in_progress = false;
3056 spin_unlock_bh(&ar->data_lock);
3057 }
3058
3059exit:
3060 mutex_unlock(&ar->conf_mutex);
3061 return ret;
3062}
3063
3064static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
3065 struct ieee80211_vif *vif)
3066{
3067 struct ath10k *ar = hw->priv;
3068 int ret;
3069
3070 mutex_lock(&ar->conf_mutex);
3071 ret = ath10k_abort_scan(ar);
3072 if (ret) {
3073 ath10k_warn("couldn't abort scan (%d). forcefully sending scan completion to mac80211\n",
3074 ret);
3075 ieee80211_scan_completed(hw, 1 /* aborted */);
3076 }
3077 mutex_unlock(&ar->conf_mutex);
3078}
3079
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003080static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
3081 struct ath10k_vif *arvif,
3082 enum set_key_cmd cmd,
3083 struct ieee80211_key_conf *key)
3084{
3085 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
3086 int ret;
3087
3088 /* 10.1 firmware branch requires default key index to be set to group
3089 * key index after installing it. Otherwise FW/HW Txes corrupted
3090 * frames with multi-vif APs. This is not required for main firmware
3091 * branch (e.g. 636).
3092 *
3093 * FIXME: This has been tested only in AP. It remains unknown if this
3094 * is required for multi-vif STA interfaces on 10.1 */
3095
3096 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
3097 return;
3098
3099 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
3100 return;
3101
3102 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
3103 return;
3104
3105 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3106 return;
3107
3108 if (cmd != SET_KEY)
3109 return;
3110
3111 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3112 key->keyidx);
3113 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02003114 ath10k_warn("failed to set vdev %i group key as default key: %d\n",
3115 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003116}
3117
Kalle Valo5e3dd152013-06-12 20:52:10 +03003118static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3119 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3120 struct ieee80211_key_conf *key)
3121{
3122 struct ath10k *ar = hw->priv;
3123 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3124 struct ath10k_peer *peer;
3125 const u8 *peer_addr;
3126 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
3127 key->cipher == WLAN_CIPHER_SUITE_WEP104;
3128 int ret = 0;
3129
3130 if (key->keyidx > WMI_MAX_KEY_INDEX)
3131 return -ENOSPC;
3132
3133 mutex_lock(&ar->conf_mutex);
3134
3135 if (sta)
3136 peer_addr = sta->addr;
3137 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3138 peer_addr = vif->bss_conf.bssid;
3139 else
3140 peer_addr = vif->addr;
3141
3142 key->hw_key_idx = key->keyidx;
3143
3144 /* the peer should not disappear in mid-way (unless FW goes awry) since
3145 * we already hold conf_mutex. we just make sure its there now. */
3146 spin_lock_bh(&ar->data_lock);
3147 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3148 spin_unlock_bh(&ar->data_lock);
3149
3150 if (!peer) {
3151 if (cmd == SET_KEY) {
3152 ath10k_warn("cannot install key for non-existent peer %pM\n",
3153 peer_addr);
3154 ret = -EOPNOTSUPP;
3155 goto exit;
3156 } else {
3157 /* if the peer doesn't exist there is no key to disable
3158 * anymore */
3159 goto exit;
3160 }
3161 }
3162
3163 if (is_wep) {
3164 if (cmd == SET_KEY)
3165 arvif->wep_keys[key->keyidx] = key;
3166 else
3167 arvif->wep_keys[key->keyidx] = NULL;
3168
3169 if (cmd == DISABLE_KEY)
3170 ath10k_clear_vdev_key(arvif, key);
3171 }
3172
3173 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
3174 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02003175 ath10k_warn("key installation failed for vdev %i peer %pM: %d\n",
3176 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003177 goto exit;
3178 }
3179
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003180 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
3181
Kalle Valo5e3dd152013-06-12 20:52:10 +03003182 spin_lock_bh(&ar->data_lock);
3183 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3184 if (peer && cmd == SET_KEY)
3185 peer->keys[key->keyidx] = key;
3186 else if (peer && cmd == DISABLE_KEY)
3187 peer->keys[key->keyidx] = NULL;
3188 else if (peer == NULL)
3189 /* impossible unless FW goes crazy */
3190 ath10k_warn("peer %pM disappeared!\n", peer_addr);
3191 spin_unlock_bh(&ar->data_lock);
3192
3193exit:
3194 mutex_unlock(&ar->conf_mutex);
3195 return ret;
3196}
3197
Michal Kazior9797feb2014-02-14 14:49:48 +01003198static void ath10k_sta_rc_update_wk(struct work_struct *wk)
3199{
3200 struct ath10k *ar;
3201 struct ath10k_vif *arvif;
3202 struct ath10k_sta *arsta;
3203 struct ieee80211_sta *sta;
3204 u32 changed, bw, nss, smps;
3205 int err;
3206
3207 arsta = container_of(wk, struct ath10k_sta, update_wk);
3208 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3209 arvif = arsta->arvif;
3210 ar = arvif->ar;
3211
3212 spin_lock_bh(&ar->data_lock);
3213
3214 changed = arsta->changed;
3215 arsta->changed = 0;
3216
3217 bw = arsta->bw;
3218 nss = arsta->nss;
3219 smps = arsta->smps;
3220
3221 spin_unlock_bh(&ar->data_lock);
3222
3223 mutex_lock(&ar->conf_mutex);
3224
3225 if (changed & IEEE80211_RC_BW_CHANGED) {
3226 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
3227 sta->addr, bw);
3228
3229 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3230 WMI_PEER_CHAN_WIDTH, bw);
3231 if (err)
3232 ath10k_warn("failed to update STA %pM peer bw %d: %d\n",
3233 sta->addr, bw, err);
3234 }
3235
3236 if (changed & IEEE80211_RC_NSS_CHANGED) {
3237 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
3238 sta->addr, nss);
3239
3240 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3241 WMI_PEER_NSS, nss);
3242 if (err)
3243 ath10k_warn("failed to update STA %pM nss %d: %d\n",
3244 sta->addr, nss, err);
3245 }
3246
3247 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3248 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
3249 sta->addr, smps);
3250
3251 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3252 WMI_PEER_SMPS_STATE, smps);
3253 if (err)
3254 ath10k_warn("failed to update STA %pM smps %d: %d\n",
3255 sta->addr, smps, err);
3256 }
3257
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003258 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3259 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM supp rates\n",
3260 sta->addr);
3261
3262 err = ath10k_station_assoc(ar, arvif, sta, true);
3263 if (err)
3264 ath10k_warn("Failed to reassociate station: %pM\n",
3265 sta->addr);
3266 }
3267
Michal Kazior9797feb2014-02-14 14:49:48 +01003268 mutex_unlock(&ar->conf_mutex);
3269}
3270
Kalle Valo5e3dd152013-06-12 20:52:10 +03003271static int ath10k_sta_state(struct ieee80211_hw *hw,
3272 struct ieee80211_vif *vif,
3273 struct ieee80211_sta *sta,
3274 enum ieee80211_sta_state old_state,
3275 enum ieee80211_sta_state new_state)
3276{
3277 struct ath10k *ar = hw->priv;
3278 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01003279 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003280 int max_num_peers;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003281 int ret = 0;
3282
Michal Kazior76f90022014-02-25 09:29:57 +02003283 if (old_state == IEEE80211_STA_NOTEXIST &&
3284 new_state == IEEE80211_STA_NONE) {
3285 memset(arsta, 0, sizeof(*arsta));
3286 arsta->arvif = arvif;
3287 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
3288 }
3289
Michal Kazior9797feb2014-02-14 14:49:48 +01003290 /* cancel must be done outside the mutex to avoid deadlock */
3291 if ((old_state == IEEE80211_STA_NONE &&
3292 new_state == IEEE80211_STA_NOTEXIST))
3293 cancel_work_sync(&arsta->update_wk);
3294
Kalle Valo5e3dd152013-06-12 20:52:10 +03003295 mutex_lock(&ar->conf_mutex);
3296
3297 if (old_state == IEEE80211_STA_NOTEXIST &&
3298 new_state == IEEE80211_STA_NONE &&
3299 vif->type != NL80211_IFTYPE_STATION) {
3300 /*
3301 * New station addition.
3302 */
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003303 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
3304 max_num_peers = TARGET_10X_NUM_PEERS_MAX - 1;
3305 else
3306 max_num_peers = TARGET_NUM_PEERS;
3307
3308 if (ar->num_peers >= max_num_peers) {
3309 ath10k_warn("Number of peers exceeded: peers number %d (max peers %d)\n",
3310 ar->num_peers, max_num_peers);
3311 ret = -ENOBUFS;
3312 goto exit;
3313 }
3314
Kalle Valo60c3daa2013-09-08 17:56:07 +03003315 ath10k_dbg(ATH10K_DBG_MAC,
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003316 "mac vdev %d peer create %pM (new sta) num_peers %d\n",
3317 arvif->vdev_id, sta->addr, ar->num_peers);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003318
Kalle Valo5e3dd152013-06-12 20:52:10 +03003319 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
3320 if (ret)
Ben Greear479398b2013-11-04 09:19:34 -08003321 ath10k_warn("Failed to add peer %pM for vdev %d when adding a new sta: %i\n",
3322 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003323 } else if ((old_state == IEEE80211_STA_NONE &&
3324 new_state == IEEE80211_STA_NOTEXIST)) {
3325 /*
3326 * Existing station deletion.
3327 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003328 ath10k_dbg(ATH10K_DBG_MAC,
3329 "mac vdev %d peer delete %pM (sta gone)\n",
3330 arvif->vdev_id, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003331 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
3332 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02003333 ath10k_warn("Failed to delete peer %pM for vdev %d: %i\n",
3334 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003335
3336 if (vif->type == NL80211_IFTYPE_STATION)
3337 ath10k_bss_disassoc(hw, vif);
3338 } else if (old_state == IEEE80211_STA_AUTH &&
3339 new_state == IEEE80211_STA_ASSOC &&
3340 (vif->type == NL80211_IFTYPE_AP ||
3341 vif->type == NL80211_IFTYPE_ADHOC)) {
3342 /*
3343 * New association.
3344 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003345 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM associated\n",
3346 sta->addr);
3347
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003348 ret = ath10k_station_assoc(ar, arvif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003349 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02003350 ath10k_warn("Failed to associate station %pM for vdev %i: %i\n",
3351 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003352 } else if (old_state == IEEE80211_STA_ASSOC &&
3353 new_state == IEEE80211_STA_AUTH &&
3354 (vif->type == NL80211_IFTYPE_AP ||
3355 vif->type == NL80211_IFTYPE_ADHOC)) {
3356 /*
3357 * Disassociation.
3358 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003359 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
3360 sta->addr);
3361
Kalle Valo5e3dd152013-06-12 20:52:10 +03003362 ret = ath10k_station_disassoc(ar, arvif, sta);
3363 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02003364 ath10k_warn("Failed to disassociate station: %pM vdev %i ret %i\n",
3365 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003366 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003367exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003368 mutex_unlock(&ar->conf_mutex);
3369 return ret;
3370}
3371
3372static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
3373 u16 ac, bool enable)
3374{
3375 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3376 u32 value = 0;
3377 int ret = 0;
3378
Michal Kazior548db542013-07-05 16:15:15 +03003379 lockdep_assert_held(&ar->conf_mutex);
3380
Kalle Valo5e3dd152013-06-12 20:52:10 +03003381 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3382 return 0;
3383
3384 switch (ac) {
3385 case IEEE80211_AC_VO:
3386 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3387 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3388 break;
3389 case IEEE80211_AC_VI:
3390 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3391 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3392 break;
3393 case IEEE80211_AC_BE:
3394 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3395 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3396 break;
3397 case IEEE80211_AC_BK:
3398 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3399 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3400 break;
3401 }
3402
3403 if (enable)
3404 arvif->u.sta.uapsd |= value;
3405 else
3406 arvif->u.sta.uapsd &= ~value;
3407
3408 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3409 WMI_STA_PS_PARAM_UAPSD,
3410 arvif->u.sta.uapsd);
3411 if (ret) {
3412 ath10k_warn("could not set uapsd params %d\n", ret);
3413 goto exit;
3414 }
3415
3416 if (arvif->u.sta.uapsd)
3417 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
3418 else
3419 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3420
3421 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3422 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
3423 value);
3424 if (ret)
3425 ath10k_warn("could not set rx wake param %d\n", ret);
3426
3427exit:
3428 return ret;
3429}
3430
3431static int ath10k_conf_tx(struct ieee80211_hw *hw,
3432 struct ieee80211_vif *vif, u16 ac,
3433 const struct ieee80211_tx_queue_params *params)
3434{
3435 struct ath10k *ar = hw->priv;
3436 struct wmi_wmm_params_arg *p = NULL;
3437 int ret;
3438
3439 mutex_lock(&ar->conf_mutex);
3440
3441 switch (ac) {
3442 case IEEE80211_AC_VO:
3443 p = &ar->wmm_params.ac_vo;
3444 break;
3445 case IEEE80211_AC_VI:
3446 p = &ar->wmm_params.ac_vi;
3447 break;
3448 case IEEE80211_AC_BE:
3449 p = &ar->wmm_params.ac_be;
3450 break;
3451 case IEEE80211_AC_BK:
3452 p = &ar->wmm_params.ac_bk;
3453 break;
3454 }
3455
3456 if (WARN_ON(!p)) {
3457 ret = -EINVAL;
3458 goto exit;
3459 }
3460
3461 p->cwmin = params->cw_min;
3462 p->cwmax = params->cw_max;
3463 p->aifs = params->aifs;
3464
3465 /*
3466 * The channel time duration programmed in the HW is in absolute
3467 * microseconds, while mac80211 gives the txop in units of
3468 * 32 microseconds.
3469 */
3470 p->txop = params->txop * 32;
3471
3472 /* FIXME: FW accepts wmm params per hw, not per vif */
3473 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
3474 if (ret) {
3475 ath10k_warn("could not set wmm params %d\n", ret);
3476 goto exit;
3477 }
3478
3479 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3480 if (ret)
3481 ath10k_warn("could not set sta uapsd %d\n", ret);
3482
3483exit:
3484 mutex_unlock(&ar->conf_mutex);
3485 return ret;
3486}
3487
3488#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3489
3490static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
3491 struct ieee80211_vif *vif,
3492 struct ieee80211_channel *chan,
3493 int duration,
3494 enum ieee80211_roc_type type)
3495{
3496 struct ath10k *ar = hw->priv;
3497 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3498 struct wmi_start_scan_arg arg;
3499 int ret;
3500
3501 mutex_lock(&ar->conf_mutex);
3502
3503 spin_lock_bh(&ar->data_lock);
3504 if (ar->scan.in_progress) {
3505 spin_unlock_bh(&ar->data_lock);
3506 ret = -EBUSY;
3507 goto exit;
3508 }
3509
Wolfram Sang16735d02013-11-14 14:32:02 -08003510 reinit_completion(&ar->scan.started);
3511 reinit_completion(&ar->scan.completed);
3512 reinit_completion(&ar->scan.on_channel);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003513 ar->scan.in_progress = true;
3514 ar->scan.aborting = false;
3515 ar->scan.is_roc = true;
3516 ar->scan.vdev_id = arvif->vdev_id;
3517 ar->scan.roc_freq = chan->center_freq;
3518 spin_unlock_bh(&ar->data_lock);
3519
3520 memset(&arg, 0, sizeof(arg));
3521 ath10k_wmi_start_scan_init(ar, &arg);
3522 arg.vdev_id = arvif->vdev_id;
3523 arg.scan_id = ATH10K_SCAN_ID;
3524 arg.n_channels = 1;
3525 arg.channels[0] = chan->center_freq;
3526 arg.dwell_time_active = duration;
3527 arg.dwell_time_passive = duration;
3528 arg.max_scan_time = 2 * duration;
3529 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3530 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
3531
3532 ret = ath10k_start_scan(ar, &arg);
3533 if (ret) {
3534 ath10k_warn("could not start roc scan (%d)\n", ret);
3535 spin_lock_bh(&ar->data_lock);
3536 ar->scan.in_progress = false;
3537 spin_unlock_bh(&ar->data_lock);
3538 goto exit;
3539 }
3540
3541 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
3542 if (ret == 0) {
3543 ath10k_warn("could not switch to channel for roc scan\n");
3544 ath10k_abort_scan(ar);
3545 ret = -ETIMEDOUT;
3546 goto exit;
3547 }
3548
3549 ret = 0;
3550exit:
3551 mutex_unlock(&ar->conf_mutex);
3552 return ret;
3553}
3554
3555static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
3556{
3557 struct ath10k *ar = hw->priv;
3558
3559 mutex_lock(&ar->conf_mutex);
3560 ath10k_abort_scan(ar);
3561 mutex_unlock(&ar->conf_mutex);
3562
3563 return 0;
3564}
3565
3566/*
3567 * Both RTS and Fragmentation threshold are interface-specific
3568 * in ath10k, but device-specific in mac80211.
3569 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03003570
3571static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3572{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003573 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003574 struct ath10k_vif *arvif;
3575 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03003576
Michal Kaziorad088bf2013-10-16 15:44:46 +03003577 mutex_lock(&ar->conf_mutex);
3578 list_for_each_entry(arvif, &ar->arvifs, list) {
3579 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
3580 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003581
Michal Kaziorad088bf2013-10-16 15:44:46 +03003582 ret = ath10k_mac_set_rts(arvif, value);
3583 if (ret) {
3584 ath10k_warn("could not set rts threshold for vdev %d (%d)\n",
3585 arvif->vdev_id, ret);
3586 break;
3587 }
3588 }
3589 mutex_unlock(&ar->conf_mutex);
3590
3591 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003592}
3593
3594static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3595{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003596 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003597 struct ath10k_vif *arvif;
3598 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003599
Kalle Valo5e3dd152013-06-12 20:52:10 +03003600 mutex_lock(&ar->conf_mutex);
Michal Kaziorad088bf2013-10-16 15:44:46 +03003601 list_for_each_entry(arvif, &ar->arvifs, list) {
3602 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
3603 arvif->vdev_id, value);
3604
3605 ret = ath10k_mac_set_rts(arvif, value);
3606 if (ret) {
3607 ath10k_warn("could not set fragmentation threshold for vdev %d (%d)\n",
3608 arvif->vdev_id, ret);
3609 break;
3610 }
3611 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003612 mutex_unlock(&ar->conf_mutex);
3613
Michal Kaziorad088bf2013-10-16 15:44:46 +03003614 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003615}
3616
3617static void ath10k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
3618{
3619 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02003620 bool skip;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003621 int ret;
3622
3623 /* mac80211 doesn't care if we really xmit queued frames or not
3624 * we'll collect those frames either way if we stop/delete vdevs */
3625 if (drop)
3626 return;
3627
Michal Kazior548db542013-07-05 16:15:15 +03003628 mutex_lock(&ar->conf_mutex);
3629
Michal Kazioraffd3212013-07-16 09:54:35 +02003630 if (ar->state == ATH10K_STATE_WEDGED)
3631 goto skip;
3632
Michal Kazioredb82362013-07-05 16:15:14 +03003633 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03003634 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02003635
Michal Kazioredb82362013-07-05 16:15:14 +03003636 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02003637 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03003638 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02003639
3640 skip = (ar->state == ATH10K_STATE_WEDGED);
3641
3642 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003643 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02003644
3645 if (ret <= 0 || skip)
Ben Greear9ba4c782014-02-25 09:29:57 +02003646 ath10k_warn("tx not flushed (skip %i ar-state %i): %i\n",
3647 skip, ar->state, ret);
Michal Kazior548db542013-07-05 16:15:15 +03003648
Michal Kazioraffd3212013-07-16 09:54:35 +02003649skip:
Michal Kazior548db542013-07-05 16:15:15 +03003650 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003651}
3652
3653/* TODO: Implement this function properly
3654 * For now it is needed to reply to Probe Requests in IBSS mode.
3655 * Propably we need this information from FW.
3656 */
3657static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
3658{
3659 return 1;
3660}
3661
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003662#ifdef CONFIG_PM
3663static int ath10k_suspend(struct ieee80211_hw *hw,
3664 struct cfg80211_wowlan *wowlan)
3665{
3666 struct ath10k *ar = hw->priv;
3667 int ret;
3668
Marek Puzyniak9042e172014-02-10 17:14:23 +01003669 mutex_lock(&ar->conf_mutex);
3670
Marek Puzyniak00f54822014-02-10 17:14:24 +01003671 ret = ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND);
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003672 if (ret) {
Marek Puzyniak00f54822014-02-10 17:14:24 +01003673 if (ret == -ETIMEDOUT)
3674 goto resume;
Marek Puzyniak9042e172014-02-10 17:14:23 +01003675 ret = 1;
3676 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003677 }
3678
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003679 ret = ath10k_hif_suspend(ar);
3680 if (ret) {
3681 ath10k_warn("could not suspend hif (%d)\n", ret);
3682 goto resume;
3683 }
3684
Marek Puzyniak9042e172014-02-10 17:14:23 +01003685 ret = 0;
3686 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003687resume:
3688 ret = ath10k_wmi_pdev_resume_target(ar);
3689 if (ret)
3690 ath10k_warn("could not resume target (%d)\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003691
3692 ret = 1;
3693exit:
3694 mutex_unlock(&ar->conf_mutex);
3695 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003696}
3697
3698static int ath10k_resume(struct ieee80211_hw *hw)
3699{
3700 struct ath10k *ar = hw->priv;
3701 int ret;
3702
Marek Puzyniak9042e172014-02-10 17:14:23 +01003703 mutex_lock(&ar->conf_mutex);
3704
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003705 ret = ath10k_hif_resume(ar);
3706 if (ret) {
3707 ath10k_warn("could not resume hif (%d)\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003708 ret = 1;
3709 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003710 }
3711
3712 ret = ath10k_wmi_pdev_resume_target(ar);
3713 if (ret) {
3714 ath10k_warn("could not resume target (%d)\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003715 ret = 1;
3716 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003717 }
3718
Marek Puzyniak9042e172014-02-10 17:14:23 +01003719 ret = 0;
3720exit:
3721 mutex_unlock(&ar->conf_mutex);
3722 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003723}
3724#endif
3725
Michal Kazioraffd3212013-07-16 09:54:35 +02003726static void ath10k_restart_complete(struct ieee80211_hw *hw)
3727{
3728 struct ath10k *ar = hw->priv;
3729
3730 mutex_lock(&ar->conf_mutex);
3731
3732 /* If device failed to restart it will be in a different state, e.g.
3733 * ATH10K_STATE_WEDGED */
3734 if (ar->state == ATH10K_STATE_RESTARTED) {
3735 ath10k_info("device successfully recovered\n");
3736 ar->state = ATH10K_STATE_ON;
3737 }
3738
3739 mutex_unlock(&ar->conf_mutex);
3740}
3741
Michal Kazior2e1dea42013-07-31 10:32:40 +02003742static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
3743 struct survey_info *survey)
3744{
3745 struct ath10k *ar = hw->priv;
3746 struct ieee80211_supported_band *sband;
3747 struct survey_info *ar_survey = &ar->survey[idx];
3748 int ret = 0;
3749
3750 mutex_lock(&ar->conf_mutex);
3751
3752 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
3753 if (sband && idx >= sband->n_channels) {
3754 idx -= sband->n_channels;
3755 sband = NULL;
3756 }
3757
3758 if (!sband)
3759 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
3760
3761 if (!sband || idx >= sband->n_channels) {
3762 ret = -ENOENT;
3763 goto exit;
3764 }
3765
3766 spin_lock_bh(&ar->data_lock);
3767 memcpy(survey, ar_survey, sizeof(*survey));
3768 spin_unlock_bh(&ar->data_lock);
3769
3770 survey->channel = &sband->channels[idx];
3771
3772exit:
3773 mutex_unlock(&ar->conf_mutex);
3774 return ret;
3775}
3776
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01003777/* Helper table for legacy fixed_rate/bitrate_mask */
3778static const u8 cck_ofdm_rate[] = {
3779 /* CCK */
3780 3, /* 1Mbps */
3781 2, /* 2Mbps */
3782 1, /* 5.5Mbps */
3783 0, /* 11Mbps */
3784 /* OFDM */
3785 3, /* 6Mbps */
3786 7, /* 9Mbps */
3787 2, /* 12Mbps */
3788 6, /* 18Mbps */
3789 1, /* 24Mbps */
3790 5, /* 36Mbps */
3791 0, /* 48Mbps */
3792 4, /* 54Mbps */
3793};
3794
3795/* Check if only one bit set */
3796static int ath10k_check_single_mask(u32 mask)
3797{
3798 int bit;
3799
3800 bit = ffs(mask);
3801 if (!bit)
3802 return 0;
3803
3804 mask &= ~BIT(bit - 1);
3805 if (mask)
3806 return 2;
3807
3808 return 1;
3809}
3810
3811static bool
3812ath10k_default_bitrate_mask(struct ath10k *ar,
3813 enum ieee80211_band band,
3814 const struct cfg80211_bitrate_mask *mask)
3815{
3816 u32 legacy = 0x00ff;
3817 u8 ht = 0xff, i;
3818 u16 vht = 0x3ff;
3819
3820 switch (band) {
3821 case IEEE80211_BAND_2GHZ:
3822 legacy = 0x00fff;
3823 vht = 0;
3824 break;
3825 case IEEE80211_BAND_5GHZ:
3826 break;
3827 default:
3828 return false;
3829 }
3830
3831 if (mask->control[band].legacy != legacy)
3832 return false;
3833
3834 for (i = 0; i < ar->num_rf_chains; i++)
3835 if (mask->control[band].ht_mcs[i] != ht)
3836 return false;
3837
3838 for (i = 0; i < ar->num_rf_chains; i++)
3839 if (mask->control[band].vht_mcs[i] != vht)
3840 return false;
3841
3842 return true;
3843}
3844
3845static bool
3846ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
3847 enum ieee80211_band band,
3848 u8 *fixed_nss)
3849{
3850 int ht_nss = 0, vht_nss = 0, i;
3851
3852 /* check legacy */
3853 if (ath10k_check_single_mask(mask->control[band].legacy))
3854 return false;
3855
3856 /* check HT */
3857 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3858 if (mask->control[band].ht_mcs[i] == 0xff)
3859 continue;
3860 else if (mask->control[band].ht_mcs[i] == 0x00)
3861 break;
3862 else
3863 return false;
3864 }
3865
3866 ht_nss = i;
3867
3868 /* check VHT */
3869 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
3870 if (mask->control[band].vht_mcs[i] == 0x03ff)
3871 continue;
3872 else if (mask->control[band].vht_mcs[i] == 0x0000)
3873 break;
3874 else
3875 return false;
3876 }
3877
3878 vht_nss = i;
3879
3880 if (ht_nss > 0 && vht_nss > 0)
3881 return false;
3882
3883 if (ht_nss)
3884 *fixed_nss = ht_nss;
3885 else if (vht_nss)
3886 *fixed_nss = vht_nss;
3887 else
3888 return false;
3889
3890 return true;
3891}
3892
3893static bool
3894ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
3895 enum ieee80211_band band,
3896 enum wmi_rate_preamble *preamble)
3897{
3898 int legacy = 0, ht = 0, vht = 0, i;
3899
3900 *preamble = WMI_RATE_PREAMBLE_OFDM;
3901
3902 /* check legacy */
3903 legacy = ath10k_check_single_mask(mask->control[band].legacy);
3904 if (legacy > 1)
3905 return false;
3906
3907 /* check HT */
3908 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3909 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
3910 if (ht > 1)
3911 return false;
3912
3913 /* check VHT */
3914 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3915 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
3916 if (vht > 1)
3917 return false;
3918
3919 /* Currently we support only one fixed_rate */
3920 if ((legacy + ht + vht) != 1)
3921 return false;
3922
3923 if (ht)
3924 *preamble = WMI_RATE_PREAMBLE_HT;
3925 else if (vht)
3926 *preamble = WMI_RATE_PREAMBLE_VHT;
3927
3928 return true;
3929}
3930
3931static bool
3932ath10k_bitrate_mask_rate(const struct cfg80211_bitrate_mask *mask,
3933 enum ieee80211_band band,
3934 u8 *fixed_rate,
3935 u8 *fixed_nss)
3936{
3937 u8 rate = 0, pream = 0, nss = 0, i;
3938 enum wmi_rate_preamble preamble;
3939
3940 /* Check if single rate correct */
3941 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
3942 return false;
3943
3944 pream = preamble;
3945
3946 switch (preamble) {
3947 case WMI_RATE_PREAMBLE_CCK:
3948 case WMI_RATE_PREAMBLE_OFDM:
3949 i = ffs(mask->control[band].legacy) - 1;
3950
3951 if (band == IEEE80211_BAND_2GHZ && i < 4)
3952 pream = WMI_RATE_PREAMBLE_CCK;
3953
3954 if (band == IEEE80211_BAND_5GHZ)
3955 i += 4;
3956
3957 if (i >= ARRAY_SIZE(cck_ofdm_rate))
3958 return false;
3959
3960 rate = cck_ofdm_rate[i];
3961 break;
3962 case WMI_RATE_PREAMBLE_HT:
3963 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3964 if (mask->control[band].ht_mcs[i])
3965 break;
3966
3967 if (i == IEEE80211_HT_MCS_MASK_LEN)
3968 return false;
3969
3970 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
3971 nss = i;
3972 break;
3973 case WMI_RATE_PREAMBLE_VHT:
3974 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3975 if (mask->control[band].vht_mcs[i])
3976 break;
3977
3978 if (i == NL80211_VHT_NSS_MAX)
3979 return false;
3980
3981 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3982 nss = i;
3983 break;
3984 }
3985
3986 *fixed_nss = nss + 1;
3987 nss <<= 4;
3988 pream <<= 6;
3989
3990 ath10k_dbg(ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
3991 pream, nss, rate);
3992
3993 *fixed_rate = pream | nss | rate;
3994
3995 return true;
3996}
3997
3998static bool ath10k_get_fixed_rate_nss(const struct cfg80211_bitrate_mask *mask,
3999 enum ieee80211_band band,
4000 u8 *fixed_rate,
4001 u8 *fixed_nss)
4002{
4003 /* First check full NSS mask, if we can simply limit NSS */
4004 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
4005 return true;
4006
4007 /* Next Check single rate is set */
4008 return ath10k_bitrate_mask_rate(mask, band, fixed_rate, fixed_nss);
4009}
4010
4011static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
4012 u8 fixed_rate,
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004013 u8 fixed_nss,
4014 u8 force_sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004015{
4016 struct ath10k *ar = arvif->ar;
4017 u32 vdev_param;
4018 int ret = 0;
4019
4020 mutex_lock(&ar->conf_mutex);
4021
4022 if (arvif->fixed_rate == fixed_rate &&
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004023 arvif->fixed_nss == fixed_nss &&
4024 arvif->force_sgi == force_sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004025 goto exit;
4026
4027 if (fixed_rate == WMI_FIXED_RATE_NONE)
4028 ath10k_dbg(ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
4029
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004030 if (force_sgi)
4031 ath10k_dbg(ATH10K_DBG_MAC, "mac force sgi\n");
4032
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004033 vdev_param = ar->wmi.vdev_param->fixed_rate;
4034 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4035 vdev_param, fixed_rate);
4036 if (ret) {
4037 ath10k_warn("Could not set fixed_rate param 0x%02x: %d\n",
4038 fixed_rate, ret);
4039 ret = -EINVAL;
4040 goto exit;
4041 }
4042
4043 arvif->fixed_rate = fixed_rate;
4044
4045 vdev_param = ar->wmi.vdev_param->nss;
4046 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4047 vdev_param, fixed_nss);
4048
4049 if (ret) {
4050 ath10k_warn("Could not set fixed_nss param %d: %d\n",
4051 fixed_nss, ret);
4052 ret = -EINVAL;
4053 goto exit;
4054 }
4055
4056 arvif->fixed_nss = fixed_nss;
4057
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004058 vdev_param = ar->wmi.vdev_param->sgi;
4059 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4060 force_sgi);
4061
4062 if (ret) {
4063 ath10k_warn("Could not set sgi param %d: %d\n",
4064 force_sgi, ret);
4065 ret = -EINVAL;
4066 goto exit;
4067 }
4068
4069 arvif->force_sgi = force_sgi;
4070
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004071exit:
4072 mutex_unlock(&ar->conf_mutex);
4073 return ret;
4074}
4075
4076static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
4077 struct ieee80211_vif *vif,
4078 const struct cfg80211_bitrate_mask *mask)
4079{
4080 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4081 struct ath10k *ar = arvif->ar;
4082 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
4083 u8 fixed_rate = WMI_FIXED_RATE_NONE;
4084 u8 fixed_nss = ar->num_rf_chains;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004085 u8 force_sgi;
4086
4087 force_sgi = mask->control[band].gi;
4088 if (force_sgi == NL80211_TXRATE_FORCE_LGI)
4089 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004090
4091 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
4092 if (!ath10k_get_fixed_rate_nss(mask, band,
4093 &fixed_rate,
4094 &fixed_nss))
4095 return -EINVAL;
4096 }
4097
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004098 if (fixed_rate == WMI_FIXED_RATE_NONE && force_sgi) {
4099 ath10k_warn("Could not force SGI usage for default rate settings\n");
4100 return -EINVAL;
4101 }
4102
4103 return ath10k_set_fixed_rate_param(arvif, fixed_rate,
4104 fixed_nss, force_sgi);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004105}
4106
Michal Kaziorc2df44b2014-01-23 11:38:26 +01004107static void ath10k_channel_switch_beacon(struct ieee80211_hw *hw,
4108 struct ieee80211_vif *vif,
4109 struct cfg80211_chan_def *chandef)
4110{
4111 /* there's no need to do anything here. vif->csa_active is enough */
4112 return;
4113}
4114
Michal Kazior9797feb2014-02-14 14:49:48 +01004115static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
4116 struct ieee80211_vif *vif,
4117 struct ieee80211_sta *sta,
4118 u32 changed)
4119{
4120 struct ath10k *ar = hw->priv;
4121 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4122 u32 bw, smps;
4123
4124 spin_lock_bh(&ar->data_lock);
4125
4126 ath10k_dbg(ATH10K_DBG_MAC,
4127 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4128 sta->addr, changed, sta->bandwidth, sta->rx_nss,
4129 sta->smps_mode);
4130
4131 if (changed & IEEE80211_RC_BW_CHANGED) {
4132 bw = WMI_PEER_CHWIDTH_20MHZ;
4133
4134 switch (sta->bandwidth) {
4135 case IEEE80211_STA_RX_BW_20:
4136 bw = WMI_PEER_CHWIDTH_20MHZ;
4137 break;
4138 case IEEE80211_STA_RX_BW_40:
4139 bw = WMI_PEER_CHWIDTH_40MHZ;
4140 break;
4141 case IEEE80211_STA_RX_BW_80:
4142 bw = WMI_PEER_CHWIDTH_80MHZ;
4143 break;
4144 case IEEE80211_STA_RX_BW_160:
4145 ath10k_warn("mac sta rc update for %pM: invalid bw %d\n",
4146 sta->addr, sta->bandwidth);
4147 bw = WMI_PEER_CHWIDTH_20MHZ;
4148 break;
4149 }
4150
4151 arsta->bw = bw;
4152 }
4153
4154 if (changed & IEEE80211_RC_NSS_CHANGED)
4155 arsta->nss = sta->rx_nss;
4156
4157 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4158 smps = WMI_PEER_SMPS_PS_NONE;
4159
4160 switch (sta->smps_mode) {
4161 case IEEE80211_SMPS_AUTOMATIC:
4162 case IEEE80211_SMPS_OFF:
4163 smps = WMI_PEER_SMPS_PS_NONE;
4164 break;
4165 case IEEE80211_SMPS_STATIC:
4166 smps = WMI_PEER_SMPS_STATIC;
4167 break;
4168 case IEEE80211_SMPS_DYNAMIC:
4169 smps = WMI_PEER_SMPS_DYNAMIC;
4170 break;
4171 case IEEE80211_SMPS_NUM_MODES:
4172 ath10k_warn("mac sta rc update for %pM: invalid smps: %d\n",
4173 sta->addr, sta->smps_mode);
4174 smps = WMI_PEER_SMPS_PS_NONE;
4175 break;
4176 }
4177
4178 arsta->smps = smps;
4179 }
4180
Michal Kazior9797feb2014-02-14 14:49:48 +01004181 arsta->changed |= changed;
4182
4183 spin_unlock_bh(&ar->data_lock);
4184
4185 ieee80211_queue_work(hw, &arsta->update_wk);
4186}
4187
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02004188static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
4189{
4190 /*
4191 * FIXME: Return 0 for time being. Need to figure out whether FW
4192 * has the API to fetch 64-bit local TSF
4193 */
4194
4195 return 0;
4196}
4197
Kalle Valo5e3dd152013-06-12 20:52:10 +03004198static const struct ieee80211_ops ath10k_ops = {
4199 .tx = ath10k_tx,
4200 .start = ath10k_start,
4201 .stop = ath10k_stop,
4202 .config = ath10k_config,
4203 .add_interface = ath10k_add_interface,
4204 .remove_interface = ath10k_remove_interface,
4205 .configure_filter = ath10k_configure_filter,
4206 .bss_info_changed = ath10k_bss_info_changed,
4207 .hw_scan = ath10k_hw_scan,
4208 .cancel_hw_scan = ath10k_cancel_hw_scan,
4209 .set_key = ath10k_set_key,
4210 .sta_state = ath10k_sta_state,
4211 .conf_tx = ath10k_conf_tx,
4212 .remain_on_channel = ath10k_remain_on_channel,
4213 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
4214 .set_rts_threshold = ath10k_set_rts_threshold,
4215 .set_frag_threshold = ath10k_set_frag_threshold,
4216 .flush = ath10k_flush,
4217 .tx_last_beacon = ath10k_tx_last_beacon,
Michal Kazioraffd3212013-07-16 09:54:35 +02004218 .restart_complete = ath10k_restart_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02004219 .get_survey = ath10k_get_survey,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004220 .set_bitrate_mask = ath10k_set_bitrate_mask,
Michal Kaziorc2df44b2014-01-23 11:38:26 +01004221 .channel_switch_beacon = ath10k_channel_switch_beacon,
Michal Kazior9797feb2014-02-14 14:49:48 +01004222 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02004223 .get_tsf = ath10k_get_tsf,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004224#ifdef CONFIG_PM
4225 .suspend = ath10k_suspend,
4226 .resume = ath10k_resume,
4227#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03004228};
4229
4230#define RATETAB_ENT(_rate, _rateid, _flags) { \
4231 .bitrate = (_rate), \
4232 .flags = (_flags), \
4233 .hw_value = (_rateid), \
4234}
4235
4236#define CHAN2G(_channel, _freq, _flags) { \
4237 .band = IEEE80211_BAND_2GHZ, \
4238 .hw_value = (_channel), \
4239 .center_freq = (_freq), \
4240 .flags = (_flags), \
4241 .max_antenna_gain = 0, \
4242 .max_power = 30, \
4243}
4244
4245#define CHAN5G(_channel, _freq, _flags) { \
4246 .band = IEEE80211_BAND_5GHZ, \
4247 .hw_value = (_channel), \
4248 .center_freq = (_freq), \
4249 .flags = (_flags), \
4250 .max_antenna_gain = 0, \
4251 .max_power = 30, \
4252}
4253
4254static const struct ieee80211_channel ath10k_2ghz_channels[] = {
4255 CHAN2G(1, 2412, 0),
4256 CHAN2G(2, 2417, 0),
4257 CHAN2G(3, 2422, 0),
4258 CHAN2G(4, 2427, 0),
4259 CHAN2G(5, 2432, 0),
4260 CHAN2G(6, 2437, 0),
4261 CHAN2G(7, 2442, 0),
4262 CHAN2G(8, 2447, 0),
4263 CHAN2G(9, 2452, 0),
4264 CHAN2G(10, 2457, 0),
4265 CHAN2G(11, 2462, 0),
4266 CHAN2G(12, 2467, 0),
4267 CHAN2G(13, 2472, 0),
4268 CHAN2G(14, 2484, 0),
4269};
4270
4271static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02004272 CHAN5G(36, 5180, 0),
4273 CHAN5G(40, 5200, 0),
4274 CHAN5G(44, 5220, 0),
4275 CHAN5G(48, 5240, 0),
4276 CHAN5G(52, 5260, 0),
4277 CHAN5G(56, 5280, 0),
4278 CHAN5G(60, 5300, 0),
4279 CHAN5G(64, 5320, 0),
4280 CHAN5G(100, 5500, 0),
4281 CHAN5G(104, 5520, 0),
4282 CHAN5G(108, 5540, 0),
4283 CHAN5G(112, 5560, 0),
4284 CHAN5G(116, 5580, 0),
4285 CHAN5G(120, 5600, 0),
4286 CHAN5G(124, 5620, 0),
4287 CHAN5G(128, 5640, 0),
4288 CHAN5G(132, 5660, 0),
4289 CHAN5G(136, 5680, 0),
4290 CHAN5G(140, 5700, 0),
4291 CHAN5G(149, 5745, 0),
4292 CHAN5G(153, 5765, 0),
4293 CHAN5G(157, 5785, 0),
4294 CHAN5G(161, 5805, 0),
4295 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03004296};
4297
4298static struct ieee80211_rate ath10k_rates[] = {
4299 /* CCK */
4300 RATETAB_ENT(10, 0x82, 0),
4301 RATETAB_ENT(20, 0x84, 0),
4302 RATETAB_ENT(55, 0x8b, 0),
4303 RATETAB_ENT(110, 0x96, 0),
4304 /* OFDM */
4305 RATETAB_ENT(60, 0x0c, 0),
4306 RATETAB_ENT(90, 0x12, 0),
4307 RATETAB_ENT(120, 0x18, 0),
4308 RATETAB_ENT(180, 0x24, 0),
4309 RATETAB_ENT(240, 0x30, 0),
4310 RATETAB_ENT(360, 0x48, 0),
4311 RATETAB_ENT(480, 0x60, 0),
4312 RATETAB_ENT(540, 0x6c, 0),
4313};
4314
4315#define ath10k_a_rates (ath10k_rates + 4)
4316#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
4317#define ath10k_g_rates (ath10k_rates + 0)
4318#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
4319
4320struct ath10k *ath10k_mac_create(void)
4321{
4322 struct ieee80211_hw *hw;
4323 struct ath10k *ar;
4324
4325 hw = ieee80211_alloc_hw(sizeof(struct ath10k), &ath10k_ops);
4326 if (!hw)
4327 return NULL;
4328
4329 ar = hw->priv;
4330 ar->hw = hw;
4331
4332 return ar;
4333}
4334
4335void ath10k_mac_destroy(struct ath10k *ar)
4336{
4337 ieee80211_free_hw(ar->hw);
4338}
4339
4340static const struct ieee80211_iface_limit ath10k_if_limits[] = {
4341 {
4342 .max = 8,
4343 .types = BIT(NL80211_IFTYPE_STATION)
4344 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02004345 },
4346 {
4347 .max = 3,
4348 .types = BIT(NL80211_IFTYPE_P2P_GO)
4349 },
4350 {
4351 .max = 7,
4352 .types = BIT(NL80211_IFTYPE_AP)
4353 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004354};
4355
Bartosz Markowskif2595092013-12-10 16:20:39 +01004356static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004357 {
4358 .max = 8,
4359 .types = BIT(NL80211_IFTYPE_AP)
4360 },
4361};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004362
4363static const struct ieee80211_iface_combination ath10k_if_comb[] = {
4364 {
4365 .limits = ath10k_if_limits,
4366 .n_limits = ARRAY_SIZE(ath10k_if_limits),
4367 .max_interfaces = 8,
4368 .num_different_channels = 1,
4369 .beacon_int_infra_match = true,
4370 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01004371};
4372
4373static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004374 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01004375 .limits = ath10k_10x_if_limits,
4376 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004377 .max_interfaces = 8,
4378 .num_different_channels = 1,
4379 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01004380#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004381 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
4382 BIT(NL80211_CHAN_WIDTH_20) |
4383 BIT(NL80211_CHAN_WIDTH_40) |
4384 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004385#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01004386 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004387};
4388
4389static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4390{
4391 struct ieee80211_sta_vht_cap vht_cap = {0};
4392 u16 mcs_map;
Michal Kazior8865bee42013-07-24 12:36:46 +02004393 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004394
4395 vht_cap.vht_supported = 1;
4396 vht_cap.cap = ar->vht_cap_info;
4397
Michal Kazior8865bee42013-07-24 12:36:46 +02004398 mcs_map = 0;
4399 for (i = 0; i < 8; i++) {
4400 if (i < ar->num_rf_chains)
4401 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
4402 else
4403 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
4404 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004405
4406 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4407 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4408
4409 return vht_cap;
4410}
4411
4412static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4413{
4414 int i;
4415 struct ieee80211_sta_ht_cap ht_cap = {0};
4416
4417 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4418 return ht_cap;
4419
4420 ht_cap.ht_supported = 1;
4421 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4422 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4423 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4424 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4425 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4426
4427 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4428 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4429
4430 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4431 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4432
4433 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4434 u32 smps;
4435
4436 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4437 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4438
4439 ht_cap.cap |= smps;
4440 }
4441
4442 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
4443 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4444
4445 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4446 u32 stbc;
4447
4448 stbc = ar->ht_cap_info;
4449 stbc &= WMI_HT_CAP_RX_STBC;
4450 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4451 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4452 stbc &= IEEE80211_HT_CAP_RX_STBC;
4453
4454 ht_cap.cap |= stbc;
4455 }
4456
4457 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4458 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4459
4460 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4461 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4462
4463 /* max AMSDU is implicitly taken from vht_cap_info */
4464 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4465 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4466
Michal Kazior8865bee42013-07-24 12:36:46 +02004467 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004468 ht_cap.mcs.rx_mask[i] = 0xFF;
4469
4470 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4471
4472 return ht_cap;
4473}
4474
4475
4476static void ath10k_get_arvif_iter(void *data, u8 *mac,
4477 struct ieee80211_vif *vif)
4478{
4479 struct ath10k_vif_iter *arvif_iter = data;
4480 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4481
4482 if (arvif->vdev_id == arvif_iter->vdev_id)
4483 arvif_iter->arvif = arvif;
4484}
4485
4486struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
4487{
4488 struct ath10k_vif_iter arvif_iter;
4489 u32 flags;
4490
4491 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
4492 arvif_iter.vdev_id = vdev_id;
4493
4494 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
4495 ieee80211_iterate_active_interfaces_atomic(ar->hw,
4496 flags,
4497 ath10k_get_arvif_iter,
4498 &arvif_iter);
4499 if (!arvif_iter.arvif) {
Ben Greear69244e52014-02-27 18:50:00 +02004500 ath10k_warn("No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004501 return NULL;
4502 }
4503
4504 return arvif_iter.arvif;
4505}
4506
4507int ath10k_mac_register(struct ath10k *ar)
4508{
4509 struct ieee80211_supported_band *band;
4510 struct ieee80211_sta_vht_cap vht_cap;
4511 struct ieee80211_sta_ht_cap ht_cap;
4512 void *channels;
4513 int ret;
4514
4515 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
4516
4517 SET_IEEE80211_DEV(ar->hw, ar->dev);
4518
4519 ht_cap = ath10k_get_ht_cap(ar);
4520 vht_cap = ath10k_create_vht_cap(ar);
4521
4522 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4523 channels = kmemdup(ath10k_2ghz_channels,
4524 sizeof(ath10k_2ghz_channels),
4525 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02004526 if (!channels) {
4527 ret = -ENOMEM;
4528 goto err_free;
4529 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004530
4531 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
4532 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
4533 band->channels = channels;
4534 band->n_bitrates = ath10k_g_rates_size;
4535 band->bitrates = ath10k_g_rates;
4536 band->ht_cap = ht_cap;
4537
4538 /* vht is not supported in 2.4 GHz */
4539
4540 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
4541 }
4542
4543 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4544 channels = kmemdup(ath10k_5ghz_channels,
4545 sizeof(ath10k_5ghz_channels),
4546 GFP_KERNEL);
4547 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02004548 ret = -ENOMEM;
4549 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004550 }
4551
4552 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
4553 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
4554 band->channels = channels;
4555 band->n_bitrates = ath10k_a_rates_size;
4556 band->bitrates = ath10k_a_rates;
4557 band->ht_cap = ht_cap;
4558 band->vht_cap = vht_cap;
4559 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
4560 }
4561
4562 ar->hw->wiphy->interface_modes =
4563 BIT(NL80211_IFTYPE_STATION) |
4564 BIT(NL80211_IFTYPE_ADHOC) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01004565 BIT(NL80211_IFTYPE_AP);
4566
4567 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
4568 ar->hw->wiphy->interface_modes |=
4569 BIT(NL80211_IFTYPE_P2P_CLIENT) |
4570 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004571
4572 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
4573 IEEE80211_HW_SUPPORTS_PS |
4574 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
4575 IEEE80211_HW_SUPPORTS_UAPSD |
4576 IEEE80211_HW_MFP_CAPABLE |
4577 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
4578 IEEE80211_HW_HAS_RATE_CONTROL |
4579 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
4580 IEEE80211_HW_WANT_MONITOR_VIF |
Janusz Dziedzic2f0f1122014-02-26 18:42:09 +02004581 IEEE80211_HW_AP_LINK_PS |
4582 IEEE80211_HW_SPECTRUM_MGMT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004583
Michal Kazior1f8bb152013-09-18 14:43:22 +02004584 /* MSDU can have HTT TX fragment pushed in front. The additional 4
4585 * bytes is used for padding/alignment if necessary. */
4586 ar->hw->extra_tx_headroom += sizeof(struct htt_data_tx_desc_frag)*2 + 4;
4587
Kalle Valo5e3dd152013-06-12 20:52:10 +03004588 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4589 ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
4590
4591 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
4592 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
4593 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
4594 }
4595
4596 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
4597 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
4598
4599 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01004600 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004601
Kalle Valo5e3dd152013-06-12 20:52:10 +03004602 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
4603
4604 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01004605 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004606 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
4607
4608 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
4609 /*
4610 * on LL hardware queues are managed entirely by the FW
4611 * so we only advertise to mac we can do the queues thing
4612 */
4613 ar->hw->queues = 4;
4614
Bartosz Markowskif2595092013-12-10 16:20:39 +01004615 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4616 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
4617 ar->hw->wiphy->n_iface_combinations =
4618 ARRAY_SIZE(ath10k_10x_if_comb);
4619 } else {
4620 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
4621 ar->hw->wiphy->n_iface_combinations =
4622 ARRAY_SIZE(ath10k_if_comb);
4623 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004624
Michal Kazior7c199992013-07-31 10:47:57 +02004625 ar->hw->netdev_features = NETIF_F_HW_CSUM;
4626
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004627 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
4628 /* Init ath dfs pattern detector */
4629 ar->ath_common.debug_mask = ATH_DBG_DFS;
4630 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
4631 NL80211_DFS_UNSET);
4632
4633 if (!ar->dfs_detector)
4634 ath10k_warn("dfs pattern detector init failed\n");
4635 }
4636
Kalle Valo5e3dd152013-06-12 20:52:10 +03004637 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
4638 ath10k_reg_notifier);
4639 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02004640 ath10k_err("Regulatory initialization failed: %i\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02004641 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004642 }
4643
4644 ret = ieee80211_register_hw(ar->hw);
4645 if (ret) {
4646 ath10k_err("ieee80211 registration failed: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02004647 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004648 }
4649
4650 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
4651 ret = regulatory_hint(ar->hw->wiphy,
4652 ar->ath_common.regulatory.alpha2);
4653 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02004654 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004655 }
4656
4657 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02004658
4659err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004660 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02004661err_free:
4662 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4663 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4664
Kalle Valo5e3dd152013-06-12 20:52:10 +03004665 return ret;
4666}
4667
4668void ath10k_mac_unregister(struct ath10k *ar)
4669{
4670 ieee80211_unregister_hw(ar->hw);
4671
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004672 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
4673 ar->dfs_detector->exit(ar->dfs_detector);
4674
Kalle Valo5e3dd152013-06-12 20:52:10 +03004675 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4676 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4677
4678 SET_IEEE80211_DEV(ar->hw, NULL);
4679}