blob: e568882a17de99822204fce1d73eaef05169738b [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;
Marek Kwaczynskieeab2662014-05-14 16:56:17 +030057 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
58 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
59 else
60 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
Kalle Valo5e3dd152013-06-12 20:52:10 +030061 break;
62 case WLAN_CIPHER_SUITE_TKIP:
Kalle Valo5e3dd152013-06-12 20:52:10 +030063 arg.key_cipher = WMI_CIPHER_TKIP;
64 arg.key_txmic_len = 8;
65 arg.key_rxmic_len = 8;
66 break;
67 case WLAN_CIPHER_SUITE_WEP40:
68 case WLAN_CIPHER_SUITE_WEP104:
69 arg.key_cipher = WMI_CIPHER_WEP;
70 /* AP/IBSS mode requires self-key to be groupwise
71 * Otherwise pairwise key must be set */
72 if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
73 arg.key_flags = WMI_KEY_PAIRWISE;
74 break;
75 default:
76 ath10k_warn("cipher %d is not supported\n", key->cipher);
77 return -EOPNOTSUPP;
78 }
79
80 if (cmd == DISABLE_KEY) {
81 arg.key_cipher = WMI_CIPHER_NONE;
82 arg.key_data = NULL;
83 }
84
85 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
86}
87
88static int ath10k_install_key(struct ath10k_vif *arvif,
89 struct ieee80211_key_conf *key,
90 enum set_key_cmd cmd,
91 const u8 *macaddr)
92{
93 struct ath10k *ar = arvif->ar;
94 int ret;
95
Michal Kazior548db542013-07-05 16:15:15 +030096 lockdep_assert_held(&ar->conf_mutex);
97
Wolfram Sang16735d02013-11-14 14:32:02 -080098 reinit_completion(&ar->install_key_done);
Kalle Valo5e3dd152013-06-12 20:52:10 +030099
100 ret = ath10k_send_key(arvif, key, cmd, macaddr);
101 if (ret)
102 return ret;
103
104 ret = wait_for_completion_timeout(&ar->install_key_done, 3*HZ);
105 if (ret == 0)
106 return -ETIMEDOUT;
107
108 return 0;
109}
110
111static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
112 const u8 *addr)
113{
114 struct ath10k *ar = arvif->ar;
115 struct ath10k_peer *peer;
116 int ret;
117 int i;
118
119 lockdep_assert_held(&ar->conf_mutex);
120
121 spin_lock_bh(&ar->data_lock);
122 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
123 spin_unlock_bh(&ar->data_lock);
124
125 if (!peer)
126 return -ENOENT;
127
128 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
129 if (arvif->wep_keys[i] == NULL)
130 continue;
131
132 ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
133 addr);
134 if (ret)
135 return ret;
136
137 peer->keys[i] = arvif->wep_keys[i];
138 }
139
140 return 0;
141}
142
143static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
144 const u8 *addr)
145{
146 struct ath10k *ar = arvif->ar;
147 struct ath10k_peer *peer;
148 int first_errno = 0;
149 int ret;
150 int i;
151
152 lockdep_assert_held(&ar->conf_mutex);
153
154 spin_lock_bh(&ar->data_lock);
155 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
156 spin_unlock_bh(&ar->data_lock);
157
158 if (!peer)
159 return -ENOENT;
160
161 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
162 if (peer->keys[i] == NULL)
163 continue;
164
165 ret = ath10k_install_key(arvif, peer->keys[i],
166 DISABLE_KEY, addr);
167 if (ret && first_errno == 0)
168 first_errno = ret;
169
170 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +0200171 ath10k_warn("failed to remove peer wep key %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300172 i, ret);
173
174 peer->keys[i] = NULL;
175 }
176
177 return first_errno;
178}
179
180static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
181 struct ieee80211_key_conf *key)
182{
183 struct ath10k *ar = arvif->ar;
184 struct ath10k_peer *peer;
185 u8 addr[ETH_ALEN];
186 int first_errno = 0;
187 int ret;
188 int i;
189
190 lockdep_assert_held(&ar->conf_mutex);
191
192 for (;;) {
193 /* since ath10k_install_key we can't hold data_lock all the
194 * time, so we try to remove the keys incrementally */
195 spin_lock_bh(&ar->data_lock);
196 i = 0;
197 list_for_each_entry(peer, &ar->peers, list) {
198 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
199 if (peer->keys[i] == key) {
200 memcpy(addr, peer->addr, ETH_ALEN);
201 peer->keys[i] = NULL;
202 break;
203 }
204 }
205
206 if (i < ARRAY_SIZE(peer->keys))
207 break;
208 }
209 spin_unlock_bh(&ar->data_lock);
210
211 if (i == ARRAY_SIZE(peer->keys))
212 break;
213
214 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr);
215 if (ret && first_errno == 0)
216 first_errno = ret;
217
218 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +0200219 ath10k_warn("failed to remove key for %pM: %d\n",
220 addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300221 }
222
223 return first_errno;
224}
225
226
227/*********************/
228/* General utilities */
229/*********************/
230
231static inline enum wmi_phy_mode
232chan_to_phymode(const struct cfg80211_chan_def *chandef)
233{
234 enum wmi_phy_mode phymode = MODE_UNKNOWN;
235
236 switch (chandef->chan->band) {
237 case IEEE80211_BAND_2GHZ:
238 switch (chandef->width) {
239 case NL80211_CHAN_WIDTH_20_NOHT:
240 phymode = MODE_11G;
241 break;
242 case NL80211_CHAN_WIDTH_20:
243 phymode = MODE_11NG_HT20;
244 break;
245 case NL80211_CHAN_WIDTH_40:
246 phymode = MODE_11NG_HT40;
247 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400248 case NL80211_CHAN_WIDTH_5:
249 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300250 case NL80211_CHAN_WIDTH_80:
251 case NL80211_CHAN_WIDTH_80P80:
252 case NL80211_CHAN_WIDTH_160:
253 phymode = MODE_UNKNOWN;
254 break;
255 }
256 break;
257 case IEEE80211_BAND_5GHZ:
258 switch (chandef->width) {
259 case NL80211_CHAN_WIDTH_20_NOHT:
260 phymode = MODE_11A;
261 break;
262 case NL80211_CHAN_WIDTH_20:
263 phymode = MODE_11NA_HT20;
264 break;
265 case NL80211_CHAN_WIDTH_40:
266 phymode = MODE_11NA_HT40;
267 break;
268 case NL80211_CHAN_WIDTH_80:
269 phymode = MODE_11AC_VHT80;
270 break;
John W. Linville0f817ed2013-06-27 13:50:09 -0400271 case NL80211_CHAN_WIDTH_5:
272 case NL80211_CHAN_WIDTH_10:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300273 case NL80211_CHAN_WIDTH_80P80:
274 case NL80211_CHAN_WIDTH_160:
275 phymode = MODE_UNKNOWN;
276 break;
277 }
278 break;
279 default:
280 break;
281 }
282
283 WARN_ON(phymode == MODE_UNKNOWN);
284 return phymode;
285}
286
287static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
288{
289/*
290 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
291 * 0 for no restriction
292 * 1 for 1/4 us
293 * 2 for 1/2 us
294 * 3 for 1 us
295 * 4 for 2 us
296 * 5 for 4 us
297 * 6 for 8 us
298 * 7 for 16 us
299 */
300 switch (mpdudensity) {
301 case 0:
302 return 0;
303 case 1:
304 case 2:
305 case 3:
306 /* Our lower layer calculations limit our precision to
307 1 microsecond */
308 return 1;
309 case 4:
310 return 2;
311 case 5:
312 return 4;
313 case 6:
314 return 8;
315 case 7:
316 return 16;
317 default:
318 return 0;
319 }
320}
321
322static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
323{
324 int ret;
325
326 lockdep_assert_held(&ar->conf_mutex);
327
328 ret = ath10k_wmi_peer_create(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800329 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200330 ath10k_warn("failed to create wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200331 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300332 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800333 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300334
335 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
Ben Greear479398b2013-11-04 09:19:34 -0800336 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200337 ath10k_warn("failed to wait for created wmi peer %pM on vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200338 addr, vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300339 return ret;
Ben Greear479398b2013-11-04 09:19:34 -0800340 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100341 spin_lock_bh(&ar->data_lock);
342 ar->num_peers++;
343 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300344
345 return 0;
346}
347
Kalle Valo5a13e762014-01-20 11:01:46 +0200348static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
349{
350 struct ath10k *ar = arvif->ar;
351 u32 param;
352 int ret;
353
354 param = ar->wmi.pdev_param->sta_kickout_th;
355 ret = ath10k_wmi_pdev_set_param(ar, param,
356 ATH10K_KICKOUT_THRESHOLD);
357 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200358 ath10k_warn("failed to set kickout threshold on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200359 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200360 return ret;
361 }
362
363 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
364 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
365 ATH10K_KEEPALIVE_MIN_IDLE);
366 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200367 ath10k_warn("failed to set keepalive minimum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200368 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200369 return ret;
370 }
371
372 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
373 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
374 ATH10K_KEEPALIVE_MAX_IDLE);
375 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200376 ath10k_warn("failed to set keepalive maximum idle time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200377 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200378 return ret;
379 }
380
381 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
382 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
383 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
384 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200385 ath10k_warn("failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200386 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +0200387 return ret;
388 }
389
390 return 0;
391}
392
Michal Kazior424121c2013-07-22 14:13:31 +0200393static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
394{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200395 struct ath10k *ar = arvif->ar;
396 u32 vdev_param;
397
Michal Kazior424121c2013-07-22 14:13:31 +0200398 if (value != 0xFFFFFFFF)
399 value = min_t(u32, arvif->ar->hw->wiphy->rts_threshold,
400 ATH10K_RTS_MAX);
401
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200402 vdev_param = ar->wmi.vdev_param->rts_threshold;
403 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200404}
405
406static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
407{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200408 struct ath10k *ar = arvif->ar;
409 u32 vdev_param;
410
Michal Kazior424121c2013-07-22 14:13:31 +0200411 if (value != 0xFFFFFFFF)
412 value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
413 ATH10K_FRAGMT_THRESHOLD_MIN,
414 ATH10K_FRAGMT_THRESHOLD_MAX);
415
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200416 vdev_param = ar->wmi.vdev_param->fragmentation_threshold;
417 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
Michal Kazior424121c2013-07-22 14:13:31 +0200418}
419
Kalle Valo5e3dd152013-06-12 20:52:10 +0300420static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
421{
422 int ret;
423
424 lockdep_assert_held(&ar->conf_mutex);
425
426 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
427 if (ret)
428 return ret;
429
430 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
431 if (ret)
432 return ret;
433
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100434 spin_lock_bh(&ar->data_lock);
435 ar->num_peers--;
436 spin_unlock_bh(&ar->data_lock);
437
Kalle Valo5e3dd152013-06-12 20:52:10 +0300438 return 0;
439}
440
441static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
442{
443 struct ath10k_peer *peer, *tmp;
444
445 lockdep_assert_held(&ar->conf_mutex);
446
447 spin_lock_bh(&ar->data_lock);
448 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
449 if (peer->vdev_id != vdev_id)
450 continue;
451
452 ath10k_warn("removing stale peer %pM from vdev_id %d\n",
453 peer->addr, vdev_id);
454
455 list_del(&peer->list);
456 kfree(peer);
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100457 ar->num_peers--;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300458 }
459 spin_unlock_bh(&ar->data_lock);
460}
461
Michal Kaziora96d7742013-07-16 09:38:56 +0200462static void ath10k_peer_cleanup_all(struct ath10k *ar)
463{
464 struct ath10k_peer *peer, *tmp;
465
466 lockdep_assert_held(&ar->conf_mutex);
467
468 spin_lock_bh(&ar->data_lock);
469 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
470 list_del(&peer->list);
471 kfree(peer);
472 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +0100473 ar->num_peers = 0;
Michal Kaziora96d7742013-07-16 09:38:56 +0200474 spin_unlock_bh(&ar->data_lock);
475}
476
Kalle Valo5e3dd152013-06-12 20:52:10 +0300477/************************/
478/* Interface management */
479/************************/
480
481static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
482{
483 int ret;
484
Michal Kazior548db542013-07-05 16:15:15 +0300485 lockdep_assert_held(&ar->conf_mutex);
486
Kalle Valo5e3dd152013-06-12 20:52:10 +0300487 ret = wait_for_completion_timeout(&ar->vdev_setup_done,
488 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
489 if (ret == 0)
490 return -ETIMEDOUT;
491
492 return 0;
493}
494
Michal Kazior1bbc0972014-04-08 09:45:47 +0300495static bool ath10k_monitor_is_enabled(struct ath10k *ar)
496{
497 lockdep_assert_held(&ar->conf_mutex);
498
499 ath10k_dbg(ATH10K_DBG_MAC,
500 "mac monitor refs: promisc %d monitor %d cac %d\n",
501 ar->promisc, ar->monitor,
502 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags));
503
504 return ar->promisc || ar->monitor ||
505 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
506}
507
508static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300509{
Michal Kaziorc930f742014-01-23 11:38:25 +0100510 struct cfg80211_chan_def *chandef = &ar->chandef;
511 struct ieee80211_channel *channel = chandef->chan;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300512 struct wmi_vdev_start_request_arg arg = {};
Kalle Valo5e3dd152013-06-12 20:52:10 +0300513 int ret = 0;
514
515 lockdep_assert_held(&ar->conf_mutex);
516
Kalle Valo5e3dd152013-06-12 20:52:10 +0300517 arg.vdev_id = vdev_id;
518 arg.channel.freq = channel->center_freq;
Michal Kaziorc930f742014-01-23 11:38:25 +0100519 arg.channel.band_center_freq1 = chandef->center_freq1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300520
521 /* TODO setup this dynamically, what in case we
522 don't have any vifs? */
Michal Kaziorc930f742014-01-23 11:38:25 +0100523 arg.channel.mode = chan_to_phymode(chandef);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200524 arg.channel.chan_radar =
525 !!(channel->flags & IEEE80211_CHAN_RADAR);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300526
Michal Kazior89c5c842013-10-23 04:02:13 -0700527 arg.channel.min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -0700528 arg.channel.max_power = channel->max_power * 2;
529 arg.channel.max_reg_power = channel->max_reg_power * 2;
530 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300531
532 ret = ath10k_wmi_vdev_start(ar, &arg);
533 if (ret) {
Michal Kazior1bbc0972014-04-08 09:45:47 +0300534 ath10k_warn("failed to request monitor vdev %i start: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200535 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300536 return ret;
537 }
538
539 ret = ath10k_vdev_setup_sync(ar);
540 if (ret) {
Michal Kazior1bbc0972014-04-08 09:45:47 +0300541 ath10k_warn("failed to synchronize setup for monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200542 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300543 return ret;
544 }
545
546 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
547 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200548 ath10k_warn("failed to put up monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200549 vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300550 goto vdev_stop;
551 }
552
553 ar->monitor_vdev_id = vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300554
Michal Kazior1bbc0972014-04-08 09:45:47 +0300555 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
556 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300557 return 0;
558
559vdev_stop:
560 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
561 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +0200562 ath10k_warn("failed to stop monitor vdev %i after start failure: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200563 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300564
565 return ret;
566}
567
Michal Kazior1bbc0972014-04-08 09:45:47 +0300568static int ath10k_monitor_vdev_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300569{
570 int ret = 0;
571
572 lockdep_assert_held(&ar->conf_mutex);
573
Marek Puzyniak52fa0192013-09-24 14:06:24 +0200574 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
575 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +0200576 ath10k_warn("failed to put down monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200577 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300578
579 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
580 if (ret)
Michal Kazior1bbc0972014-04-08 09:45:47 +0300581 ath10k_warn("failed to to request monitor vdev %i stop: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200582 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300583
584 ret = ath10k_vdev_setup_sync(ar);
585 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +0200586 ath10k_warn("failed to synchronise monitor vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200587 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300588
Michal Kazior1bbc0972014-04-08 09:45:47 +0300589 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
590 ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300591 return ret;
592}
593
Michal Kazior1bbc0972014-04-08 09:45:47 +0300594static int ath10k_monitor_vdev_create(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300595{
596 int bit, ret = 0;
597
598 lockdep_assert_held(&ar->conf_mutex);
599
Ben Greeara9aefb32014-08-12 11:02:19 +0300600 if (ar->free_vdev_map == 0) {
Michal Kazior1bbc0972014-04-08 09:45:47 +0300601 ath10k_warn("failed to find free vdev id for monitor vdev\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300602 return -ENOMEM;
603 }
604
Ben Greeara9aefb32014-08-12 11:02:19 +0300605 bit = ffs(ar->free_vdev_map);
606
Kalle Valo5e3dd152013-06-12 20:52:10 +0300607 ar->monitor_vdev_id = bit - 1;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300608
609 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
610 WMI_VDEV_TYPE_MONITOR,
611 0, ar->mac_addr);
612 if (ret) {
Michal Kazior1bbc0972014-04-08 09:45:47 +0300613 ath10k_warn("failed to request monitor vdev %i creation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200614 ar->monitor_vdev_id, ret);
Ben Greeara9aefb32014-08-12 11:02:19 +0300615 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300616 }
617
Ben Greeara9aefb32014-08-12 11:02:19 +0300618 ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id);
Kalle Valo60c3daa2013-09-08 17:56:07 +0300619 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300620 ar->monitor_vdev_id);
621
Kalle Valo5e3dd152013-06-12 20:52:10 +0300622 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300623}
624
Michal Kazior1bbc0972014-04-08 09:45:47 +0300625static int ath10k_monitor_vdev_delete(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300626{
627 int ret = 0;
628
629 lockdep_assert_held(&ar->conf_mutex);
630
Kalle Valo5e3dd152013-06-12 20:52:10 +0300631 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
632 if (ret) {
Michal Kazior1bbc0972014-04-08 09:45:47 +0300633 ath10k_warn("failed to request wmi monitor vdev %i removal: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200634 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300635 return ret;
636 }
637
Ben Greeara9aefb32014-08-12 11:02:19 +0300638 ar->free_vdev_map |= 1 << ar->monitor_vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300639
Kalle Valo60c3daa2013-09-08 17:56:07 +0300640 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300641 ar->monitor_vdev_id);
642 return ret;
643}
644
Michal Kazior1bbc0972014-04-08 09:45:47 +0300645static int ath10k_monitor_start(struct ath10k *ar)
646{
647 int ret;
648
649 lockdep_assert_held(&ar->conf_mutex);
650
651 if (!ath10k_monitor_is_enabled(ar)) {
652 ath10k_warn("trying to start monitor with no references\n");
653 return 0;
654 }
655
656 if (ar->monitor_started) {
657 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor already started\n");
658 return 0;
659 }
660
661 ret = ath10k_monitor_vdev_create(ar);
662 if (ret) {
663 ath10k_warn("failed to create monitor vdev: %d\n", ret);
664 return ret;
665 }
666
667 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
668 if (ret) {
669 ath10k_warn("failed to start monitor vdev: %d\n", ret);
670 ath10k_monitor_vdev_delete(ar);
671 return ret;
672 }
673
674 ar->monitor_started = true;
675 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor started\n");
676
677 return 0;
678}
679
680static void ath10k_monitor_stop(struct ath10k *ar)
681{
682 int ret;
683
684 lockdep_assert_held(&ar->conf_mutex);
685
686 if (ath10k_monitor_is_enabled(ar)) {
687 ath10k_dbg(ATH10K_DBG_MAC,
688 "mac monitor will be stopped later\n");
689 return;
690 }
691
692 if (!ar->monitor_started) {
693 ath10k_dbg(ATH10K_DBG_MAC,
694 "mac monitor probably failed to start earlier\n");
695 return;
696 }
697
698 ret = ath10k_monitor_vdev_stop(ar);
699 if (ret)
700 ath10k_warn("failed to stop monitor vdev: %d\n", ret);
701
702 ret = ath10k_monitor_vdev_delete(ar);
703 if (ret)
704 ath10k_warn("failed to delete monitor vdev: %d\n", ret);
705
706 ar->monitor_started = false;
707 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor stopped\n");
708}
709
Marek Kwaczynskie81bd102014-03-11 12:58:00 +0200710static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
711{
712 struct ath10k *ar = arvif->ar;
713 u32 vdev_param, rts_cts = 0;
714
715 lockdep_assert_held(&ar->conf_mutex);
716
717 vdev_param = ar->wmi.vdev_param->enable_rtscts;
718
719 if (arvif->use_cts_prot || arvif->num_legacy_stations > 0)
720 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
721
722 if (arvif->num_legacy_stations > 0)
723 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
724 WMI_RTSCTS_PROFILE);
725
726 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
727 rts_cts);
728}
729
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200730static int ath10k_start_cac(struct ath10k *ar)
731{
732 int ret;
733
734 lockdep_assert_held(&ar->conf_mutex);
735
736 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
737
Michal Kazior1bbc0972014-04-08 09:45:47 +0300738 ret = ath10k_monitor_start(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200739 if (ret) {
Michal Kazior1bbc0972014-04-08 09:45:47 +0300740 ath10k_warn("failed to start monitor (cac): %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200741 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
742 return ret;
743 }
744
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200745 ath10k_dbg(ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
746 ar->monitor_vdev_id);
747
748 return 0;
749}
750
751static int ath10k_stop_cac(struct ath10k *ar)
752{
753 lockdep_assert_held(&ar->conf_mutex);
754
755 /* CAC is not running - do nothing */
756 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
757 return 0;
758
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200759 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300760 ath10k_monitor_stop(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200761
762 ath10k_dbg(ATH10K_DBG_MAC, "mac cac finished\n");
763
764 return 0;
765}
766
Michal Kaziord6500972014-04-08 09:56:09 +0300767static void ath10k_recalc_radar_detection(struct ath10k *ar)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200768{
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200769 int ret;
770
771 lockdep_assert_held(&ar->conf_mutex);
772
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200773 ath10k_stop_cac(ar);
774
Michal Kaziord6500972014-04-08 09:56:09 +0300775 if (!ar->radar_enabled)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200776 return;
777
Michal Kaziord6500972014-04-08 09:56:09 +0300778 if (ar->num_started_vdevs > 0)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200779 return;
780
781 ret = ath10k_start_cac(ar);
782 if (ret) {
783 /*
784 * Not possible to start CAC on current channel so starting
785 * radiation is not allowed, make this channel DFS_UNAVAILABLE
786 * by indicating that radar was detected.
787 */
Kalle Valobe6546f2014-03-25 14:18:51 +0200788 ath10k_warn("failed to start CAC: %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200789 ieee80211_radar_detected(ar->hw);
790 }
791}
792
Michal Kaziordc55e302014-07-29 12:53:36 +0300793static int ath10k_vdev_start_restart(struct ath10k_vif *arvif, bool restart)
Michal Kazior72654fa2014-04-08 09:56:09 +0300794{
795 struct ath10k *ar = arvif->ar;
796 struct cfg80211_chan_def *chandef = &ar->chandef;
797 struct wmi_vdev_start_request_arg arg = {};
798 int ret = 0;
799
800 lockdep_assert_held(&ar->conf_mutex);
801
802 reinit_completion(&ar->vdev_setup_done);
803
804 arg.vdev_id = arvif->vdev_id;
805 arg.dtim_period = arvif->dtim_period;
806 arg.bcn_intval = arvif->beacon_interval;
807
808 arg.channel.freq = chandef->chan->center_freq;
809 arg.channel.band_center_freq1 = chandef->center_freq1;
810 arg.channel.mode = chan_to_phymode(chandef);
811
812 arg.channel.min_power = 0;
813 arg.channel.max_power = chandef->chan->max_power * 2;
814 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
815 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
816
817 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
818 arg.ssid = arvif->u.ap.ssid;
819 arg.ssid_len = arvif->u.ap.ssid_len;
820 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
821
822 /* For now allow DFS for AP mode */
823 arg.channel.chan_radar =
824 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
825 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
826 arg.ssid = arvif->vif->bss_conf.ssid;
827 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
828 }
829
830 ath10k_dbg(ATH10K_DBG_MAC,
831 "mac vdev %d start center_freq %d phymode %s\n",
832 arg.vdev_id, arg.channel.freq,
833 ath10k_wmi_phymode_str(arg.channel.mode));
834
Michal Kaziordc55e302014-07-29 12:53:36 +0300835 if (restart)
836 ret = ath10k_wmi_vdev_restart(ar, &arg);
837 else
838 ret = ath10k_wmi_vdev_start(ar, &arg);
839
Michal Kazior72654fa2014-04-08 09:56:09 +0300840 if (ret) {
841 ath10k_warn("failed to start WMI vdev %i: %d\n",
842 arg.vdev_id, ret);
843 return ret;
844 }
845
846 ret = ath10k_vdev_setup_sync(ar);
847 if (ret) {
848 ath10k_warn("failed to synchronise setup for vdev %i: %d\n",
849 arg.vdev_id, ret);
850 return ret;
851 }
852
Michal Kaziord6500972014-04-08 09:56:09 +0300853 ar->num_started_vdevs++;
854 ath10k_recalc_radar_detection(ar);
855
Michal Kazior72654fa2014-04-08 09:56:09 +0300856 return ret;
857}
858
Michal Kaziordc55e302014-07-29 12:53:36 +0300859static int ath10k_vdev_start(struct ath10k_vif *arvif)
860{
861 return ath10k_vdev_start_restart(arvif, false);
862}
863
864static int ath10k_vdev_restart(struct ath10k_vif *arvif)
865{
866 return ath10k_vdev_start_restart(arvif, true);
867}
868
Michal Kazior72654fa2014-04-08 09:56:09 +0300869static int ath10k_vdev_stop(struct ath10k_vif *arvif)
870{
871 struct ath10k *ar = arvif->ar;
872 int ret;
873
874 lockdep_assert_held(&ar->conf_mutex);
875
876 reinit_completion(&ar->vdev_setup_done);
877
878 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
879 if (ret) {
880 ath10k_warn("failed to stop WMI vdev %i: %d\n",
881 arvif->vdev_id, ret);
882 return ret;
883 }
884
885 ret = ath10k_vdev_setup_sync(ar);
886 if (ret) {
887 ath10k_warn("failed to syncronise setup for vdev %i: %d\n",
888 arvif->vdev_id, ret);
889 return ret;
890 }
891
Michal Kaziord6500972014-04-08 09:56:09 +0300892 WARN_ON(ar->num_started_vdevs == 0);
893
894 if (ar->num_started_vdevs != 0) {
895 ar->num_started_vdevs--;
896 ath10k_recalc_radar_detection(ar);
897 }
898
Michal Kazior72654fa2014-04-08 09:56:09 +0300899 return ret;
900}
901
Kalle Valo5e3dd152013-06-12 20:52:10 +0300902static void ath10k_control_beaconing(struct ath10k_vif *arvif,
903 struct ieee80211_bss_conf *info)
904{
905 int ret = 0;
906
Michal Kazior548db542013-07-05 16:15:15 +0300907 lockdep_assert_held(&arvif->ar->conf_mutex);
908
Kalle Valo5e3dd152013-06-12 20:52:10 +0300909 if (!info->enable_beacon) {
910 ath10k_vdev_stop(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +0100911
912 arvif->is_started = false;
913 arvif->is_up = false;
914
Michal Kazior748afc42014-01-23 12:48:21 +0100915 spin_lock_bh(&arvif->ar->data_lock);
916 if (arvif->beacon) {
Michal Kazior767d34f2014-02-27 18:50:03 +0200917 dma_unmap_single(arvif->ar->dev,
918 ATH10K_SKB_CB(arvif->beacon)->paddr,
919 arvif->beacon->len, DMA_TO_DEVICE);
Michal Kazior748afc42014-01-23 12:48:21 +0100920 dev_kfree_skb_any(arvif->beacon);
921
922 arvif->beacon = NULL;
923 arvif->beacon_sent = false;
924 }
925 spin_unlock_bh(&arvif->ar->data_lock);
926
Kalle Valo5e3dd152013-06-12 20:52:10 +0300927 return;
928 }
929
930 arvif->tx_seq_no = 0x1000;
931
932 ret = ath10k_vdev_start(arvif);
933 if (ret)
934 return;
935
Michal Kaziorc930f742014-01-23 11:38:25 +0100936 arvif->aid = 0;
937 memcpy(arvif->bssid, info->bssid, ETH_ALEN);
938
939 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
940 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300941 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200942 ath10k_warn("failed to bring up vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200943 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +0100944 ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300945 return;
946 }
Michal Kaziorc930f742014-01-23 11:38:25 +0100947
948 arvif->is_started = true;
949 arvif->is_up = true;
950
Kalle Valo60c3daa2013-09-08 17:56:07 +0300951 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300952}
953
954static void ath10k_control_ibss(struct ath10k_vif *arvif,
955 struct ieee80211_bss_conf *info,
956 const u8 self_peer[ETH_ALEN])
957{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200958 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300959 int ret = 0;
960
Michal Kazior548db542013-07-05 16:15:15 +0300961 lockdep_assert_held(&arvif->ar->conf_mutex);
962
Kalle Valo5e3dd152013-06-12 20:52:10 +0300963 if (!info->ibss_joined) {
964 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
965 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +0200966 ath10k_warn("failed to delete IBSS self peer %pM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300967 self_peer, arvif->vdev_id, ret);
968
Michal Kaziorc930f742014-01-23 11:38:25 +0100969 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +0300970 return;
971
972 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id,
Michal Kaziorc930f742014-01-23 11:38:25 +0100973 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300974 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200975 ath10k_warn("failed to delete IBSS BSSID peer %pM for vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +0100976 arvif->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300977 return;
978 }
979
Michal Kaziorc930f742014-01-23 11:38:25 +0100980 memset(arvif->bssid, 0, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300981
982 return;
983 }
984
985 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
986 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200987 ath10k_warn("failed to create IBSS self peer %pM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300988 self_peer, arvif->vdev_id, ret);
989 return;
990 }
991
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200992 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
993 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +0300994 ATH10K_DEFAULT_ATIM);
995 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +0200996 ath10k_warn("failed to set IBSS ATIM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300997 arvif->vdev_id, ret);
998}
999
1000/*
1001 * Review this when mac80211 gains per-interface powersave support.
1002 */
Michal Kaziorad088bf2013-10-16 15:44:46 +03001003static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001004{
Michal Kaziorad088bf2013-10-16 15:44:46 +03001005 struct ath10k *ar = arvif->ar;
1006 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001007 enum wmi_sta_powersave_param param;
1008 enum wmi_sta_ps_mode psmode;
1009 int ret;
1010
Michal Kazior548db542013-07-05 16:15:15 +03001011 lockdep_assert_held(&arvif->ar->conf_mutex);
1012
Michal Kaziorad088bf2013-10-16 15:44:46 +03001013 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1014 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001015
1016 if (conf->flags & IEEE80211_CONF_PS) {
1017 psmode = WMI_STA_PS_MODE_ENABLED;
1018 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1019
Michal Kaziorad088bf2013-10-16 15:44:46 +03001020 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001021 conf->dynamic_ps_timeout);
1022 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001023 ath10k_warn("failed to set inactivity time for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001024 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001025 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001026 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001027 } else {
1028 psmode = WMI_STA_PS_MODE_DISABLED;
1029 }
1030
Kalle Valo60c3daa2013-09-08 17:56:07 +03001031 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
1032 arvif->vdev_id, psmode ? "enable" : "disable");
1033
Michal Kaziorad088bf2013-10-16 15:44:46 +03001034 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1035 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001036 ath10k_warn("failed to set PS Mode %d for vdev %d: %d\n",
1037 psmode, arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001038 return ret;
1039 }
1040
1041 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001042}
1043
1044/**********************/
1045/* Station management */
1046/**********************/
1047
1048static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
1049 struct ath10k_vif *arvif,
1050 struct ieee80211_sta *sta,
1051 struct ieee80211_bss_conf *bss_conf,
1052 struct wmi_peer_assoc_complete_arg *arg)
1053{
Michal Kazior548db542013-07-05 16:15:15 +03001054 lockdep_assert_held(&ar->conf_mutex);
1055
Kalle Valo5e3dd152013-06-12 20:52:10 +03001056 memcpy(arg->addr, sta->addr, ETH_ALEN);
1057 arg->vdev_id = arvif->vdev_id;
1058 arg->peer_aid = sta->aid;
1059 arg->peer_flags |= WMI_PEER_AUTH;
1060
1061 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
1062 /*
1063 * Seems FW have problems with Power Save in STA
1064 * mode when we setup this parameter to high (eg. 5).
1065 * Often we see that FW don't send NULL (with clean P flags)
1066 * frame even there is info about buffered frames in beacons.
1067 * Sometimes we have to wait more than 10 seconds before FW
1068 * will wakeup. Often sending one ping from AP to our device
1069 * just fail (more than 50%).
1070 *
1071 * Seems setting this FW parameter to 1 couse FW
1072 * will check every beacon and will wakup immediately
1073 * after detection buffered data.
1074 */
1075 arg->peer_listen_intval = 1;
1076 else
1077 arg->peer_listen_intval = ar->hw->conf.listen_interval;
1078
1079 arg->peer_num_spatial_streams = 1;
1080
1081 /*
1082 * The assoc capabilities are available only in managed mode.
1083 */
1084 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && bss_conf)
1085 arg->peer_caps = bss_conf->assoc_capability;
1086}
1087
1088static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1089 struct ath10k_vif *arvif,
1090 struct wmi_peer_assoc_complete_arg *arg)
1091{
1092 struct ieee80211_vif *vif = arvif->vif;
1093 struct ieee80211_bss_conf *info = &vif->bss_conf;
1094 struct cfg80211_bss *bss;
1095 const u8 *rsnie = NULL;
1096 const u8 *wpaie = NULL;
1097
Michal Kazior548db542013-07-05 16:15:15 +03001098 lockdep_assert_held(&ar->conf_mutex);
1099
Kalle Valo5e3dd152013-06-12 20:52:10 +03001100 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1101 info->bssid, NULL, 0, 0, 0);
1102 if (bss) {
1103 const struct cfg80211_bss_ies *ies;
1104
1105 rcu_read_lock();
1106 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1107
1108 ies = rcu_dereference(bss->ies);
1109
1110 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1111 WLAN_OUI_TYPE_MICROSOFT_WPA,
1112 ies->data,
1113 ies->len);
1114 rcu_read_unlock();
1115 cfg80211_put_bss(ar->hw->wiphy, bss);
1116 }
1117
1118 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1119 if (rsnie || wpaie) {
1120 ath10k_dbg(ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
1121 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1122 }
1123
1124 if (wpaie) {
1125 ath10k_dbg(ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
1126 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1127 }
1128}
1129
1130static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
1131 struct ieee80211_sta *sta,
1132 struct wmi_peer_assoc_complete_arg *arg)
1133{
1134 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1135 const struct ieee80211_supported_band *sband;
1136 const struct ieee80211_rate *rates;
1137 u32 ratemask;
1138 int i;
1139
Michal Kazior548db542013-07-05 16:15:15 +03001140 lockdep_assert_held(&ar->conf_mutex);
1141
Kalle Valo5e3dd152013-06-12 20:52:10 +03001142 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1143 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1144 rates = sband->bitrates;
1145
1146 rateset->num_rates = 0;
1147
1148 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1149 if (!(ratemask & 1))
1150 continue;
1151
1152 rateset->rates[rateset->num_rates] = rates->hw_value;
1153 rateset->num_rates++;
1154 }
1155}
1156
1157static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1158 struct ieee80211_sta *sta,
1159 struct wmi_peer_assoc_complete_arg *arg)
1160{
1161 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001162 int i, n;
1163
Michal Kazior548db542013-07-05 16:15:15 +03001164 lockdep_assert_held(&ar->conf_mutex);
1165
Kalle Valo5e3dd152013-06-12 20:52:10 +03001166 if (!ht_cap->ht_supported)
1167 return;
1168
1169 arg->peer_flags |= WMI_PEER_HT;
1170 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1171 ht_cap->ampdu_factor)) - 1;
1172
1173 arg->peer_mpdu_density =
1174 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1175
1176 arg->peer_ht_caps = ht_cap->cap;
1177 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1178
1179 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1180 arg->peer_flags |= WMI_PEER_LDPC;
1181
1182 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1183 arg->peer_flags |= WMI_PEER_40MHZ;
1184 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1185 }
1186
1187 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1188 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1189
1190 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1191 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1192
1193 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1194 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1195 arg->peer_flags |= WMI_PEER_STBC;
1196 }
1197
1198 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1199 u32 stbc;
1200 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1201 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1202 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1203 arg->peer_rate_caps |= stbc;
1204 arg->peer_flags |= WMI_PEER_STBC;
1205 }
1206
Kalle Valo5e3dd152013-06-12 20:52:10 +03001207 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1208 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1209 else if (ht_cap->mcs.rx_mask[1])
1210 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1211
1212 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1213 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1214 arg->peer_ht_rates.rates[n++] = i;
1215
Bartosz Markowskifd71f802014-02-10 13:12:55 +01001216 /*
1217 * This is a workaround for HT-enabled STAs which break the spec
1218 * and have no HT capabilities RX mask (no HT RX MCS map).
1219 *
1220 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1221 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1222 *
1223 * Firmware asserts if such situation occurs.
1224 */
1225 if (n == 0) {
1226 arg->peer_ht_rates.num_rates = 8;
1227 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1228 arg->peer_ht_rates.rates[i] = i;
1229 } else {
1230 arg->peer_ht_rates.num_rates = n;
1231 arg->peer_num_spatial_streams = sta->rx_nss;
1232 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001233
Kalle Valo60c3daa2013-09-08 17:56:07 +03001234 ath10k_dbg(ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1235 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001236 arg->peer_ht_rates.num_rates,
1237 arg->peer_num_spatial_streams);
1238}
1239
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001240static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1241 struct ath10k_vif *arvif,
1242 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001243{
1244 u32 uapsd = 0;
1245 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001246 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001247
Michal Kazior548db542013-07-05 16:15:15 +03001248 lockdep_assert_held(&ar->conf_mutex);
1249
Kalle Valo5e3dd152013-06-12 20:52:10 +03001250 if (sta->wme && sta->uapsd_queues) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03001251 ath10k_dbg(ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001252 sta->uapsd_queues, sta->max_sp);
1253
Kalle Valo5e3dd152013-06-12 20:52:10 +03001254 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1255 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1256 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1257 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1258 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1259 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1260 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1261 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1262 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1263 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1264 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1265 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1266
1267
1268 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1269 max_sp = sta->max_sp;
1270
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001271 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1272 sta->addr,
1273 WMI_AP_PS_PEER_PARAM_UAPSD,
1274 uapsd);
1275 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001276 ath10k_warn("failed to set ap ps peer param uapsd for vdev %i: %d\n",
1277 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001278 return ret;
1279 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001280
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001281 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1282 sta->addr,
1283 WMI_AP_PS_PEER_PARAM_MAX_SP,
1284 max_sp);
1285 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001286 ath10k_warn("failed to set ap ps peer param max sp for vdev %i: %d\n",
1287 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001288 return ret;
1289 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001290
1291 /* TODO setup this based on STA listen interval and
1292 beacon interval. Currently we don't know
1293 sta->listen_interval - mac80211 patch required.
1294 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001295 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
1296 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME, 10);
1297 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001298 ath10k_warn("failed to set ap ps peer param ageout time for vdev %i: %d\n",
1299 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001300 return ret;
1301 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001302 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001303
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001304 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001305}
1306
1307static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1308 struct ieee80211_sta *sta,
1309 struct wmi_peer_assoc_complete_arg *arg)
1310{
1311 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001312 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001313
1314 if (!vht_cap->vht_supported)
1315 return;
1316
1317 arg->peer_flags |= WMI_PEER_VHT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001318 arg->peer_vht_caps = vht_cap->cap;
1319
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001320
1321 ampdu_factor = (vht_cap->cap &
1322 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1323 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1324
1325 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1326 * zero in VHT IE. Using it would result in degraded throughput.
1327 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1328 * it if VHT max_mpdu is smaller. */
1329 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1330 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1331 ampdu_factor)) - 1);
1332
Kalle Valo5e3dd152013-06-12 20:52:10 +03001333 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1334 arg->peer_flags |= WMI_PEER_80MHZ;
1335
1336 arg->peer_vht_rates.rx_max_rate =
1337 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1338 arg->peer_vht_rates.rx_mcs_set =
1339 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1340 arg->peer_vht_rates.tx_max_rate =
1341 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1342 arg->peer_vht_rates.tx_mcs_set =
1343 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1344
Kalle Valo60c3daa2013-09-08 17:56:07 +03001345 ath10k_dbg(ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1346 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001347}
1348
1349static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1350 struct ath10k_vif *arvif,
1351 struct ieee80211_sta *sta,
1352 struct ieee80211_bss_conf *bss_conf,
1353 struct wmi_peer_assoc_complete_arg *arg)
1354{
1355 switch (arvif->vdev_type) {
1356 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001357 if (sta->wme)
1358 arg->peer_flags |= WMI_PEER_QOS;
1359
1360 if (sta->wme && sta->uapsd_queues) {
1361 arg->peer_flags |= WMI_PEER_APSD;
1362 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1363 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001364 break;
1365 case WMI_VDEV_TYPE_STA:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001366 if (bss_conf->qos)
1367 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001368 break;
1369 default:
1370 break;
1371 }
1372}
1373
1374static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1375 struct ath10k_vif *arvif,
1376 struct ieee80211_sta *sta,
1377 struct wmi_peer_assoc_complete_arg *arg)
1378{
1379 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1380
Kalle Valo5e3dd152013-06-12 20:52:10 +03001381 switch (ar->hw->conf.chandef.chan->band) {
1382 case IEEE80211_BAND_2GHZ:
1383 if (sta->ht_cap.ht_supported) {
1384 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1385 phymode = MODE_11NG_HT40;
1386 else
1387 phymode = MODE_11NG_HT20;
1388 } else {
1389 phymode = MODE_11G;
1390 }
1391
1392 break;
1393 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03001394 /*
1395 * Check VHT first.
1396 */
1397 if (sta->vht_cap.vht_supported) {
1398 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1399 phymode = MODE_11AC_VHT80;
1400 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1401 phymode = MODE_11AC_VHT40;
1402 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1403 phymode = MODE_11AC_VHT20;
1404 } else if (sta->ht_cap.ht_supported) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001405 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1406 phymode = MODE_11NA_HT40;
1407 else
1408 phymode = MODE_11NA_HT20;
1409 } else {
1410 phymode = MODE_11A;
1411 }
1412
1413 break;
1414 default:
1415 break;
1416 }
1417
Kalle Valo38a1d472013-09-08 17:56:14 +03001418 ath10k_dbg(ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1419 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03001420
Kalle Valo5e3dd152013-06-12 20:52:10 +03001421 arg->peer_phymode = phymode;
1422 WARN_ON(phymode == MODE_UNKNOWN);
1423}
1424
Kalle Valob9ada652013-10-16 15:44:46 +03001425static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1426 struct ath10k_vif *arvif,
1427 struct ieee80211_sta *sta,
1428 struct ieee80211_bss_conf *bss_conf,
1429 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001430{
Michal Kazior548db542013-07-05 16:15:15 +03001431 lockdep_assert_held(&ar->conf_mutex);
1432
Kalle Valob9ada652013-10-16 15:44:46 +03001433 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03001434
Kalle Valob9ada652013-10-16 15:44:46 +03001435 ath10k_peer_assoc_h_basic(ar, arvif, sta, bss_conf, arg);
1436 ath10k_peer_assoc_h_crypto(ar, arvif, arg);
1437 ath10k_peer_assoc_h_rates(ar, sta, arg);
1438 ath10k_peer_assoc_h_ht(ar, sta, arg);
1439 ath10k_peer_assoc_h_vht(ar, sta, arg);
1440 ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, arg);
1441 ath10k_peer_assoc_h_phymode(ar, arvif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001442
Kalle Valob9ada652013-10-16 15:44:46 +03001443 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001444}
1445
Michal Kazior90046f52014-02-14 14:45:51 +01001446static const u32 ath10k_smps_map[] = {
1447 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
1448 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
1449 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
1450 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
1451};
1452
1453static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1454 const u8 *addr,
1455 const struct ieee80211_sta_ht_cap *ht_cap)
1456{
1457 int smps;
1458
1459 if (!ht_cap->ht_supported)
1460 return 0;
1461
1462 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1463 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1464
1465 if (smps >= ARRAY_SIZE(ath10k_smps_map))
1466 return -EINVAL;
1467
1468 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
1469 WMI_PEER_SMPS_STATE,
1470 ath10k_smps_map[smps]);
1471}
1472
Kalle Valo5e3dd152013-06-12 20:52:10 +03001473/* can be called only in mac80211 callbacks due to `key_count` usage */
1474static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1475 struct ieee80211_vif *vif,
1476 struct ieee80211_bss_conf *bss_conf)
1477{
1478 struct ath10k *ar = hw->priv;
1479 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01001480 struct ieee80211_sta_ht_cap ht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03001481 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001482 struct ieee80211_sta *ap_sta;
1483 int ret;
1484
Michal Kazior548db542013-07-05 16:15:15 +03001485 lockdep_assert_held(&ar->conf_mutex);
1486
Kalle Valo5e3dd152013-06-12 20:52:10 +03001487 rcu_read_lock();
1488
1489 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1490 if (!ap_sta) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001491 ath10k_warn("failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001492 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001493 rcu_read_unlock();
1494 return;
1495 }
1496
Michal Kazior90046f52014-02-14 14:45:51 +01001497 /* ap_sta must be accessed only within rcu section which must be left
1498 * before calling ath10k_setup_peer_smps() which might sleep. */
1499 ht_cap = ap_sta->ht_cap;
1500
Kalle Valob9ada652013-10-16 15:44:46 +03001501 ret = ath10k_peer_assoc_prepare(ar, arvif, ap_sta,
1502 bss_conf, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001503 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001504 ath10k_warn("failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001505 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001506 rcu_read_unlock();
1507 return;
1508 }
1509
1510 rcu_read_unlock();
1511
Kalle Valob9ada652013-10-16 15:44:46 +03001512 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1513 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001514 ath10k_warn("failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001515 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001516 return;
1517 }
1518
Michal Kazior90046f52014-02-14 14:45:51 +01001519 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
1520 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001521 ath10k_warn("failed to setup peer SMPS for vdev %i: %d\n",
1522 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01001523 return;
1524 }
1525
Kalle Valo60c3daa2013-09-08 17:56:07 +03001526 ath10k_dbg(ATH10K_DBG_MAC,
1527 "mac vdev %d up (associated) bssid %pM aid %d\n",
1528 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1529
Michal Kaziorc930f742014-01-23 11:38:25 +01001530 arvif->aid = bss_conf->aid;
1531 memcpy(arvif->bssid, bss_conf->bssid, ETH_ALEN);
1532
1533 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1534 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001535 ath10k_warn("failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001536 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001537 return;
1538 }
1539
1540 arvif->is_up = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001541}
1542
1543/*
1544 * FIXME: flush TIDs
1545 */
1546static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1547 struct ieee80211_vif *vif)
1548{
1549 struct ath10k *ar = hw->priv;
1550 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1551 int ret;
1552
Michal Kazior548db542013-07-05 16:15:15 +03001553 lockdep_assert_held(&ar->conf_mutex);
1554
Kalle Valo5e3dd152013-06-12 20:52:10 +03001555 /*
1556 * For some reason, calling VDEV-DOWN before VDEV-STOP
1557 * makes the FW to send frames via HTT after disassociation.
1558 * No idea why this happens, even though VDEV-DOWN is supposed
1559 * to be analogous to link down, so just stop the VDEV.
1560 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03001561 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d stop (disassociated\n",
1562 arvif->vdev_id);
1563
1564 /* FIXME: check return value */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001565 ret = ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001566
1567 /*
1568 * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1569 * report beacons from previously associated network through HTT.
1570 * This in turn would spam mac80211 WARN_ON if we bring down all
1571 * interfaces as it expects there is no rx when no interface is
1572 * running.
1573 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03001574 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d down\n", arvif->vdev_id);
1575
1576 /* FIXME: why don't we print error if wmi call fails? */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001577 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001578
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001579 arvif->def_wep_key_idx = 0;
Michal Kaziorc930f742014-01-23 11:38:25 +01001580
1581 arvif->is_started = false;
1582 arvif->is_up = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001583}
1584
1585static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02001586 struct ieee80211_sta *sta, bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001587{
Kalle Valob9ada652013-10-16 15:44:46 +03001588 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001589 int ret = 0;
1590
Michal Kazior548db542013-07-05 16:15:15 +03001591 lockdep_assert_held(&ar->conf_mutex);
1592
Kalle Valob9ada652013-10-16 15:44:46 +03001593 ret = ath10k_peer_assoc_prepare(ar, arvif, sta, NULL, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001594 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001595 ath10k_warn("failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001596 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001597 return ret;
1598 }
1599
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02001600 peer_arg.peer_reassoc = reassoc;
Kalle Valob9ada652013-10-16 15:44:46 +03001601 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1602 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001603 ath10k_warn("failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001604 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001605 return ret;
1606 }
1607
Michal Kazior90046f52014-02-14 14:45:51 +01001608 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr, &sta->ht_cap);
1609 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001610 ath10k_warn("failed to setup peer SMPS for vdev %d: %d\n",
1611 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01001612 return ret;
1613 }
1614
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001615 if (!sta->wme) {
1616 arvif->num_legacy_stations++;
1617 ret = ath10k_recalc_rtscts_prot(arvif);
1618 if (ret) {
1619 ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
1620 arvif->vdev_id, ret);
1621 return ret;
1622 }
1623 }
1624
Kalle Valo5e3dd152013-06-12 20:52:10 +03001625 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1626 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001627 ath10k_warn("failed to install peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001628 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001629 return ret;
1630 }
1631
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001632 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
1633 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001634 ath10k_warn("failed to set qos params for STA %pM for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001635 sta->addr, arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001636 return ret;
1637 }
1638
Kalle Valo5e3dd152013-06-12 20:52:10 +03001639 return ret;
1640}
1641
1642static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
1643 struct ieee80211_sta *sta)
1644{
1645 int ret = 0;
1646
Michal Kazior548db542013-07-05 16:15:15 +03001647 lockdep_assert_held(&ar->conf_mutex);
1648
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001649 if (!sta->wme) {
1650 arvif->num_legacy_stations--;
1651 ret = ath10k_recalc_rtscts_prot(arvif);
1652 if (ret) {
1653 ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
1654 arvif->vdev_id, ret);
1655 return ret;
1656 }
1657 }
1658
Kalle Valo5e3dd152013-06-12 20:52:10 +03001659 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1660 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001661 ath10k_warn("failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001662 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001663 return ret;
1664 }
1665
1666 return ret;
1667}
1668
1669/**************/
1670/* Regulatory */
1671/**************/
1672
1673static int ath10k_update_channel_list(struct ath10k *ar)
1674{
1675 struct ieee80211_hw *hw = ar->hw;
1676 struct ieee80211_supported_band **bands;
1677 enum ieee80211_band band;
1678 struct ieee80211_channel *channel;
1679 struct wmi_scan_chan_list_arg arg = {0};
1680 struct wmi_channel_arg *ch;
1681 bool passive;
1682 int len;
1683 int ret;
1684 int i;
1685
Michal Kazior548db542013-07-05 16:15:15 +03001686 lockdep_assert_held(&ar->conf_mutex);
1687
Kalle Valo5e3dd152013-06-12 20:52:10 +03001688 bands = hw->wiphy->bands;
1689 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1690 if (!bands[band])
1691 continue;
1692
1693 for (i = 0; i < bands[band]->n_channels; i++) {
1694 if (bands[band]->channels[i].flags &
1695 IEEE80211_CHAN_DISABLED)
1696 continue;
1697
1698 arg.n_channels++;
1699 }
1700 }
1701
1702 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1703 arg.channels = kzalloc(len, GFP_KERNEL);
1704 if (!arg.channels)
1705 return -ENOMEM;
1706
1707 ch = arg.channels;
1708 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1709 if (!bands[band])
1710 continue;
1711
1712 for (i = 0; i < bands[band]->n_channels; i++) {
1713 channel = &bands[band]->channels[i];
1714
1715 if (channel->flags & IEEE80211_CHAN_DISABLED)
1716 continue;
1717
1718 ch->allow_ht = true;
1719
1720 /* FIXME: when should we really allow VHT? */
1721 ch->allow_vht = true;
1722
1723 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001724 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001725
1726 ch->ht40plus =
1727 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1728
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001729 ch->chan_radar =
1730 !!(channel->flags & IEEE80211_CHAN_RADAR);
1731
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001732 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001733 ch->passive = passive;
1734
1735 ch->freq = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07001736 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07001737 ch->max_power = channel->max_power * 2;
1738 ch->max_reg_power = channel->max_reg_power * 2;
1739 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001740 ch->reg_class_id = 0; /* FIXME */
1741
1742 /* FIXME: why use only legacy modes, why not any
1743 * HT/VHT modes? Would that even make any
1744 * difference? */
1745 if (channel->band == IEEE80211_BAND_2GHZ)
1746 ch->mode = MODE_11G;
1747 else
1748 ch->mode = MODE_11A;
1749
1750 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1751 continue;
1752
1753 ath10k_dbg(ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03001754 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1755 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001756 ch->freq, ch->max_power, ch->max_reg_power,
1757 ch->max_antenna_gain, ch->mode);
1758
1759 ch++;
1760 }
1761 }
1762
1763 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1764 kfree(arg.channels);
1765
1766 return ret;
1767}
1768
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001769static enum wmi_dfs_region
1770ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
1771{
1772 switch (dfs_region) {
1773 case NL80211_DFS_UNSET:
1774 return WMI_UNINIT_DFS_DOMAIN;
1775 case NL80211_DFS_FCC:
1776 return WMI_FCC_DFS_DOMAIN;
1777 case NL80211_DFS_ETSI:
1778 return WMI_ETSI_DFS_DOMAIN;
1779 case NL80211_DFS_JP:
1780 return WMI_MKK4_DFS_DOMAIN;
1781 }
1782 return WMI_UNINIT_DFS_DOMAIN;
1783}
1784
Michal Kaziorf7843d72013-07-16 09:38:52 +02001785static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001786{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001787 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001788 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001789 enum wmi_dfs_region wmi_dfs_reg;
1790 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001791
Michal Kaziorf7843d72013-07-16 09:38:52 +02001792 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001793
1794 ret = ath10k_update_channel_list(ar);
1795 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02001796 ath10k_warn("failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001797
1798 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001799
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001800 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1801 nl_dfs_reg = ar->dfs_detector->region;
1802 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
1803 } else {
1804 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
1805 }
1806
Kalle Valo5e3dd152013-06-12 20:52:10 +03001807 /* Target allows setting up per-band regdomain but ath_common provides
1808 * a combined one only */
1809 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02001810 regpair->reg_domain,
1811 regpair->reg_domain, /* 2ghz */
1812 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001813 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001814 regpair->reg_5ghz_ctl,
1815 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001816 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02001817 ath10k_warn("failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02001818}
Michal Kazior548db542013-07-05 16:15:15 +03001819
Michal Kaziorf7843d72013-07-16 09:38:52 +02001820static void ath10k_reg_notifier(struct wiphy *wiphy,
1821 struct regulatory_request *request)
1822{
1823 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1824 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001825 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001826
1827 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1828
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001829 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1830 ath10k_dbg(ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
1831 request->dfs_region);
1832 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1833 request->dfs_region);
1834 if (!result)
Kalle Valobe6546f2014-03-25 14:18:51 +02001835 ath10k_warn("DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001836 request->dfs_region);
1837 }
1838
Michal Kaziorf7843d72013-07-16 09:38:52 +02001839 mutex_lock(&ar->conf_mutex);
1840 if (ar->state == ATH10K_STATE_ON)
1841 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03001842 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001843}
1844
1845/***************/
1846/* TX handlers */
1847/***************/
1848
Michal Kazior42c3aa62013-10-02 11:03:38 +02001849static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1850{
1851 if (ieee80211_is_mgmt(hdr->frame_control))
1852 return HTT_DATA_TX_EXT_TID_MGMT;
1853
1854 if (!ieee80211_is_data_qos(hdr->frame_control))
1855 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1856
1857 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1858 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1859
1860 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1861}
1862
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001863static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar,
1864 struct ieee80211_tx_info *info)
1865{
1866 if (info->control.vif)
1867 return ath10k_vif_to_arvif(info->control.vif)->vdev_id;
1868
Michal Kazior1bbc0972014-04-08 09:45:47 +03001869 if (ar->monitor_started)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001870 return ar->monitor_vdev_id;
1871
Kalle Valobe6546f2014-03-25 14:18:51 +02001872 ath10k_warn("failed to resolve vdev id\n");
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001873 return 0;
1874}
1875
Michal Kazior4b604552014-07-21 21:03:09 +03001876/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
1877 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03001878 */
Michal Kazior4b604552014-07-21 21:03:09 +03001879static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001880{
1881 struct ieee80211_hdr *hdr = (void *)skb->data;
Michal Kaziorc21c64d2014-07-21 21:03:10 +03001882 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001883 u8 *qos_ctl;
1884
1885 if (!ieee80211_is_data_qos(hdr->frame_control))
1886 return;
1887
1888 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02001889 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1890 skb->data, (void *)qos_ctl - (void *)skb->data);
1891 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Michal Kaziorc21c64d2014-07-21 21:03:10 +03001892
1893 /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc
1894 * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are
1895 * used only for CQM purposes (e.g. hostapd station keepalive ping) so
1896 * it is safe to downgrade to NullFunc.
1897 */
1898 if (ieee80211_is_qos_nullfunc(hdr->frame_control)) {
1899 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
1900 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1901 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001902}
1903
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001904static void ath10k_tx_wep_key_work(struct work_struct *work)
1905{
1906 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1907 wep_key_work);
1908 int ret, keyidx = arvif->def_wep_key_newidx;
1909
Michal Kazior911e6c02014-05-26 12:46:03 +03001910 mutex_lock(&arvif->ar->conf_mutex);
1911
1912 if (arvif->ar->state != ATH10K_STATE_ON)
1913 goto unlock;
1914
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001915 if (arvif->def_wep_key_idx == keyidx)
Michal Kazior911e6c02014-05-26 12:46:03 +03001916 goto unlock;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001917
1918 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
1919 arvif->vdev_id, keyidx);
1920
1921 ret = ath10k_wmi_vdev_set_param(arvif->ar,
1922 arvif->vdev_id,
1923 arvif->ar->wmi.vdev_param->def_keyid,
1924 keyidx);
1925 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001926 ath10k_warn("failed to update wep key index for vdev %d: %d\n",
1927 arvif->vdev_id,
1928 ret);
Michal Kazior911e6c02014-05-26 12:46:03 +03001929 goto unlock;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001930 }
1931
1932 arvif->def_wep_key_idx = keyidx;
Michal Kazior911e6c02014-05-26 12:46:03 +03001933
1934unlock:
1935 mutex_unlock(&arvif->ar->conf_mutex);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001936}
1937
Michal Kazior4b604552014-07-21 21:03:09 +03001938static void ath10k_tx_h_update_wep_key(struct ieee80211_vif *vif,
1939 struct ieee80211_key_conf *key,
1940 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001941{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001942 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1943 struct ath10k *ar = arvif->ar;
1944 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001945
Kalle Valo5e3dd152013-06-12 20:52:10 +03001946 if (!ieee80211_has_protected(hdr->frame_control))
1947 return;
1948
1949 if (!key)
1950 return;
1951
1952 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1953 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1954 return;
1955
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001956 if (key->keyidx == arvif->def_wep_key_idx)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001957 return;
1958
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001959 /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1960 * queueing frames until key index is updated is not an option because
1961 * sk_buff may need more processing to be done, e.g. offchannel */
1962 arvif->def_wep_key_newidx = key->keyidx;
1963 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001964}
1965
Michal Kazior4b604552014-07-21 21:03:09 +03001966static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
1967 struct ieee80211_vif *vif,
1968 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001969{
1970 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001971 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1972
1973 /* This is case only for P2P_GO */
1974 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1975 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1976 return;
1977
1978 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1979 spin_lock_bh(&ar->data_lock);
1980 if (arvif->u.ap.noa_data)
1981 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
1982 GFP_ATOMIC))
1983 memcpy(skb_put(skb, arvif->u.ap.noa_len),
1984 arvif->u.ap.noa_data,
1985 arvif->u.ap.noa_len);
1986 spin_unlock_bh(&ar->data_lock);
1987 }
1988}
1989
1990static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
1991{
1992 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001993 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001994
Michal Kazior961d4c32013-08-09 10:13:34 +02001995 if (ar->htt.target_version_major >= 3) {
1996 /* Since HTT 3.0 there is no separate mgmt tx command */
1997 ret = ath10k_htt_tx(&ar->htt, skb);
1998 goto exit;
1999 }
2000
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002001 if (ieee80211_is_mgmt(hdr->frame_control)) {
2002 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2003 ar->fw_features)) {
2004 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
2005 ATH10K_MAX_NUM_MGMT_PENDING) {
Ben Greearf2bc4d22014-08-12 11:02:20 +03002006 ath10k_warn("reached WMI management transmit queue limit\n");
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002007 ret = -EBUSY;
2008 goto exit;
2009 }
2010
2011 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
2012 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
2013 } else {
2014 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
2015 }
2016 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
2017 ar->fw_features) &&
2018 ieee80211_is_nullfunc(hdr->frame_control)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002019 /* FW does not report tx status properly for NullFunc frames
2020 * unless they are sent through mgmt tx path. mac80211 sends
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002021 * those frames when it detects link/beacon loss and depends
2022 * on the tx status to be correct. */
Michal Kazioredb82362013-07-05 16:15:14 +03002023 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002024 } else {
Michal Kazioredb82362013-07-05 16:15:14 +03002025 ret = ath10k_htt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002026 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002027
Michal Kazior961d4c32013-08-09 10:13:34 +02002028exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03002029 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002030 ath10k_warn("failed to transmit packet, dropping: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002031 ieee80211_free_txskb(ar->hw, skb);
2032 }
2033}
2034
2035void ath10k_offchan_tx_purge(struct ath10k *ar)
2036{
2037 struct sk_buff *skb;
2038
2039 for (;;) {
2040 skb = skb_dequeue(&ar->offchan_tx_queue);
2041 if (!skb)
2042 break;
2043
2044 ieee80211_free_txskb(ar->hw, skb);
2045 }
2046}
2047
2048void ath10k_offchan_tx_work(struct work_struct *work)
2049{
2050 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
2051 struct ath10k_peer *peer;
2052 struct ieee80211_hdr *hdr;
2053 struct sk_buff *skb;
2054 const u8 *peer_addr;
2055 int vdev_id;
2056 int ret;
2057
2058 /* FW requirement: We must create a peer before FW will send out
2059 * an offchannel frame. Otherwise the frame will be stuck and
2060 * never transmitted. We delete the peer upon tx completion.
2061 * It is unlikely that a peer for offchannel tx will already be
2062 * present. However it may be in some rare cases so account for that.
2063 * Otherwise we might remove a legitimate peer and break stuff. */
2064
2065 for (;;) {
2066 skb = skb_dequeue(&ar->offchan_tx_queue);
2067 if (!skb)
2068 break;
2069
2070 mutex_lock(&ar->conf_mutex);
2071
Kalle Valo60c3daa2013-09-08 17:56:07 +03002072 ath10k_dbg(ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002073 skb);
2074
2075 hdr = (struct ieee80211_hdr *)skb->data;
2076 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002077 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002078
2079 spin_lock_bh(&ar->data_lock);
2080 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
2081 spin_unlock_bh(&ar->data_lock);
2082
2083 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03002084 /* FIXME: should this use ath10k_warn()? */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002085 ath10k_dbg(ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
2086 peer_addr, vdev_id);
2087
2088 if (!peer) {
2089 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
2090 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002091 ath10k_warn("failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002092 peer_addr, vdev_id, ret);
2093 }
2094
2095 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08002096 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002097 ar->offchan_tx_skb = skb;
2098 spin_unlock_bh(&ar->data_lock);
2099
2100 ath10k_tx_htt(ar, skb);
2101
2102 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
2103 3 * HZ);
2104 if (ret <= 0)
2105 ath10k_warn("timed out waiting for offchannel skb %p\n",
2106 skb);
2107
2108 if (!peer) {
2109 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
2110 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002111 ath10k_warn("failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002112 peer_addr, vdev_id, ret);
2113 }
2114
2115 mutex_unlock(&ar->conf_mutex);
2116 }
2117}
2118
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002119void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
2120{
2121 struct sk_buff *skb;
2122
2123 for (;;) {
2124 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2125 if (!skb)
2126 break;
2127
2128 ieee80211_free_txskb(ar->hw, skb);
2129 }
2130}
2131
2132void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
2133{
2134 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
2135 struct sk_buff *skb;
2136 int ret;
2137
2138 for (;;) {
2139 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2140 if (!skb)
2141 break;
2142
2143 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002144 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002145 ath10k_warn("failed to transmit management frame via WMI: %d\n",
2146 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002147 ieee80211_free_txskb(ar->hw, skb);
2148 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002149 }
2150}
2151
Kalle Valo5e3dd152013-06-12 20:52:10 +03002152/************/
2153/* Scanning */
2154/************/
2155
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002156void __ath10k_scan_finish(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002157{
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002158 lockdep_assert_held(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002159
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002160 switch (ar->scan.state) {
2161 case ATH10K_SCAN_IDLE:
2162 break;
2163 case ATH10K_SCAN_RUNNING:
2164 case ATH10K_SCAN_ABORTING:
2165 if (ar->scan.is_roc)
2166 ieee80211_remain_on_channel_expired(ar->hw);
2167 else
2168 ieee80211_scan_completed(ar->hw,
2169 (ar->scan.state ==
2170 ATH10K_SCAN_ABORTING));
2171 /* fall through */
2172 case ATH10K_SCAN_STARTING:
2173 ar->scan.state = ATH10K_SCAN_IDLE;
2174 ar->scan_channel = NULL;
2175 ath10k_offchan_tx_purge(ar);
2176 cancel_delayed_work(&ar->scan.timeout);
2177 complete_all(&ar->scan.completed);
2178 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002179 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002180}
Kalle Valo5e3dd152013-06-12 20:52:10 +03002181
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002182void ath10k_scan_finish(struct ath10k *ar)
2183{
2184 spin_lock_bh(&ar->data_lock);
2185 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002186 spin_unlock_bh(&ar->data_lock);
2187}
2188
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002189static int ath10k_scan_stop(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03002190{
2191 struct wmi_stop_scan_arg arg = {
2192 .req_id = 1, /* FIXME */
2193 .req_type = WMI_SCAN_STOP_ONE,
2194 .u.scan_id = ATH10K_SCAN_ID,
2195 };
2196 int ret;
2197
2198 lockdep_assert_held(&ar->conf_mutex);
2199
Kalle Valo5e3dd152013-06-12 20:52:10 +03002200 ret = ath10k_wmi_stop_scan(ar, &arg);
2201 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002202 ath10k_warn("failed to stop wmi scan: %d\n", ret);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002203 goto out;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002204 }
2205
Kalle Valo5e3dd152013-06-12 20:52:10 +03002206 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002207 if (ret == 0) {
2208 ath10k_warn("failed to receive scan abortion completion: timed out\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002209 ret = -ETIMEDOUT;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002210 } else if (ret > 0) {
2211 ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002212 }
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002213
2214out:
2215 /* Scan state should be updated upon scan completion but in case
2216 * firmware fails to deliver the event (for whatever reason) it is
2217 * desired to clean up scan state anyway. Firmware may have just
2218 * dropped the scan completion event delivery due to transport pipe
2219 * being overflown with data and/or it can recover on its own before
2220 * next scan request is submitted.
2221 */
2222 spin_lock_bh(&ar->data_lock);
2223 if (ar->scan.state != ATH10K_SCAN_IDLE)
2224 __ath10k_scan_finish(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002225 spin_unlock_bh(&ar->data_lock);
2226
2227 return ret;
2228}
2229
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002230static void ath10k_scan_abort(struct ath10k *ar)
2231{
2232 int ret;
2233
2234 lockdep_assert_held(&ar->conf_mutex);
2235
2236 spin_lock_bh(&ar->data_lock);
2237
2238 switch (ar->scan.state) {
2239 case ATH10K_SCAN_IDLE:
2240 /* This can happen if timeout worker kicked in and called
2241 * abortion while scan completion was being processed.
2242 */
2243 break;
2244 case ATH10K_SCAN_STARTING:
2245 case ATH10K_SCAN_ABORTING:
2246 ath10k_warn("refusing scan abortion due to invalid scan state: %s (%d)\n",
2247 ath10k_scan_state_str(ar->scan.state),
2248 ar->scan.state);
2249 break;
2250 case ATH10K_SCAN_RUNNING:
2251 ar->scan.state = ATH10K_SCAN_ABORTING;
2252 spin_unlock_bh(&ar->data_lock);
2253
2254 ret = ath10k_scan_stop(ar);
2255 if (ret)
2256 ath10k_warn("failed to abort scan: %d\n", ret);
2257
2258 spin_lock_bh(&ar->data_lock);
2259 break;
2260 }
2261
2262 spin_unlock_bh(&ar->data_lock);
2263}
2264
2265void ath10k_scan_timeout_work(struct work_struct *work)
2266{
2267 struct ath10k *ar = container_of(work, struct ath10k,
2268 scan.timeout.work);
2269
2270 mutex_lock(&ar->conf_mutex);
2271 ath10k_scan_abort(ar);
2272 mutex_unlock(&ar->conf_mutex);
2273}
2274
Kalle Valo5e3dd152013-06-12 20:52:10 +03002275static int ath10k_start_scan(struct ath10k *ar,
2276 const struct wmi_start_scan_arg *arg)
2277{
2278 int ret;
2279
2280 lockdep_assert_held(&ar->conf_mutex);
2281
2282 ret = ath10k_wmi_start_scan(ar, arg);
2283 if (ret)
2284 return ret;
2285
Kalle Valo5e3dd152013-06-12 20:52:10 +03002286 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2287 if (ret == 0) {
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002288 ret = ath10k_scan_stop(ar);
2289 if (ret)
2290 ath10k_warn("failed to stop scan: %d\n", ret);
2291
2292 return -ETIMEDOUT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002293 }
2294
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002295 /* Add a 200ms margin to account for event/command processing */
2296 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
2297 msecs_to_jiffies(arg->max_scan_time+200));
Kalle Valo5e3dd152013-06-12 20:52:10 +03002298 return 0;
2299}
2300
2301/**********************/
2302/* mac80211 callbacks */
2303/**********************/
2304
2305static void ath10k_tx(struct ieee80211_hw *hw,
2306 struct ieee80211_tx_control *control,
2307 struct sk_buff *skb)
2308{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002309 struct ath10k *ar = hw->priv;
Michal Kazior4b604552014-07-21 21:03:09 +03002310 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2311 struct ieee80211_vif *vif = info->control.vif;
2312 struct ieee80211_key_conf *key = info->control.hw_key;
2313 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002314
2315 /* We should disable CCK RATE due to P2P */
2316 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2317 ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2318
Michal Kazior4b604552014-07-21 21:03:09 +03002319 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2320 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
2321 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, info);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002322
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002323 /* it makes no sense to process injected frames like that */
Michal Kazior4b604552014-07-21 21:03:09 +03002324 if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
2325 ath10k_tx_h_nwifi(hw, skb);
2326 ath10k_tx_h_update_wep_key(vif, key, skb);
2327 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
2328 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002329 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002330
Kalle Valo5e3dd152013-06-12 20:52:10 +03002331 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2332 spin_lock_bh(&ar->data_lock);
2333 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002334 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002335 spin_unlock_bh(&ar->data_lock);
2336
2337 ath10k_dbg(ATH10K_DBG_MAC, "queued offchannel skb %p\n", skb);
2338
2339 skb_queue_tail(&ar->offchan_tx_queue, skb);
2340 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2341 return;
2342 }
2343
2344 ath10k_tx_htt(ar, skb);
2345}
2346
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002347/* Must not be called with conf_mutex held as workers can use that also. */
2348static void ath10k_drain_tx(struct ath10k *ar)
2349{
2350 /* make sure rcu-protected mac80211 tx path itself is drained */
2351 synchronize_net();
2352
2353 ath10k_offchan_tx_purge(ar);
2354 ath10k_mgmt_over_wmi_tx_purge(ar);
2355
2356 cancel_work_sync(&ar->offchan_tx_work);
2357 cancel_work_sync(&ar->wmi_mgmt_tx_work);
2358}
2359
Michal Kazioraffd3212013-07-16 09:54:35 +02002360void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02002361{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03002362 struct ath10k_vif *arvif;
2363
Michal Kazior818bdd12013-07-16 09:38:57 +02002364 lockdep_assert_held(&ar->conf_mutex);
2365
Michal Kazior1bbc0972014-04-08 09:45:47 +03002366 if (ath10k_monitor_is_enabled(ar)) {
2367 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
2368 ar->promisc = false;
2369 ar->monitor = false;
2370 ath10k_monitor_stop(ar);
2371 }
2372
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002373 ath10k_scan_finish(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02002374 ath10k_peer_cleanup_all(ar);
2375 ath10k_core_stop(ar);
2376 ath10k_hif_power_down(ar);
2377
2378 spin_lock_bh(&ar->data_lock);
Michal Kaziord9bc4b92014-04-23 19:30:06 +03002379 list_for_each_entry(arvif, &ar->arvifs, list) {
2380 if (!arvif->beacon)
2381 continue;
2382
2383 dma_unmap_single(arvif->ar->dev,
2384 ATH10K_SKB_CB(arvif->beacon)->paddr,
2385 arvif->beacon->len, DMA_TO_DEVICE);
2386 dev_kfree_skb_any(arvif->beacon);
2387 arvif->beacon = NULL;
2388 }
Michal Kazior818bdd12013-07-16 09:38:57 +02002389 spin_unlock_bh(&ar->data_lock);
2390}
2391
Ben Greear46acf7b2014-05-16 17:15:38 +03002392static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
2393{
2394 struct ath10k *ar = hw->priv;
2395
2396 mutex_lock(&ar->conf_mutex);
2397
2398 if (ar->cfg_tx_chainmask) {
2399 *tx_ant = ar->cfg_tx_chainmask;
2400 *rx_ant = ar->cfg_rx_chainmask;
2401 } else {
2402 *tx_ant = ar->supp_tx_chainmask;
2403 *rx_ant = ar->supp_rx_chainmask;
2404 }
2405
2406 mutex_unlock(&ar->conf_mutex);
2407
2408 return 0;
2409}
2410
2411static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
2412{
2413 int ret;
2414
2415 lockdep_assert_held(&ar->conf_mutex);
2416
2417 ar->cfg_tx_chainmask = tx_ant;
2418 ar->cfg_rx_chainmask = rx_ant;
2419
2420 if ((ar->state != ATH10K_STATE_ON) &&
2421 (ar->state != ATH10K_STATE_RESTARTED))
2422 return 0;
2423
2424 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
2425 tx_ant);
2426 if (ret) {
2427 ath10k_warn("failed to set tx-chainmask: %d, req 0x%x\n",
2428 ret, tx_ant);
2429 return ret;
2430 }
2431
2432 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
2433 rx_ant);
2434 if (ret) {
2435 ath10k_warn("failed to set rx-chainmask: %d, req 0x%x\n",
2436 ret, rx_ant);
2437 return ret;
2438 }
2439
2440 return 0;
2441}
2442
2443static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
2444{
2445 struct ath10k *ar = hw->priv;
2446 int ret;
2447
2448 mutex_lock(&ar->conf_mutex);
2449 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
2450 mutex_unlock(&ar->conf_mutex);
2451 return ret;
2452}
2453
Kalle Valo5e3dd152013-06-12 20:52:10 +03002454static int ath10k_start(struct ieee80211_hw *hw)
2455{
2456 struct ath10k *ar = hw->priv;
Michal Kazior818bdd12013-07-16 09:38:57 +02002457 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002458
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002459 /*
2460 * This makes sense only when restarting hw. It is harmless to call
2461 * uncoditionally. This is necessary to make sure no HTT/WMI tx
2462 * commands will be submitted while restarting.
2463 */
2464 ath10k_drain_tx(ar);
2465
Michal Kazior548db542013-07-05 16:15:15 +03002466 mutex_lock(&ar->conf_mutex);
2467
Michal Kaziorc5058f52014-05-26 12:46:03 +03002468 switch (ar->state) {
2469 case ATH10K_STATE_OFF:
2470 ar->state = ATH10K_STATE_ON;
2471 break;
2472 case ATH10K_STATE_RESTARTING:
2473 ath10k_halt(ar);
2474 ar->state = ATH10K_STATE_RESTARTED;
2475 break;
2476 case ATH10K_STATE_ON:
2477 case ATH10K_STATE_RESTARTED:
2478 case ATH10K_STATE_WEDGED:
2479 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02002480 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03002481 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02002482 }
2483
2484 ret = ath10k_hif_power_up(ar);
2485 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002486 ath10k_err("Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002487 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02002488 }
2489
2490 ret = ath10k_core_start(ar);
2491 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002492 ath10k_err("Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002493 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02002494 }
2495
Bartosz Markowski226a3392013-09-26 17:47:16 +02002496 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03002497 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002498 ath10k_warn("failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002499 goto err_core_stop;
2500 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002501
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01002502 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03002503 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002504 ath10k_warn("failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002505 goto err_core_stop;
2506 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002507
Ben Greear46acf7b2014-05-16 17:15:38 +03002508 if (ar->cfg_tx_chainmask)
2509 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
2510 ar->cfg_rx_chainmask);
2511
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002512 /*
2513 * By default FW set ARP frames ac to voice (6). In that case ARP
2514 * exchange is not working properly for UAPSD enabled AP. ARP requests
2515 * which arrives with access category 0 are processed by network stack
2516 * and send back with access category 0, but FW changes access category
2517 * to 6. Set ARP frames access category to best effort (0) solves
2518 * this problem.
2519 */
2520
2521 ret = ath10k_wmi_pdev_set_param(ar,
2522 ar->wmi.pdev_param->arp_ac_override, 0);
2523 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002524 ath10k_warn("failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002525 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002526 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002527 }
2528
Michal Kaziord6500972014-04-08 09:56:09 +03002529 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002530 ath10k_regd_update(ar);
2531
Simon Wunderlich855aed12014-08-02 09:12:54 +03002532 ath10k_spectral_start(ar);
2533
Michal Kaziorae254432014-05-26 12:46:02 +03002534 mutex_unlock(&ar->conf_mutex);
2535 return 0;
2536
2537err_core_stop:
2538 ath10k_core_stop(ar);
2539
2540err_power_down:
2541 ath10k_hif_power_down(ar);
2542
2543err_off:
2544 ar->state = ATH10K_STATE_OFF;
2545
2546err:
Michal Kazior548db542013-07-05 16:15:15 +03002547 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01002548 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002549}
2550
2551static void ath10k_stop(struct ieee80211_hw *hw)
2552{
2553 struct ath10k *ar = hw->priv;
2554
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002555 ath10k_drain_tx(ar);
2556
Michal Kazior548db542013-07-05 16:15:15 +03002557 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03002558 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02002559 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03002560 ar->state = ATH10K_STATE_OFF;
2561 }
Michal Kazior548db542013-07-05 16:15:15 +03002562 mutex_unlock(&ar->conf_mutex);
2563
Michal Kazior5c81c7f2014-08-05 14:54:44 +02002564 cancel_delayed_work_sync(&ar->scan.timeout);
Michal Kazioraffd3212013-07-16 09:54:35 +02002565 cancel_work_sync(&ar->restart_work);
2566}
2567
Michal Kaziorad088bf2013-10-16 15:44:46 +03002568static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02002569{
Michal Kaziorad088bf2013-10-16 15:44:46 +03002570 struct ath10k_vif *arvif;
2571 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02002572
2573 lockdep_assert_held(&ar->conf_mutex);
2574
Michal Kaziorad088bf2013-10-16 15:44:46 +03002575 list_for_each_entry(arvif, &ar->arvifs, list) {
2576 ret = ath10k_mac_vif_setup_ps(arvif);
2577 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002578 ath10k_warn("failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03002579 break;
2580 }
2581 }
Michal Kazioraffd3212013-07-16 09:54:35 +02002582
Michal Kaziorad088bf2013-10-16 15:44:46 +03002583 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002584}
2585
Michal Kaziorc930f742014-01-23 11:38:25 +01002586static const char *chandef_get_width(enum nl80211_chan_width width)
2587{
2588 switch (width) {
2589 case NL80211_CHAN_WIDTH_20_NOHT:
2590 return "20 (noht)";
2591 case NL80211_CHAN_WIDTH_20:
2592 return "20";
2593 case NL80211_CHAN_WIDTH_40:
2594 return "40";
2595 case NL80211_CHAN_WIDTH_80:
2596 return "80";
2597 case NL80211_CHAN_WIDTH_80P80:
2598 return "80+80";
2599 case NL80211_CHAN_WIDTH_160:
2600 return "160";
2601 case NL80211_CHAN_WIDTH_5:
2602 return "5";
2603 case NL80211_CHAN_WIDTH_10:
2604 return "10";
2605 }
2606 return "?";
2607}
2608
2609static void ath10k_config_chan(struct ath10k *ar)
2610{
2611 struct ath10k_vif *arvif;
Michal Kaziorc930f742014-01-23 11:38:25 +01002612 int ret;
2613
2614 lockdep_assert_held(&ar->conf_mutex);
2615
2616 ath10k_dbg(ATH10K_DBG_MAC,
2617 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2618 ar->chandef.chan->center_freq,
2619 ar->chandef.center_freq1,
2620 ar->chandef.center_freq2,
2621 chandef_get_width(ar->chandef.width));
2622
2623 /* First stop monitor interface. Some FW versions crash if there's a
2624 * lone monitor interface. */
Michal Kazior1bbc0972014-04-08 09:45:47 +03002625 if (ar->monitor_started)
2626 ath10k_monitor_vdev_stop(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002627
2628 list_for_each_entry(arvif, &ar->arvifs, list) {
2629 if (!arvif->is_started)
2630 continue;
2631
Michal Kaziordc55e302014-07-29 12:53:36 +03002632 if (!arvif->is_up)
2633 continue;
2634
Michal Kaziorc930f742014-01-23 11:38:25 +01002635 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2636 continue;
2637
Michal Kaziordc55e302014-07-29 12:53:36 +03002638 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Michal Kaziorc930f742014-01-23 11:38:25 +01002639 if (ret) {
Michal Kaziordc55e302014-07-29 12:53:36 +03002640 ath10k_warn("failed to down vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002641 arvif->vdev_id, ret);
2642 continue;
2643 }
2644 }
2645
Michal Kaziordc55e302014-07-29 12:53:36 +03002646 /* all vdevs are downed now - attempt to restart and re-up them */
Michal Kaziorc930f742014-01-23 11:38:25 +01002647
2648 list_for_each_entry(arvif, &ar->arvifs, list) {
2649 if (!arvif->is_started)
2650 continue;
2651
2652 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2653 continue;
2654
Michal Kaziordc55e302014-07-29 12:53:36 +03002655 ret = ath10k_vdev_restart(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +01002656 if (ret) {
Michal Kaziordc55e302014-07-29 12:53:36 +03002657 ath10k_warn("failed to restart vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002658 arvif->vdev_id, ret);
2659 continue;
2660 }
2661
2662 if (!arvif->is_up)
2663 continue;
2664
2665 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
2666 arvif->bssid);
2667 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002668 ath10k_warn("failed to bring vdev up %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002669 arvif->vdev_id, ret);
2670 continue;
2671 }
2672 }
2673
Michal Kazior1bbc0972014-04-08 09:45:47 +03002674 if (ath10k_monitor_is_enabled(ar))
2675 ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
Michal Kaziorc930f742014-01-23 11:38:25 +01002676}
2677
Kalle Valo5e3dd152013-06-12 20:52:10 +03002678static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2679{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002680 struct ath10k *ar = hw->priv;
2681 struct ieee80211_conf *conf = &hw->conf;
2682 int ret = 0;
Michal Kazior5474efe2013-10-23 04:02:15 -07002683 u32 param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002684
2685 mutex_lock(&ar->conf_mutex);
2686
2687 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002688 ath10k_dbg(ATH10K_DBG_MAC,
Michal Kaziord6500972014-04-08 09:56:09 +03002689 "mac config channel %dMHz flags 0x%x radar %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002690 conf->chandef.chan->center_freq,
Michal Kaziord6500972014-04-08 09:56:09 +03002691 conf->chandef.chan->flags,
2692 conf->radar_enabled);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002693
Kalle Valo5e3dd152013-06-12 20:52:10 +03002694 spin_lock_bh(&ar->data_lock);
2695 ar->rx_channel = conf->chandef.chan;
2696 spin_unlock_bh(&ar->data_lock);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002697
Michal Kaziord6500972014-04-08 09:56:09 +03002698 ar->radar_enabled = conf->radar_enabled;
2699 ath10k_recalc_radar_detection(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002700
2701 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
2702 ar->chandef = conf->chandef;
2703 ath10k_config_chan(ar);
2704 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002705 }
2706
Michal Kazior5474efe2013-10-23 04:02:15 -07002707 if (changed & IEEE80211_CONF_CHANGE_POWER) {
2708 ath10k_dbg(ATH10K_DBG_MAC, "mac config power %d\n",
2709 hw->conf.power_level);
2710
2711 param = ar->wmi.pdev_param->txpower_limit2g;
2712 ret = ath10k_wmi_pdev_set_param(ar, param,
2713 hw->conf.power_level * 2);
2714 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002715 ath10k_warn("failed to set 2g txpower %d: %d\n",
Michal Kazior5474efe2013-10-23 04:02:15 -07002716 hw->conf.power_level, ret);
2717
2718 param = ar->wmi.pdev_param->txpower_limit5g;
2719 ret = ath10k_wmi_pdev_set_param(ar, param,
2720 hw->conf.power_level * 2);
2721 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002722 ath10k_warn("failed to set 5g txpower %d: %d\n",
Michal Kazior5474efe2013-10-23 04:02:15 -07002723 hw->conf.power_level, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002724 }
2725
Michal Kazioraffd3212013-07-16 09:54:35 +02002726 if (changed & IEEE80211_CONF_CHANGE_PS)
2727 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002728
2729 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior1bbc0972014-04-08 09:45:47 +03002730 if (conf->flags & IEEE80211_CONF_MONITOR && !ar->monitor) {
2731 ar->monitor = true;
2732 ret = ath10k_monitor_start(ar);
2733 if (ret) {
2734 ath10k_warn("failed to start monitor (config): %d\n",
2735 ret);
2736 ar->monitor = false;
2737 }
2738 } else if (!(conf->flags & IEEE80211_CONF_MONITOR) &&
2739 ar->monitor) {
2740 ar->monitor = false;
2741 ath10k_monitor_stop(ar);
2742 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002743 }
2744
2745 mutex_unlock(&ar->conf_mutex);
2746 return ret;
2747}
2748
2749/*
2750 * TODO:
2751 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2752 * because we will send mgmt frames without CCK. This requirement
2753 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2754 * in the TX packet.
2755 */
2756static int ath10k_add_interface(struct ieee80211_hw *hw,
2757 struct ieee80211_vif *vif)
2758{
2759 struct ath10k *ar = hw->priv;
2760 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2761 enum wmi_sta_powersave_param param;
2762 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02002763 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002764 int bit;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002765 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002766
2767 mutex_lock(&ar->conf_mutex);
2768
Michal Kazior0dbd09e2013-07-31 10:55:14 +02002769 memset(arvif, 0, sizeof(*arvif));
2770
Kalle Valo5e3dd152013-06-12 20:52:10 +03002771 arvif->ar = ar;
2772 arvif->vif = vif;
2773
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002774 INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
Ben Greeare63b33f2013-10-22 14:54:14 -07002775 INIT_LIST_HEAD(&arvif->list);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002776
Ben Greeara9aefb32014-08-12 11:02:19 +03002777 if (ar->free_vdev_map == 0) {
2778 ath10k_warn("Free vdev map is empty, no more interfaces allowed.\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002779 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03002780 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002781 }
Ben Greeara9aefb32014-08-12 11:02:19 +03002782 bit = ffs(ar->free_vdev_map);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002783
2784 arvif->vdev_id = bit - 1;
2785 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002786
2787 if (ar->p2p)
2788 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2789
2790 switch (vif->type) {
2791 case NL80211_IFTYPE_UNSPECIFIED:
2792 case NL80211_IFTYPE_STATION:
2793 arvif->vdev_type = WMI_VDEV_TYPE_STA;
2794 if (vif->p2p)
2795 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2796 break;
2797 case NL80211_IFTYPE_ADHOC:
2798 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2799 break;
2800 case NL80211_IFTYPE_AP:
2801 arvif->vdev_type = WMI_VDEV_TYPE_AP;
2802
2803 if (vif->p2p)
2804 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2805 break;
2806 case NL80211_IFTYPE_MONITOR:
2807 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2808 break;
2809 default:
2810 WARN_ON(1);
2811 break;
2812 }
2813
Kalle Valo60c3daa2013-09-08 17:56:07 +03002814 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002815 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype);
2816
2817 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2818 arvif->vdev_subtype, vif->addr);
2819 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002820 ath10k_warn("failed to create WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002821 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002822 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002823 }
2824
Ben Greeara9aefb32014-08-12 11:02:19 +03002825 ar->free_vdev_map &= ~(1 << arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002826 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002827
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002828 vdev_param = ar->wmi.vdev_param->def_keyid;
2829 ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002830 arvif->def_wep_key_idx);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002831 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002832 ath10k_warn("failed to set vdev %i default key id: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002833 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002834 goto err_vdev_delete;
2835 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002836
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002837 vdev_param = ar->wmi.vdev_param->tx_encap_type;
2838 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002839 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02002840 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03002841 if (ret && ret != -EOPNOTSUPP) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002842 ath10k_warn("failed to set vdev %i TX encapsulation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002843 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002844 goto err_vdev_delete;
2845 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002846
2847 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2848 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
2849 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002850 ath10k_warn("failed to create vdev %i peer for AP: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002851 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002852 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002853 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01002854
Kalle Valo5a13e762014-01-20 11:01:46 +02002855 ret = ath10k_mac_set_kickout(arvif);
2856 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002857 ath10k_warn("failed to set vdev %i kickout parameters: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002858 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02002859 goto err_peer_delete;
2860 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002861 }
2862
2863 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
2864 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
2865 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2866 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2867 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002868 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002869 ath10k_warn("failed to set vdev %i RX wake policy: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002870 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002871 goto err_peer_delete;
2872 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002873
2874 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
2875 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
2876 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2877 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002878 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002879 ath10k_warn("failed to set vdev %i TX wake thresh: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002880 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002881 goto err_peer_delete;
2882 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002883
2884 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
2885 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
2886 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2887 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002888 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002889 ath10k_warn("failed to set vdev %i PSPOLL count: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002890 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002891 goto err_peer_delete;
2892 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002893 }
2894
Michal Kazior424121c2013-07-22 14:13:31 +02002895 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002896 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002897 ath10k_warn("failed to set rts threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03002898 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002899 goto err_peer_delete;
2900 }
Michal Kazior679c54a2013-07-05 16:15:04 +03002901
Michal Kazior424121c2013-07-22 14:13:31 +02002902 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002903 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002904 ath10k_warn("failed to set frag threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03002905 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002906 goto err_peer_delete;
2907 }
Michal Kazior679c54a2013-07-05 16:15:04 +03002908
Kalle Valo5e3dd152013-06-12 20:52:10 +03002909 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002910 return 0;
2911
2912err_peer_delete:
2913 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
2914 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
2915
2916err_vdev_delete:
2917 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
Ben Greeara9aefb32014-08-12 11:02:19 +03002918 ar->free_vdev_map |= 1 << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03002919 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002920
2921err:
2922 mutex_unlock(&ar->conf_mutex);
2923
Kalle Valo5e3dd152013-06-12 20:52:10 +03002924 return ret;
2925}
2926
2927static void ath10k_remove_interface(struct ieee80211_hw *hw,
2928 struct ieee80211_vif *vif)
2929{
2930 struct ath10k *ar = hw->priv;
2931 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2932 int ret;
2933
2934 mutex_lock(&ar->conf_mutex);
2935
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002936 cancel_work_sync(&arvif->wep_key_work);
2937
Michal Kaziored543882013-09-13 14:16:56 +02002938 spin_lock_bh(&ar->data_lock);
2939 if (arvif->beacon) {
Michal Kaziorec6bc552014-04-23 19:30:05 +03002940 dma_unmap_single(arvif->ar->dev,
2941 ATH10K_SKB_CB(arvif->beacon)->paddr,
2942 arvif->beacon->len, DMA_TO_DEVICE);
Michal Kaziored543882013-09-13 14:16:56 +02002943 dev_kfree_skb_any(arvif->beacon);
2944 arvif->beacon = NULL;
2945 }
Simon Wunderlich855aed12014-08-02 09:12:54 +03002946
Michal Kaziored543882013-09-13 14:16:56 +02002947 spin_unlock_bh(&ar->data_lock);
2948
Simon Wunderlich855aed12014-08-02 09:12:54 +03002949 ret = ath10k_spectral_vif_stop(arvif);
2950 if (ret)
2951 ath10k_warn("failed to stop spectral for vdev %i: %d\n",
2952 arvif->vdev_id, ret);
2953
Ben Greeara9aefb32014-08-12 11:02:19 +03002954 ar->free_vdev_map |= 1 << arvif->vdev_id;
Michal Kazior05791192013-10-16 15:44:45 +03002955 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002956
2957 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2958 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
2959 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002960 ath10k_warn("failed to remove peer for AP vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002961 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002962
2963 kfree(arvif->u.ap.noa_data);
2964 }
2965
Ben Greear69244e52014-02-27 18:50:00 +02002966 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002967 arvif->vdev_id);
2968
Kalle Valo5e3dd152013-06-12 20:52:10 +03002969 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2970 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002971 ath10k_warn("failed to delete WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002972 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002973
Kalle Valo5e3dd152013-06-12 20:52:10 +03002974 ath10k_peer_cleanup(ar, arvif->vdev_id);
2975
2976 mutex_unlock(&ar->conf_mutex);
2977}
2978
2979/*
2980 * FIXME: Has to be verified.
2981 */
2982#define SUPPORTED_FILTERS \
2983 (FIF_PROMISC_IN_BSS | \
2984 FIF_ALLMULTI | \
2985 FIF_CONTROL | \
2986 FIF_PSPOLL | \
2987 FIF_OTHER_BSS | \
2988 FIF_BCN_PRBRESP_PROMISC | \
2989 FIF_PROBE_REQ | \
2990 FIF_FCSFAIL)
2991
2992static void ath10k_configure_filter(struct ieee80211_hw *hw,
2993 unsigned int changed_flags,
2994 unsigned int *total_flags,
2995 u64 multicast)
2996{
2997 struct ath10k *ar = hw->priv;
2998 int ret;
2999
3000 mutex_lock(&ar->conf_mutex);
3001
3002 changed_flags &= SUPPORTED_FILTERS;
3003 *total_flags &= SUPPORTED_FILTERS;
3004 ar->filter_flags = *total_flags;
3005
Michal Kazior1bbc0972014-04-08 09:45:47 +03003006 if (ar->filter_flags & FIF_PROMISC_IN_BSS && !ar->promisc) {
3007 ar->promisc = true;
3008 ret = ath10k_monitor_start(ar);
3009 if (ret) {
3010 ath10k_warn("failed to start monitor (promisc): %d\n",
3011 ret);
3012 ar->promisc = false;
3013 }
3014 } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) && ar->promisc) {
3015 ar->promisc = false;
3016 ath10k_monitor_stop(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003017 }
3018
3019 mutex_unlock(&ar->conf_mutex);
3020}
3021
3022static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3023 struct ieee80211_vif *vif,
3024 struct ieee80211_bss_conf *info,
3025 u32 changed)
3026{
3027 struct ath10k *ar = hw->priv;
3028 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3029 int ret = 0;
Bartosz Markowski226a3392013-09-26 17:47:16 +02003030 u32 vdev_param, pdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003031
3032 mutex_lock(&ar->conf_mutex);
3033
3034 if (changed & BSS_CHANGED_IBSS)
3035 ath10k_control_ibss(arvif, info, vif->addr);
3036
3037 if (changed & BSS_CHANGED_BEACON_INT) {
3038 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003039 vdev_param = ar->wmi.vdev_param->beacon_interval;
3040 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003041 arvif->beacon_interval);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003042 ath10k_dbg(ATH10K_DBG_MAC,
3043 "mac vdev %d beacon_interval %d\n",
3044 arvif->vdev_id, arvif->beacon_interval);
3045
Kalle Valo5e3dd152013-06-12 20:52:10 +03003046 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003047 ath10k_warn("failed to set beacon interval for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003048 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003049 }
3050
3051 if (changed & BSS_CHANGED_BEACON) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03003052 ath10k_dbg(ATH10K_DBG_MAC,
3053 "vdev %d set beacon tx mode to staggered\n",
3054 arvif->vdev_id);
3055
Bartosz Markowski226a3392013-09-26 17:47:16 +02003056 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
3057 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003058 WMI_BEACON_STAGGERED_MODE);
3059 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003060 ath10k_warn("failed to set beacon mode for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003061 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003062 }
3063
John W. Linvilleb70727e2013-06-13 13:34:29 -04003064 if (changed & BSS_CHANGED_BEACON_INFO) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003065 arvif->dtim_period = info->dtim_period;
3066
Kalle Valo60c3daa2013-09-08 17:56:07 +03003067 ath10k_dbg(ATH10K_DBG_MAC,
3068 "mac vdev %d dtim_period %d\n",
3069 arvif->vdev_id, arvif->dtim_period);
3070
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003071 vdev_param = ar->wmi.vdev_param->dtim_period;
3072 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003073 arvif->dtim_period);
3074 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003075 ath10k_warn("failed to set dtim period for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003076 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003077 }
3078
3079 if (changed & BSS_CHANGED_SSID &&
3080 vif->type == NL80211_IFTYPE_AP) {
3081 arvif->u.ap.ssid_len = info->ssid_len;
3082 if (info->ssid_len)
3083 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
3084 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3085 }
3086
Michal Kazior7b161a72014-05-26 12:46:03 +03003087 /*
3088 * Firmware manages AP self-peer internally so make sure to not create
3089 * it in driver. Otherwise AP self-peer deletion may timeout later.
3090 */
3091 if (changed & BSS_CHANGED_BSSID &&
3092 vif->type != NL80211_IFTYPE_AP) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003093 if (!is_zero_ether_addr(info->bssid)) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03003094 ath10k_dbg(ATH10K_DBG_MAC,
3095 "mac vdev %d create peer %pM\n",
3096 arvif->vdev_id, info->bssid);
3097
Kalle Valo5e3dd152013-06-12 20:52:10 +03003098 ret = ath10k_peer_create(ar, arvif->vdev_id,
3099 info->bssid);
3100 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003101 ath10k_warn("failed to add peer %pM for vdev %d when changing bssid: %i\n",
Ben Greear479398b2013-11-04 09:19:34 -08003102 info->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003103
3104 if (vif->type == NL80211_IFTYPE_STATION) {
3105 /*
3106 * this is never erased as we it for crypto key
3107 * clearing; this is FW requirement
3108 */
Michal Kaziorc930f742014-01-23 11:38:25 +01003109 memcpy(arvif->bssid, info->bssid, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003110
Kalle Valo60c3daa2013-09-08 17:56:07 +03003111 ath10k_dbg(ATH10K_DBG_MAC,
3112 "mac vdev %d start %pM\n",
3113 arvif->vdev_id, info->bssid);
3114
Kalle Valo5e3dd152013-06-12 20:52:10 +03003115 ret = ath10k_vdev_start(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +01003116 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02003117 ath10k_warn("failed to start vdev %i: %d\n",
3118 arvif->vdev_id, ret);
Kalle Valo75459e32014-02-13 18:13:12 +02003119 goto exit;
Michal Kaziorc930f742014-01-23 11:38:25 +01003120 }
3121
3122 arvif->is_started = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003123 }
3124
3125 /*
3126 * Mac80211 does not keep IBSS bssid when leaving IBSS,
3127 * so driver need to store it. It is needed when leaving
3128 * IBSS in order to remove BSSID peer.
3129 */
3130 if (vif->type == NL80211_IFTYPE_ADHOC)
Michal Kaziorc930f742014-01-23 11:38:25 +01003131 memcpy(arvif->bssid, info->bssid,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003132 ETH_ALEN);
3133 }
3134 }
3135
3136 if (changed & BSS_CHANGED_BEACON_ENABLED)
3137 ath10k_control_beaconing(arvif, info);
3138
3139 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003140 arvif->use_cts_prot = info->use_cts_prot;
Kalle Valo60c3daa2013-09-08 17:56:07 +03003141 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003142 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003143
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003144 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003145 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003146 ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003147 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003148 }
3149
3150 if (changed & BSS_CHANGED_ERP_SLOT) {
3151 u32 slottime;
3152 if (info->use_short_slot)
3153 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3154
3155 else
3156 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3157
Kalle Valo60c3daa2013-09-08 17:56:07 +03003158 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
3159 arvif->vdev_id, slottime);
3160
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003161 vdev_param = ar->wmi.vdev_param->slot_time;
3162 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003163 slottime);
3164 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003165 ath10k_warn("failed to set erp slot for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003166 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003167 }
3168
3169 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3170 u32 preamble;
3171 if (info->use_short_preamble)
3172 preamble = WMI_VDEV_PREAMBLE_SHORT;
3173 else
3174 preamble = WMI_VDEV_PREAMBLE_LONG;
3175
Kalle Valo60c3daa2013-09-08 17:56:07 +03003176 ath10k_dbg(ATH10K_DBG_MAC,
3177 "mac vdev %d preamble %dn",
3178 arvif->vdev_id, preamble);
3179
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003180 vdev_param = ar->wmi.vdev_param->preamble;
3181 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003182 preamble);
3183 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003184 ath10k_warn("failed to set preamble for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003185 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003186 }
3187
3188 if (changed & BSS_CHANGED_ASSOC) {
3189 if (info->assoc)
3190 ath10k_bss_assoc(hw, vif, info);
3191 }
3192
Kalle Valo75459e32014-02-13 18:13:12 +02003193exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003194 mutex_unlock(&ar->conf_mutex);
3195}
3196
3197static int ath10k_hw_scan(struct ieee80211_hw *hw,
3198 struct ieee80211_vif *vif,
David Spinadelc56ef672014-02-05 15:21:13 +02003199 struct ieee80211_scan_request *hw_req)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003200{
3201 struct ath10k *ar = hw->priv;
3202 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
David Spinadelc56ef672014-02-05 15:21:13 +02003203 struct cfg80211_scan_request *req = &hw_req->req;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003204 struct wmi_start_scan_arg arg;
3205 int ret = 0;
3206 int i;
3207
3208 mutex_lock(&ar->conf_mutex);
3209
3210 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003211 switch (ar->scan.state) {
3212 case ATH10K_SCAN_IDLE:
3213 reinit_completion(&ar->scan.started);
3214 reinit_completion(&ar->scan.completed);
3215 ar->scan.state = ATH10K_SCAN_STARTING;
3216 ar->scan.is_roc = false;
3217 ar->scan.vdev_id = arvif->vdev_id;
3218 ret = 0;
3219 break;
3220 case ATH10K_SCAN_STARTING:
3221 case ATH10K_SCAN_RUNNING:
3222 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003223 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003224 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003225 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003226 spin_unlock_bh(&ar->data_lock);
3227
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003228 if (ret)
3229 goto exit;
3230
Kalle Valo5e3dd152013-06-12 20:52:10 +03003231 memset(&arg, 0, sizeof(arg));
3232 ath10k_wmi_start_scan_init(ar, &arg);
3233 arg.vdev_id = arvif->vdev_id;
3234 arg.scan_id = ATH10K_SCAN_ID;
3235
3236 if (!req->no_cck)
3237 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
3238
3239 if (req->ie_len) {
3240 arg.ie_len = req->ie_len;
3241 memcpy(arg.ie, req->ie, arg.ie_len);
3242 }
3243
3244 if (req->n_ssids) {
3245 arg.n_ssids = req->n_ssids;
3246 for (i = 0; i < arg.n_ssids; i++) {
3247 arg.ssids[i].len = req->ssids[i].ssid_len;
3248 arg.ssids[i].ssid = req->ssids[i].ssid;
3249 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02003250 } else {
3251 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003252 }
3253
3254 if (req->n_channels) {
3255 arg.n_channels = req->n_channels;
3256 for (i = 0; i < arg.n_channels; i++)
3257 arg.channels[i] = req->channels[i]->center_freq;
3258 }
3259
3260 ret = ath10k_start_scan(ar, &arg);
3261 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003262 ath10k_warn("failed to start hw scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003263 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003264 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003265 spin_unlock_bh(&ar->data_lock);
3266 }
3267
3268exit:
3269 mutex_unlock(&ar->conf_mutex);
3270 return ret;
3271}
3272
3273static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
3274 struct ieee80211_vif *vif)
3275{
3276 struct ath10k *ar = hw->priv;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003277
3278 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003279 cancel_delayed_work_sync(&ar->scan.timeout);
3280 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003281 mutex_unlock(&ar->conf_mutex);
3282}
3283
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003284static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
3285 struct ath10k_vif *arvif,
3286 enum set_key_cmd cmd,
3287 struct ieee80211_key_conf *key)
3288{
3289 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
3290 int ret;
3291
3292 /* 10.1 firmware branch requires default key index to be set to group
3293 * key index after installing it. Otherwise FW/HW Txes corrupted
3294 * frames with multi-vif APs. This is not required for main firmware
3295 * branch (e.g. 636).
3296 *
3297 * FIXME: This has been tested only in AP. It remains unknown if this
3298 * is required for multi-vif STA interfaces on 10.1 */
3299
3300 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
3301 return;
3302
3303 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
3304 return;
3305
3306 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
3307 return;
3308
3309 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3310 return;
3311
3312 if (cmd != SET_KEY)
3313 return;
3314
3315 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3316 key->keyidx);
3317 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02003318 ath10k_warn("failed to set vdev %i group key as default key: %d\n",
3319 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003320}
3321
Kalle Valo5e3dd152013-06-12 20:52:10 +03003322static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3323 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3324 struct ieee80211_key_conf *key)
3325{
3326 struct ath10k *ar = hw->priv;
3327 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3328 struct ath10k_peer *peer;
3329 const u8 *peer_addr;
3330 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
3331 key->cipher == WLAN_CIPHER_SUITE_WEP104;
3332 int ret = 0;
3333
3334 if (key->keyidx > WMI_MAX_KEY_INDEX)
3335 return -ENOSPC;
3336
3337 mutex_lock(&ar->conf_mutex);
3338
3339 if (sta)
3340 peer_addr = sta->addr;
3341 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3342 peer_addr = vif->bss_conf.bssid;
3343 else
3344 peer_addr = vif->addr;
3345
3346 key->hw_key_idx = key->keyidx;
3347
3348 /* the peer should not disappear in mid-way (unless FW goes awry) since
3349 * we already hold conf_mutex. we just make sure its there now. */
3350 spin_lock_bh(&ar->data_lock);
3351 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3352 spin_unlock_bh(&ar->data_lock);
3353
3354 if (!peer) {
3355 if (cmd == SET_KEY) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003356 ath10k_warn("failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003357 peer_addr);
3358 ret = -EOPNOTSUPP;
3359 goto exit;
3360 } else {
3361 /* if the peer doesn't exist there is no key to disable
3362 * anymore */
3363 goto exit;
3364 }
3365 }
3366
3367 if (is_wep) {
3368 if (cmd == SET_KEY)
3369 arvif->wep_keys[key->keyidx] = key;
3370 else
3371 arvif->wep_keys[key->keyidx] = NULL;
3372
3373 if (cmd == DISABLE_KEY)
3374 ath10k_clear_vdev_key(arvif, key);
3375 }
3376
3377 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
3378 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003379 ath10k_warn("failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003380 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003381 goto exit;
3382 }
3383
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003384 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
3385
Kalle Valo5e3dd152013-06-12 20:52:10 +03003386 spin_lock_bh(&ar->data_lock);
3387 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3388 if (peer && cmd == SET_KEY)
3389 peer->keys[key->keyidx] = key;
3390 else if (peer && cmd == DISABLE_KEY)
3391 peer->keys[key->keyidx] = NULL;
3392 else if (peer == NULL)
3393 /* impossible unless FW goes crazy */
Kalle Valobe6546f2014-03-25 14:18:51 +02003394 ath10k_warn("Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003395 spin_unlock_bh(&ar->data_lock);
3396
3397exit:
3398 mutex_unlock(&ar->conf_mutex);
3399 return ret;
3400}
3401
Michal Kazior9797feb2014-02-14 14:49:48 +01003402static void ath10k_sta_rc_update_wk(struct work_struct *wk)
3403{
3404 struct ath10k *ar;
3405 struct ath10k_vif *arvif;
3406 struct ath10k_sta *arsta;
3407 struct ieee80211_sta *sta;
3408 u32 changed, bw, nss, smps;
3409 int err;
3410
3411 arsta = container_of(wk, struct ath10k_sta, update_wk);
3412 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3413 arvif = arsta->arvif;
3414 ar = arvif->ar;
3415
3416 spin_lock_bh(&ar->data_lock);
3417
3418 changed = arsta->changed;
3419 arsta->changed = 0;
3420
3421 bw = arsta->bw;
3422 nss = arsta->nss;
3423 smps = arsta->smps;
3424
3425 spin_unlock_bh(&ar->data_lock);
3426
3427 mutex_lock(&ar->conf_mutex);
3428
3429 if (changed & IEEE80211_RC_BW_CHANGED) {
3430 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
3431 sta->addr, bw);
3432
3433 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3434 WMI_PEER_CHAN_WIDTH, bw);
3435 if (err)
3436 ath10k_warn("failed to update STA %pM peer bw %d: %d\n",
3437 sta->addr, bw, err);
3438 }
3439
3440 if (changed & IEEE80211_RC_NSS_CHANGED) {
3441 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
3442 sta->addr, nss);
3443
3444 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3445 WMI_PEER_NSS, nss);
3446 if (err)
3447 ath10k_warn("failed to update STA %pM nss %d: %d\n",
3448 sta->addr, nss, err);
3449 }
3450
3451 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3452 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
3453 sta->addr, smps);
3454
3455 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3456 WMI_PEER_SMPS_STATE, smps);
3457 if (err)
3458 ath10k_warn("failed to update STA %pM smps %d: %d\n",
3459 sta->addr, smps, err);
3460 }
3461
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003462 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3463 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM supp rates\n",
3464 sta->addr);
3465
3466 err = ath10k_station_assoc(ar, arvif, sta, true);
3467 if (err)
Kalle Valobe6546f2014-03-25 14:18:51 +02003468 ath10k_warn("failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003469 sta->addr);
3470 }
3471
Michal Kazior9797feb2014-02-14 14:49:48 +01003472 mutex_unlock(&ar->conf_mutex);
3473}
3474
Kalle Valo5e3dd152013-06-12 20:52:10 +03003475static int ath10k_sta_state(struct ieee80211_hw *hw,
3476 struct ieee80211_vif *vif,
3477 struct ieee80211_sta *sta,
3478 enum ieee80211_sta_state old_state,
3479 enum ieee80211_sta_state new_state)
3480{
3481 struct ath10k *ar = hw->priv;
3482 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01003483 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003484 int max_num_peers;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003485 int ret = 0;
3486
Michal Kazior76f90022014-02-25 09:29:57 +02003487 if (old_state == IEEE80211_STA_NOTEXIST &&
3488 new_state == IEEE80211_STA_NONE) {
3489 memset(arsta, 0, sizeof(*arsta));
3490 arsta->arvif = arvif;
3491 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
3492 }
3493
Michal Kazior9797feb2014-02-14 14:49:48 +01003494 /* cancel must be done outside the mutex to avoid deadlock */
3495 if ((old_state == IEEE80211_STA_NONE &&
3496 new_state == IEEE80211_STA_NOTEXIST))
3497 cancel_work_sync(&arsta->update_wk);
3498
Kalle Valo5e3dd152013-06-12 20:52:10 +03003499 mutex_lock(&ar->conf_mutex);
3500
3501 if (old_state == IEEE80211_STA_NOTEXIST &&
3502 new_state == IEEE80211_STA_NONE &&
3503 vif->type != NL80211_IFTYPE_STATION) {
3504 /*
3505 * New station addition.
3506 */
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003507 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
3508 max_num_peers = TARGET_10X_NUM_PEERS_MAX - 1;
3509 else
3510 max_num_peers = TARGET_NUM_PEERS;
3511
3512 if (ar->num_peers >= max_num_peers) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003513 ath10k_warn("number of peers exceeded: peers number %d (max peers %d)\n",
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003514 ar->num_peers, max_num_peers);
3515 ret = -ENOBUFS;
3516 goto exit;
3517 }
3518
Kalle Valo60c3daa2013-09-08 17:56:07 +03003519 ath10k_dbg(ATH10K_DBG_MAC,
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003520 "mac vdev %d peer create %pM (new sta) num_peers %d\n",
3521 arvif->vdev_id, sta->addr, ar->num_peers);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003522
Kalle Valo5e3dd152013-06-12 20:52:10 +03003523 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
3524 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003525 ath10k_warn("failed to add peer %pM for vdev %d when adding a new sta: %i\n",
Ben Greear479398b2013-11-04 09:19:34 -08003526 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003527 } else if ((old_state == IEEE80211_STA_NONE &&
3528 new_state == IEEE80211_STA_NOTEXIST)) {
3529 /*
3530 * Existing station deletion.
3531 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003532 ath10k_dbg(ATH10K_DBG_MAC,
3533 "mac vdev %d peer delete %pM (sta gone)\n",
3534 arvif->vdev_id, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003535 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
3536 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003537 ath10k_warn("failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003538 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003539
3540 if (vif->type == NL80211_IFTYPE_STATION)
3541 ath10k_bss_disassoc(hw, vif);
3542 } else if (old_state == IEEE80211_STA_AUTH &&
3543 new_state == IEEE80211_STA_ASSOC &&
3544 (vif->type == NL80211_IFTYPE_AP ||
3545 vif->type == NL80211_IFTYPE_ADHOC)) {
3546 /*
3547 * New association.
3548 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003549 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM associated\n",
3550 sta->addr);
3551
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003552 ret = ath10k_station_assoc(ar, arvif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003553 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003554 ath10k_warn("failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003555 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003556 } else if (old_state == IEEE80211_STA_ASSOC &&
3557 new_state == IEEE80211_STA_AUTH &&
3558 (vif->type == NL80211_IFTYPE_AP ||
3559 vif->type == NL80211_IFTYPE_ADHOC)) {
3560 /*
3561 * Disassociation.
3562 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003563 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
3564 sta->addr);
3565
Kalle Valo5e3dd152013-06-12 20:52:10 +03003566 ret = ath10k_station_disassoc(ar, arvif, sta);
3567 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003568 ath10k_warn("failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003569 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003570 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003571exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003572 mutex_unlock(&ar->conf_mutex);
3573 return ret;
3574}
3575
3576static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
3577 u16 ac, bool enable)
3578{
3579 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3580 u32 value = 0;
3581 int ret = 0;
3582
Michal Kazior548db542013-07-05 16:15:15 +03003583 lockdep_assert_held(&ar->conf_mutex);
3584
Kalle Valo5e3dd152013-06-12 20:52:10 +03003585 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3586 return 0;
3587
3588 switch (ac) {
3589 case IEEE80211_AC_VO:
3590 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3591 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3592 break;
3593 case IEEE80211_AC_VI:
3594 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3595 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3596 break;
3597 case IEEE80211_AC_BE:
3598 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3599 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3600 break;
3601 case IEEE80211_AC_BK:
3602 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3603 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3604 break;
3605 }
3606
3607 if (enable)
3608 arvif->u.sta.uapsd |= value;
3609 else
3610 arvif->u.sta.uapsd &= ~value;
3611
3612 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3613 WMI_STA_PS_PARAM_UAPSD,
3614 arvif->u.sta.uapsd);
3615 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003616 ath10k_warn("failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003617 goto exit;
3618 }
3619
3620 if (arvif->u.sta.uapsd)
3621 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
3622 else
3623 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3624
3625 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3626 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
3627 value);
3628 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003629 ath10k_warn("failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003630
3631exit:
3632 return ret;
3633}
3634
3635static int ath10k_conf_tx(struct ieee80211_hw *hw,
3636 struct ieee80211_vif *vif, u16 ac,
3637 const struct ieee80211_tx_queue_params *params)
3638{
3639 struct ath10k *ar = hw->priv;
3640 struct wmi_wmm_params_arg *p = NULL;
3641 int ret;
3642
3643 mutex_lock(&ar->conf_mutex);
3644
3645 switch (ac) {
3646 case IEEE80211_AC_VO:
3647 p = &ar->wmm_params.ac_vo;
3648 break;
3649 case IEEE80211_AC_VI:
3650 p = &ar->wmm_params.ac_vi;
3651 break;
3652 case IEEE80211_AC_BE:
3653 p = &ar->wmm_params.ac_be;
3654 break;
3655 case IEEE80211_AC_BK:
3656 p = &ar->wmm_params.ac_bk;
3657 break;
3658 }
3659
3660 if (WARN_ON(!p)) {
3661 ret = -EINVAL;
3662 goto exit;
3663 }
3664
3665 p->cwmin = params->cw_min;
3666 p->cwmax = params->cw_max;
3667 p->aifs = params->aifs;
3668
3669 /*
3670 * The channel time duration programmed in the HW is in absolute
3671 * microseconds, while mac80211 gives the txop in units of
3672 * 32 microseconds.
3673 */
3674 p->txop = params->txop * 32;
3675
3676 /* FIXME: FW accepts wmm params per hw, not per vif */
3677 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
3678 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003679 ath10k_warn("failed to set wmm params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003680 goto exit;
3681 }
3682
3683 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3684 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003685 ath10k_warn("failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003686
3687exit:
3688 mutex_unlock(&ar->conf_mutex);
3689 return ret;
3690}
3691
3692#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3693
3694static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
3695 struct ieee80211_vif *vif,
3696 struct ieee80211_channel *chan,
3697 int duration,
3698 enum ieee80211_roc_type type)
3699{
3700 struct ath10k *ar = hw->priv;
3701 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3702 struct wmi_start_scan_arg arg;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003703 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003704
3705 mutex_lock(&ar->conf_mutex);
3706
3707 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003708 switch (ar->scan.state) {
3709 case ATH10K_SCAN_IDLE:
3710 reinit_completion(&ar->scan.started);
3711 reinit_completion(&ar->scan.completed);
3712 reinit_completion(&ar->scan.on_channel);
3713 ar->scan.state = ATH10K_SCAN_STARTING;
3714 ar->scan.is_roc = true;
3715 ar->scan.vdev_id = arvif->vdev_id;
3716 ar->scan.roc_freq = chan->center_freq;
3717 ret = 0;
3718 break;
3719 case ATH10K_SCAN_STARTING:
3720 case ATH10K_SCAN_RUNNING:
3721 case ATH10K_SCAN_ABORTING:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003722 ret = -EBUSY;
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003723 break;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003724 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003725 spin_unlock_bh(&ar->data_lock);
3726
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003727 if (ret)
3728 goto exit;
3729
Kalle Valo5e3dd152013-06-12 20:52:10 +03003730 memset(&arg, 0, sizeof(arg));
3731 ath10k_wmi_start_scan_init(ar, &arg);
3732 arg.vdev_id = arvif->vdev_id;
3733 arg.scan_id = ATH10K_SCAN_ID;
3734 arg.n_channels = 1;
3735 arg.channels[0] = chan->center_freq;
3736 arg.dwell_time_active = duration;
3737 arg.dwell_time_passive = duration;
3738 arg.max_scan_time = 2 * duration;
3739 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3740 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
3741
3742 ret = ath10k_start_scan(ar, &arg);
3743 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003744 ath10k_warn("failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003745 spin_lock_bh(&ar->data_lock);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003746 ar->scan.state = ATH10K_SCAN_IDLE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003747 spin_unlock_bh(&ar->data_lock);
3748 goto exit;
3749 }
3750
3751 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
3752 if (ret == 0) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003753 ath10k_warn("failed to switch to channel for roc scan\n");
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003754
3755 ret = ath10k_scan_stop(ar);
3756 if (ret)
3757 ath10k_warn("failed to stop scan: %d\n", ret);
3758
Kalle Valo5e3dd152013-06-12 20:52:10 +03003759 ret = -ETIMEDOUT;
3760 goto exit;
3761 }
3762
3763 ret = 0;
3764exit:
3765 mutex_unlock(&ar->conf_mutex);
3766 return ret;
3767}
3768
3769static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
3770{
3771 struct ath10k *ar = hw->priv;
3772
3773 mutex_lock(&ar->conf_mutex);
Michal Kazior5c81c7f2014-08-05 14:54:44 +02003774 cancel_delayed_work_sync(&ar->scan.timeout);
3775 ath10k_scan_abort(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003776 mutex_unlock(&ar->conf_mutex);
3777
3778 return 0;
3779}
3780
3781/*
3782 * Both RTS and Fragmentation threshold are interface-specific
3783 * in ath10k, but device-specific in mac80211.
3784 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03003785
3786static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3787{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003788 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003789 struct ath10k_vif *arvif;
3790 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03003791
Michal Kaziorad088bf2013-10-16 15:44:46 +03003792 mutex_lock(&ar->conf_mutex);
3793 list_for_each_entry(arvif, &ar->arvifs, list) {
3794 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
3795 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003796
Michal Kaziorad088bf2013-10-16 15:44:46 +03003797 ret = ath10k_mac_set_rts(arvif, value);
3798 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003799 ath10k_warn("failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03003800 arvif->vdev_id, ret);
3801 break;
3802 }
3803 }
3804 mutex_unlock(&ar->conf_mutex);
3805
3806 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003807}
3808
3809static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3810{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003811 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003812 struct ath10k_vif *arvif;
3813 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003814
Kalle Valo5e3dd152013-06-12 20:52:10 +03003815 mutex_lock(&ar->conf_mutex);
Michal Kaziorad088bf2013-10-16 15:44:46 +03003816 list_for_each_entry(arvif, &ar->arvifs, list) {
3817 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
3818 arvif->vdev_id, value);
3819
3820 ret = ath10k_mac_set_rts(arvif, value);
3821 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003822 ath10k_warn("failed to set fragmentation threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03003823 arvif->vdev_id, ret);
3824 break;
3825 }
3826 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003827 mutex_unlock(&ar->conf_mutex);
3828
Michal Kaziorad088bf2013-10-16 15:44:46 +03003829 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003830}
3831
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02003832static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
3833 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003834{
3835 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02003836 bool skip;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003837 int ret;
3838
3839 /* mac80211 doesn't care if we really xmit queued frames or not
3840 * we'll collect those frames either way if we stop/delete vdevs */
3841 if (drop)
3842 return;
3843
Michal Kazior548db542013-07-05 16:15:15 +03003844 mutex_lock(&ar->conf_mutex);
3845
Michal Kazioraffd3212013-07-16 09:54:35 +02003846 if (ar->state == ATH10K_STATE_WEDGED)
3847 goto skip;
3848
Michal Kazioredb82362013-07-05 16:15:14 +03003849 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03003850 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02003851
Michal Kazioredb82362013-07-05 16:15:14 +03003852 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02003853 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03003854 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02003855
3856 skip = (ar->state == ATH10K_STATE_WEDGED);
3857
3858 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003859 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02003860
3861 if (ret <= 0 || skip)
Kalle Valobe6546f2014-03-25 14:18:51 +02003862 ath10k_warn("failed to flush transmit queue (skip %i ar-state %i): %i\n",
Ben Greear9ba4c782014-02-25 09:29:57 +02003863 skip, ar->state, ret);
Michal Kazior548db542013-07-05 16:15:15 +03003864
Michal Kazioraffd3212013-07-16 09:54:35 +02003865skip:
Michal Kazior548db542013-07-05 16:15:15 +03003866 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003867}
3868
3869/* TODO: Implement this function properly
3870 * For now it is needed to reply to Probe Requests in IBSS mode.
3871 * Propably we need this information from FW.
3872 */
3873static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
3874{
3875 return 1;
3876}
3877
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003878#ifdef CONFIG_PM
3879static int ath10k_suspend(struct ieee80211_hw *hw,
3880 struct cfg80211_wowlan *wowlan)
3881{
3882 struct ath10k *ar = hw->priv;
3883 int ret;
3884
Marek Puzyniak9042e172014-02-10 17:14:23 +01003885 mutex_lock(&ar->conf_mutex);
3886
Marek Puzyniak00f54822014-02-10 17:14:24 +01003887 ret = ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND);
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003888 if (ret) {
Marek Puzyniak00f54822014-02-10 17:14:24 +01003889 if (ret == -ETIMEDOUT)
3890 goto resume;
Marek Puzyniak9042e172014-02-10 17:14:23 +01003891 ret = 1;
3892 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003893 }
3894
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003895 ret = ath10k_hif_suspend(ar);
3896 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003897 ath10k_warn("failed to suspend hif: %d\n", ret);
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003898 goto resume;
3899 }
3900
Marek Puzyniak9042e172014-02-10 17:14:23 +01003901 ret = 0;
3902 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003903resume:
3904 ret = ath10k_wmi_pdev_resume_target(ar);
3905 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003906 ath10k_warn("failed to resume target: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003907
3908 ret = 1;
3909exit:
3910 mutex_unlock(&ar->conf_mutex);
3911 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003912}
3913
3914static int ath10k_resume(struct ieee80211_hw *hw)
3915{
3916 struct ath10k *ar = hw->priv;
3917 int ret;
3918
Marek Puzyniak9042e172014-02-10 17:14:23 +01003919 mutex_lock(&ar->conf_mutex);
3920
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003921 ret = ath10k_hif_resume(ar);
3922 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003923 ath10k_warn("failed to resume hif: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003924 ret = 1;
3925 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003926 }
3927
3928 ret = ath10k_wmi_pdev_resume_target(ar);
3929 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003930 ath10k_warn("failed to resume target: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003931 ret = 1;
3932 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003933 }
3934
Marek Puzyniak9042e172014-02-10 17:14:23 +01003935 ret = 0;
3936exit:
3937 mutex_unlock(&ar->conf_mutex);
3938 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003939}
3940#endif
3941
Michal Kazioraffd3212013-07-16 09:54:35 +02003942static void ath10k_restart_complete(struct ieee80211_hw *hw)
3943{
3944 struct ath10k *ar = hw->priv;
3945
3946 mutex_lock(&ar->conf_mutex);
3947
3948 /* If device failed to restart it will be in a different state, e.g.
3949 * ATH10K_STATE_WEDGED */
3950 if (ar->state == ATH10K_STATE_RESTARTED) {
3951 ath10k_info("device successfully recovered\n");
3952 ar->state = ATH10K_STATE_ON;
3953 }
3954
3955 mutex_unlock(&ar->conf_mutex);
3956}
3957
Michal Kazior2e1dea42013-07-31 10:32:40 +02003958static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
3959 struct survey_info *survey)
3960{
3961 struct ath10k *ar = hw->priv;
3962 struct ieee80211_supported_band *sband;
3963 struct survey_info *ar_survey = &ar->survey[idx];
3964 int ret = 0;
3965
3966 mutex_lock(&ar->conf_mutex);
3967
3968 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
3969 if (sband && idx >= sband->n_channels) {
3970 idx -= sband->n_channels;
3971 sband = NULL;
3972 }
3973
3974 if (!sband)
3975 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
3976
3977 if (!sband || idx >= sband->n_channels) {
3978 ret = -ENOENT;
3979 goto exit;
3980 }
3981
3982 spin_lock_bh(&ar->data_lock);
3983 memcpy(survey, ar_survey, sizeof(*survey));
3984 spin_unlock_bh(&ar->data_lock);
3985
3986 survey->channel = &sband->channels[idx];
3987
3988exit:
3989 mutex_unlock(&ar->conf_mutex);
3990 return ret;
3991}
3992
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01003993/* Helper table for legacy fixed_rate/bitrate_mask */
3994static const u8 cck_ofdm_rate[] = {
3995 /* CCK */
3996 3, /* 1Mbps */
3997 2, /* 2Mbps */
3998 1, /* 5.5Mbps */
3999 0, /* 11Mbps */
4000 /* OFDM */
4001 3, /* 6Mbps */
4002 7, /* 9Mbps */
4003 2, /* 12Mbps */
4004 6, /* 18Mbps */
4005 1, /* 24Mbps */
4006 5, /* 36Mbps */
4007 0, /* 48Mbps */
4008 4, /* 54Mbps */
4009};
4010
4011/* Check if only one bit set */
4012static int ath10k_check_single_mask(u32 mask)
4013{
4014 int bit;
4015
4016 bit = ffs(mask);
4017 if (!bit)
4018 return 0;
4019
4020 mask &= ~BIT(bit - 1);
4021 if (mask)
4022 return 2;
4023
4024 return 1;
4025}
4026
4027static bool
4028ath10k_default_bitrate_mask(struct ath10k *ar,
4029 enum ieee80211_band band,
4030 const struct cfg80211_bitrate_mask *mask)
4031{
4032 u32 legacy = 0x00ff;
4033 u8 ht = 0xff, i;
4034 u16 vht = 0x3ff;
4035
4036 switch (band) {
4037 case IEEE80211_BAND_2GHZ:
4038 legacy = 0x00fff;
4039 vht = 0;
4040 break;
4041 case IEEE80211_BAND_5GHZ:
4042 break;
4043 default:
4044 return false;
4045 }
4046
4047 if (mask->control[band].legacy != legacy)
4048 return false;
4049
4050 for (i = 0; i < ar->num_rf_chains; i++)
4051 if (mask->control[band].ht_mcs[i] != ht)
4052 return false;
4053
4054 for (i = 0; i < ar->num_rf_chains; i++)
4055 if (mask->control[band].vht_mcs[i] != vht)
4056 return false;
4057
4058 return true;
4059}
4060
4061static bool
4062ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
4063 enum ieee80211_band band,
4064 u8 *fixed_nss)
4065{
4066 int ht_nss = 0, vht_nss = 0, i;
4067
4068 /* check legacy */
4069 if (ath10k_check_single_mask(mask->control[band].legacy))
4070 return false;
4071
4072 /* check HT */
4073 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
4074 if (mask->control[band].ht_mcs[i] == 0xff)
4075 continue;
4076 else if (mask->control[band].ht_mcs[i] == 0x00)
4077 break;
4078 else
4079 return false;
4080 }
4081
4082 ht_nss = i;
4083
4084 /* check VHT */
4085 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4086 if (mask->control[band].vht_mcs[i] == 0x03ff)
4087 continue;
4088 else if (mask->control[band].vht_mcs[i] == 0x0000)
4089 break;
4090 else
4091 return false;
4092 }
4093
4094 vht_nss = i;
4095
4096 if (ht_nss > 0 && vht_nss > 0)
4097 return false;
4098
4099 if (ht_nss)
4100 *fixed_nss = ht_nss;
4101 else if (vht_nss)
4102 *fixed_nss = vht_nss;
4103 else
4104 return false;
4105
4106 return true;
4107}
4108
4109static bool
4110ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
4111 enum ieee80211_band band,
4112 enum wmi_rate_preamble *preamble)
4113{
4114 int legacy = 0, ht = 0, vht = 0, i;
4115
4116 *preamble = WMI_RATE_PREAMBLE_OFDM;
4117
4118 /* check legacy */
4119 legacy = ath10k_check_single_mask(mask->control[band].legacy);
4120 if (legacy > 1)
4121 return false;
4122
4123 /* check HT */
4124 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4125 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
4126 if (ht > 1)
4127 return false;
4128
4129 /* check VHT */
4130 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4131 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
4132 if (vht > 1)
4133 return false;
4134
4135 /* Currently we support only one fixed_rate */
4136 if ((legacy + ht + vht) != 1)
4137 return false;
4138
4139 if (ht)
4140 *preamble = WMI_RATE_PREAMBLE_HT;
4141 else if (vht)
4142 *preamble = WMI_RATE_PREAMBLE_VHT;
4143
4144 return true;
4145}
4146
4147static bool
4148ath10k_bitrate_mask_rate(const struct cfg80211_bitrate_mask *mask,
4149 enum ieee80211_band band,
4150 u8 *fixed_rate,
4151 u8 *fixed_nss)
4152{
4153 u8 rate = 0, pream = 0, nss = 0, i;
4154 enum wmi_rate_preamble preamble;
4155
4156 /* Check if single rate correct */
4157 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
4158 return false;
4159
4160 pream = preamble;
4161
4162 switch (preamble) {
4163 case WMI_RATE_PREAMBLE_CCK:
4164 case WMI_RATE_PREAMBLE_OFDM:
4165 i = ffs(mask->control[band].legacy) - 1;
4166
4167 if (band == IEEE80211_BAND_2GHZ && i < 4)
4168 pream = WMI_RATE_PREAMBLE_CCK;
4169
4170 if (band == IEEE80211_BAND_5GHZ)
4171 i += 4;
4172
4173 if (i >= ARRAY_SIZE(cck_ofdm_rate))
4174 return false;
4175
4176 rate = cck_ofdm_rate[i];
4177 break;
4178 case WMI_RATE_PREAMBLE_HT:
4179 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4180 if (mask->control[band].ht_mcs[i])
4181 break;
4182
4183 if (i == IEEE80211_HT_MCS_MASK_LEN)
4184 return false;
4185
4186 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4187 nss = i;
4188 break;
4189 case WMI_RATE_PREAMBLE_VHT:
4190 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4191 if (mask->control[band].vht_mcs[i])
4192 break;
4193
4194 if (i == NL80211_VHT_NSS_MAX)
4195 return false;
4196
4197 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4198 nss = i;
4199 break;
4200 }
4201
4202 *fixed_nss = nss + 1;
4203 nss <<= 4;
4204 pream <<= 6;
4205
4206 ath10k_dbg(ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
4207 pream, nss, rate);
4208
4209 *fixed_rate = pream | nss | rate;
4210
4211 return true;
4212}
4213
4214static bool ath10k_get_fixed_rate_nss(const struct cfg80211_bitrate_mask *mask,
4215 enum ieee80211_band band,
4216 u8 *fixed_rate,
4217 u8 *fixed_nss)
4218{
4219 /* First check full NSS mask, if we can simply limit NSS */
4220 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
4221 return true;
4222
4223 /* Next Check single rate is set */
4224 return ath10k_bitrate_mask_rate(mask, band, fixed_rate, fixed_nss);
4225}
4226
4227static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
4228 u8 fixed_rate,
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004229 u8 fixed_nss,
4230 u8 force_sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004231{
4232 struct ath10k *ar = arvif->ar;
4233 u32 vdev_param;
4234 int ret = 0;
4235
4236 mutex_lock(&ar->conf_mutex);
4237
4238 if (arvif->fixed_rate == fixed_rate &&
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004239 arvif->fixed_nss == fixed_nss &&
4240 arvif->force_sgi == force_sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004241 goto exit;
4242
4243 if (fixed_rate == WMI_FIXED_RATE_NONE)
4244 ath10k_dbg(ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
4245
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004246 if (force_sgi)
4247 ath10k_dbg(ATH10K_DBG_MAC, "mac force sgi\n");
4248
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004249 vdev_param = ar->wmi.vdev_param->fixed_rate;
4250 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4251 vdev_param, fixed_rate);
4252 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004253 ath10k_warn("failed to set fixed rate param 0x%02x: %d\n",
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004254 fixed_rate, ret);
4255 ret = -EINVAL;
4256 goto exit;
4257 }
4258
4259 arvif->fixed_rate = fixed_rate;
4260
4261 vdev_param = ar->wmi.vdev_param->nss;
4262 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4263 vdev_param, fixed_nss);
4264
4265 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004266 ath10k_warn("failed to set fixed nss param %d: %d\n",
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004267 fixed_nss, ret);
4268 ret = -EINVAL;
4269 goto exit;
4270 }
4271
4272 arvif->fixed_nss = fixed_nss;
4273
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004274 vdev_param = ar->wmi.vdev_param->sgi;
4275 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4276 force_sgi);
4277
4278 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004279 ath10k_warn("failed to set sgi param %d: %d\n",
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004280 force_sgi, ret);
4281 ret = -EINVAL;
4282 goto exit;
4283 }
4284
4285 arvif->force_sgi = force_sgi;
4286
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004287exit:
4288 mutex_unlock(&ar->conf_mutex);
4289 return ret;
4290}
4291
4292static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
4293 struct ieee80211_vif *vif,
4294 const struct cfg80211_bitrate_mask *mask)
4295{
4296 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4297 struct ath10k *ar = arvif->ar;
4298 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
4299 u8 fixed_rate = WMI_FIXED_RATE_NONE;
4300 u8 fixed_nss = ar->num_rf_chains;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004301 u8 force_sgi;
4302
4303 force_sgi = mask->control[band].gi;
4304 if (force_sgi == NL80211_TXRATE_FORCE_LGI)
4305 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004306
4307 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
4308 if (!ath10k_get_fixed_rate_nss(mask, band,
4309 &fixed_rate,
4310 &fixed_nss))
4311 return -EINVAL;
4312 }
4313
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004314 if (fixed_rate == WMI_FIXED_RATE_NONE && force_sgi) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004315 ath10k_warn("failed to force SGI usage for default rate settings\n");
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004316 return -EINVAL;
4317 }
4318
4319 return ath10k_set_fixed_rate_param(arvif, fixed_rate,
4320 fixed_nss, force_sgi);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004321}
4322
Michal Kazior9797feb2014-02-14 14:49:48 +01004323static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
4324 struct ieee80211_vif *vif,
4325 struct ieee80211_sta *sta,
4326 u32 changed)
4327{
4328 struct ath10k *ar = hw->priv;
4329 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4330 u32 bw, smps;
4331
4332 spin_lock_bh(&ar->data_lock);
4333
4334 ath10k_dbg(ATH10K_DBG_MAC,
4335 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4336 sta->addr, changed, sta->bandwidth, sta->rx_nss,
4337 sta->smps_mode);
4338
4339 if (changed & IEEE80211_RC_BW_CHANGED) {
4340 bw = WMI_PEER_CHWIDTH_20MHZ;
4341
4342 switch (sta->bandwidth) {
4343 case IEEE80211_STA_RX_BW_20:
4344 bw = WMI_PEER_CHWIDTH_20MHZ;
4345 break;
4346 case IEEE80211_STA_RX_BW_40:
4347 bw = WMI_PEER_CHWIDTH_40MHZ;
4348 break;
4349 case IEEE80211_STA_RX_BW_80:
4350 bw = WMI_PEER_CHWIDTH_80MHZ;
4351 break;
4352 case IEEE80211_STA_RX_BW_160:
Kalle Valobe6546f2014-03-25 14:18:51 +02004353 ath10k_warn("Invalid bandwith %d in rc update for %pM\n",
4354 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01004355 bw = WMI_PEER_CHWIDTH_20MHZ;
4356 break;
4357 }
4358
4359 arsta->bw = bw;
4360 }
4361
4362 if (changed & IEEE80211_RC_NSS_CHANGED)
4363 arsta->nss = sta->rx_nss;
4364
4365 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4366 smps = WMI_PEER_SMPS_PS_NONE;
4367
4368 switch (sta->smps_mode) {
4369 case IEEE80211_SMPS_AUTOMATIC:
4370 case IEEE80211_SMPS_OFF:
4371 smps = WMI_PEER_SMPS_PS_NONE;
4372 break;
4373 case IEEE80211_SMPS_STATIC:
4374 smps = WMI_PEER_SMPS_STATIC;
4375 break;
4376 case IEEE80211_SMPS_DYNAMIC:
4377 smps = WMI_PEER_SMPS_DYNAMIC;
4378 break;
4379 case IEEE80211_SMPS_NUM_MODES:
Kalle Valobe6546f2014-03-25 14:18:51 +02004380 ath10k_warn("Invalid smps %d in sta rc update for %pM\n",
4381 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01004382 smps = WMI_PEER_SMPS_PS_NONE;
4383 break;
4384 }
4385
4386 arsta->smps = smps;
4387 }
4388
Michal Kazior9797feb2014-02-14 14:49:48 +01004389 arsta->changed |= changed;
4390
4391 spin_unlock_bh(&ar->data_lock);
4392
4393 ieee80211_queue_work(hw, &arsta->update_wk);
4394}
4395
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02004396static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
4397{
4398 /*
4399 * FIXME: Return 0 for time being. Need to figure out whether FW
4400 * has the API to fetch 64-bit local TSF
4401 */
4402
4403 return 0;
4404}
4405
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02004406static int ath10k_ampdu_action(struct ieee80211_hw *hw,
4407 struct ieee80211_vif *vif,
4408 enum ieee80211_ampdu_mlme_action action,
4409 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
4410 u8 buf_size)
4411{
4412 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4413
4414 ath10k_dbg(ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
4415 arvif->vdev_id, sta->addr, tid, action);
4416
4417 switch (action) {
4418 case IEEE80211_AMPDU_RX_START:
4419 case IEEE80211_AMPDU_RX_STOP:
4420 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
4421 * creation/removal. Do we need to verify this?
4422 */
4423 return 0;
4424 case IEEE80211_AMPDU_TX_START:
4425 case IEEE80211_AMPDU_TX_STOP_CONT:
4426 case IEEE80211_AMPDU_TX_STOP_FLUSH:
4427 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
4428 case IEEE80211_AMPDU_TX_OPERATIONAL:
4429 /* Firmware offloads Tx aggregation entirely so deny mac80211
4430 * Tx aggregation requests.
4431 */
4432 return -EOPNOTSUPP;
4433 }
4434
4435 return -EINVAL;
4436}
4437
Kalle Valo5e3dd152013-06-12 20:52:10 +03004438static const struct ieee80211_ops ath10k_ops = {
4439 .tx = ath10k_tx,
4440 .start = ath10k_start,
4441 .stop = ath10k_stop,
4442 .config = ath10k_config,
4443 .add_interface = ath10k_add_interface,
4444 .remove_interface = ath10k_remove_interface,
4445 .configure_filter = ath10k_configure_filter,
4446 .bss_info_changed = ath10k_bss_info_changed,
4447 .hw_scan = ath10k_hw_scan,
4448 .cancel_hw_scan = ath10k_cancel_hw_scan,
4449 .set_key = ath10k_set_key,
4450 .sta_state = ath10k_sta_state,
4451 .conf_tx = ath10k_conf_tx,
4452 .remain_on_channel = ath10k_remain_on_channel,
4453 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
4454 .set_rts_threshold = ath10k_set_rts_threshold,
4455 .set_frag_threshold = ath10k_set_frag_threshold,
4456 .flush = ath10k_flush,
4457 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7b2014-05-16 17:15:38 +03004458 .set_antenna = ath10k_set_antenna,
4459 .get_antenna = ath10k_get_antenna,
Michal Kazioraffd3212013-07-16 09:54:35 +02004460 .restart_complete = ath10k_restart_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02004461 .get_survey = ath10k_get_survey,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004462 .set_bitrate_mask = ath10k_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01004463 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02004464 .get_tsf = ath10k_get_tsf,
Michal Kazioraa5b4fb2014-07-23 12:20:33 +02004465 .ampdu_action = ath10k_ampdu_action,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004466#ifdef CONFIG_PM
4467 .suspend = ath10k_suspend,
4468 .resume = ath10k_resume,
4469#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03004470};
4471
4472#define RATETAB_ENT(_rate, _rateid, _flags) { \
4473 .bitrate = (_rate), \
4474 .flags = (_flags), \
4475 .hw_value = (_rateid), \
4476}
4477
4478#define CHAN2G(_channel, _freq, _flags) { \
4479 .band = IEEE80211_BAND_2GHZ, \
4480 .hw_value = (_channel), \
4481 .center_freq = (_freq), \
4482 .flags = (_flags), \
4483 .max_antenna_gain = 0, \
4484 .max_power = 30, \
4485}
4486
4487#define CHAN5G(_channel, _freq, _flags) { \
4488 .band = IEEE80211_BAND_5GHZ, \
4489 .hw_value = (_channel), \
4490 .center_freq = (_freq), \
4491 .flags = (_flags), \
4492 .max_antenna_gain = 0, \
4493 .max_power = 30, \
4494}
4495
4496static const struct ieee80211_channel ath10k_2ghz_channels[] = {
4497 CHAN2G(1, 2412, 0),
4498 CHAN2G(2, 2417, 0),
4499 CHAN2G(3, 2422, 0),
4500 CHAN2G(4, 2427, 0),
4501 CHAN2G(5, 2432, 0),
4502 CHAN2G(6, 2437, 0),
4503 CHAN2G(7, 2442, 0),
4504 CHAN2G(8, 2447, 0),
4505 CHAN2G(9, 2452, 0),
4506 CHAN2G(10, 2457, 0),
4507 CHAN2G(11, 2462, 0),
4508 CHAN2G(12, 2467, 0),
4509 CHAN2G(13, 2472, 0),
4510 CHAN2G(14, 2484, 0),
4511};
4512
4513static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02004514 CHAN5G(36, 5180, 0),
4515 CHAN5G(40, 5200, 0),
4516 CHAN5G(44, 5220, 0),
4517 CHAN5G(48, 5240, 0),
4518 CHAN5G(52, 5260, 0),
4519 CHAN5G(56, 5280, 0),
4520 CHAN5G(60, 5300, 0),
4521 CHAN5G(64, 5320, 0),
4522 CHAN5G(100, 5500, 0),
4523 CHAN5G(104, 5520, 0),
4524 CHAN5G(108, 5540, 0),
4525 CHAN5G(112, 5560, 0),
4526 CHAN5G(116, 5580, 0),
4527 CHAN5G(120, 5600, 0),
4528 CHAN5G(124, 5620, 0),
4529 CHAN5G(128, 5640, 0),
4530 CHAN5G(132, 5660, 0),
4531 CHAN5G(136, 5680, 0),
4532 CHAN5G(140, 5700, 0),
4533 CHAN5G(149, 5745, 0),
4534 CHAN5G(153, 5765, 0),
4535 CHAN5G(157, 5785, 0),
4536 CHAN5G(161, 5805, 0),
4537 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03004538};
4539
4540static struct ieee80211_rate ath10k_rates[] = {
4541 /* CCK */
4542 RATETAB_ENT(10, 0x82, 0),
4543 RATETAB_ENT(20, 0x84, 0),
4544 RATETAB_ENT(55, 0x8b, 0),
4545 RATETAB_ENT(110, 0x96, 0),
4546 /* OFDM */
4547 RATETAB_ENT(60, 0x0c, 0),
4548 RATETAB_ENT(90, 0x12, 0),
4549 RATETAB_ENT(120, 0x18, 0),
4550 RATETAB_ENT(180, 0x24, 0),
4551 RATETAB_ENT(240, 0x30, 0),
4552 RATETAB_ENT(360, 0x48, 0),
4553 RATETAB_ENT(480, 0x60, 0),
4554 RATETAB_ENT(540, 0x6c, 0),
4555};
4556
4557#define ath10k_a_rates (ath10k_rates + 4)
4558#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
4559#define ath10k_g_rates (ath10k_rates + 0)
4560#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
4561
Michal Kaziore7b54192014-08-07 11:03:27 +02004562struct ath10k *ath10k_mac_create(size_t priv_size)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004563{
4564 struct ieee80211_hw *hw;
4565 struct ath10k *ar;
4566
Michal Kaziore7b54192014-08-07 11:03:27 +02004567 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004568 if (!hw)
4569 return NULL;
4570
4571 ar = hw->priv;
4572 ar->hw = hw;
4573
4574 return ar;
4575}
4576
4577void ath10k_mac_destroy(struct ath10k *ar)
4578{
4579 ieee80211_free_hw(ar->hw);
4580}
4581
4582static const struct ieee80211_iface_limit ath10k_if_limits[] = {
4583 {
4584 .max = 8,
4585 .types = BIT(NL80211_IFTYPE_STATION)
4586 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02004587 },
4588 {
4589 .max = 3,
4590 .types = BIT(NL80211_IFTYPE_P2P_GO)
4591 },
4592 {
4593 .max = 7,
4594 .types = BIT(NL80211_IFTYPE_AP)
4595 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004596};
4597
Bartosz Markowskif2595092013-12-10 16:20:39 +01004598static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004599 {
4600 .max = 8,
4601 .types = BIT(NL80211_IFTYPE_AP)
4602 },
4603};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004604
4605static const struct ieee80211_iface_combination ath10k_if_comb[] = {
4606 {
4607 .limits = ath10k_if_limits,
4608 .n_limits = ARRAY_SIZE(ath10k_if_limits),
4609 .max_interfaces = 8,
4610 .num_different_channels = 1,
4611 .beacon_int_infra_match = true,
4612 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01004613};
4614
4615static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004616 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01004617 .limits = ath10k_10x_if_limits,
4618 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004619 .max_interfaces = 8,
4620 .num_different_channels = 1,
4621 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01004622#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004623 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
4624 BIT(NL80211_CHAN_WIDTH_20) |
4625 BIT(NL80211_CHAN_WIDTH_40) |
4626 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004627#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01004628 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004629};
4630
4631static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4632{
4633 struct ieee80211_sta_vht_cap vht_cap = {0};
4634 u16 mcs_map;
Michal Kazior8865bee42013-07-24 12:36:46 +02004635 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004636
4637 vht_cap.vht_supported = 1;
4638 vht_cap.cap = ar->vht_cap_info;
4639
Michal Kazior8865bee42013-07-24 12:36:46 +02004640 mcs_map = 0;
4641 for (i = 0; i < 8; i++) {
4642 if (i < ar->num_rf_chains)
4643 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
4644 else
4645 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
4646 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004647
4648 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4649 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4650
4651 return vht_cap;
4652}
4653
4654static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4655{
4656 int i;
4657 struct ieee80211_sta_ht_cap ht_cap = {0};
4658
4659 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4660 return ht_cap;
4661
4662 ht_cap.ht_supported = 1;
4663 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4664 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4665 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4666 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4667 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4668
4669 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4670 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4671
4672 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4673 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4674
4675 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4676 u32 smps;
4677
4678 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4679 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4680
4681 ht_cap.cap |= smps;
4682 }
4683
4684 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
4685 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4686
4687 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4688 u32 stbc;
4689
4690 stbc = ar->ht_cap_info;
4691 stbc &= WMI_HT_CAP_RX_STBC;
4692 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4693 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4694 stbc &= IEEE80211_HT_CAP_RX_STBC;
4695
4696 ht_cap.cap |= stbc;
4697 }
4698
4699 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4700 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4701
4702 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4703 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4704
4705 /* max AMSDU is implicitly taken from vht_cap_info */
4706 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4707 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4708
Michal Kazior8865bee42013-07-24 12:36:46 +02004709 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004710 ht_cap.mcs.rx_mask[i] = 0xFF;
4711
4712 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4713
4714 return ht_cap;
4715}
4716
4717
4718static void ath10k_get_arvif_iter(void *data, u8 *mac,
4719 struct ieee80211_vif *vif)
4720{
4721 struct ath10k_vif_iter *arvif_iter = data;
4722 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4723
4724 if (arvif->vdev_id == arvif_iter->vdev_id)
4725 arvif_iter->arvif = arvif;
4726}
4727
4728struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
4729{
4730 struct ath10k_vif_iter arvif_iter;
4731 u32 flags;
4732
4733 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
4734 arvif_iter.vdev_id = vdev_id;
4735
4736 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
4737 ieee80211_iterate_active_interfaces_atomic(ar->hw,
4738 flags,
4739 ath10k_get_arvif_iter,
4740 &arvif_iter);
4741 if (!arvif_iter.arvif) {
Ben Greear69244e52014-02-27 18:50:00 +02004742 ath10k_warn("No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004743 return NULL;
4744 }
4745
4746 return arvif_iter.arvif;
4747}
4748
4749int ath10k_mac_register(struct ath10k *ar)
4750{
4751 struct ieee80211_supported_band *band;
4752 struct ieee80211_sta_vht_cap vht_cap;
4753 struct ieee80211_sta_ht_cap ht_cap;
4754 void *channels;
4755 int ret;
4756
4757 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
4758
4759 SET_IEEE80211_DEV(ar->hw, ar->dev);
4760
4761 ht_cap = ath10k_get_ht_cap(ar);
4762 vht_cap = ath10k_create_vht_cap(ar);
4763
4764 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4765 channels = kmemdup(ath10k_2ghz_channels,
4766 sizeof(ath10k_2ghz_channels),
4767 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02004768 if (!channels) {
4769 ret = -ENOMEM;
4770 goto err_free;
4771 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004772
4773 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
4774 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
4775 band->channels = channels;
4776 band->n_bitrates = ath10k_g_rates_size;
4777 band->bitrates = ath10k_g_rates;
4778 band->ht_cap = ht_cap;
4779
4780 /* vht is not supported in 2.4 GHz */
4781
4782 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
4783 }
4784
4785 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4786 channels = kmemdup(ath10k_5ghz_channels,
4787 sizeof(ath10k_5ghz_channels),
4788 GFP_KERNEL);
4789 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02004790 ret = -ENOMEM;
4791 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004792 }
4793
4794 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
4795 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
4796 band->channels = channels;
4797 band->n_bitrates = ath10k_a_rates_size;
4798 band->bitrates = ath10k_a_rates;
4799 band->ht_cap = ht_cap;
4800 band->vht_cap = vht_cap;
4801 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
4802 }
4803
4804 ar->hw->wiphy->interface_modes =
4805 BIT(NL80211_IFTYPE_STATION) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01004806 BIT(NL80211_IFTYPE_AP);
4807
Ben Greear46acf7b2014-05-16 17:15:38 +03004808 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4809 /* TODO: Have to deal with 2x2 chips if/when the come out. */
4810 ar->supp_tx_chainmask = TARGET_10X_TX_CHAIN_MASK;
4811 ar->supp_rx_chainmask = TARGET_10X_RX_CHAIN_MASK;
4812 } else {
4813 ar->supp_tx_chainmask = TARGET_TX_CHAIN_MASK;
4814 ar->supp_rx_chainmask = TARGET_RX_CHAIN_MASK;
4815 }
4816
4817 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
4818 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
4819
Bartosz Markowskid3541812013-12-10 16:20:40 +01004820 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
4821 ar->hw->wiphy->interface_modes |=
4822 BIT(NL80211_IFTYPE_P2P_CLIENT) |
4823 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004824
4825 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
4826 IEEE80211_HW_SUPPORTS_PS |
4827 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
4828 IEEE80211_HW_SUPPORTS_UAPSD |
4829 IEEE80211_HW_MFP_CAPABLE |
4830 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
4831 IEEE80211_HW_HAS_RATE_CONTROL |
4832 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
Janusz Dziedzic2f0f1122014-02-26 18:42:09 +02004833 IEEE80211_HW_AP_LINK_PS |
4834 IEEE80211_HW_SPECTRUM_MGMT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004835
Michal Kazior1f8bb152013-09-18 14:43:22 +02004836 /* MSDU can have HTT TX fragment pushed in front. The additional 4
4837 * bytes is used for padding/alignment if necessary. */
4838 ar->hw->extra_tx_headroom += sizeof(struct htt_data_tx_desc_frag)*2 + 4;
4839
Kalle Valo5e3dd152013-06-12 20:52:10 +03004840 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4841 ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
4842
4843 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
4844 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
4845 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
4846 }
4847
4848 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
4849 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
4850
4851 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01004852 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004853
Kalle Valo5e3dd152013-06-12 20:52:10 +03004854 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
4855
4856 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01004857 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004858 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
4859
4860 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
4861 /*
4862 * on LL hardware queues are managed entirely by the FW
4863 * so we only advertise to mac we can do the queues thing
4864 */
4865 ar->hw->queues = 4;
4866
Bartosz Markowskif2595092013-12-10 16:20:39 +01004867 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4868 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
4869 ar->hw->wiphy->n_iface_combinations =
4870 ARRAY_SIZE(ath10k_10x_if_comb);
4871 } else {
4872 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
4873 ar->hw->wiphy->n_iface_combinations =
4874 ARRAY_SIZE(ath10k_if_comb);
Michal Kaziorcf850d12014-07-24 20:07:00 +03004875
4876 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
Bartosz Markowskif2595092013-12-10 16:20:39 +01004877 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004878
Michal Kazior7c199992013-07-31 10:47:57 +02004879 ar->hw->netdev_features = NETIF_F_HW_CSUM;
4880
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004881 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
4882 /* Init ath dfs pattern detector */
4883 ar->ath_common.debug_mask = ATH_DBG_DFS;
4884 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
4885 NL80211_DFS_UNSET);
4886
4887 if (!ar->dfs_detector)
Kalle Valobe6546f2014-03-25 14:18:51 +02004888 ath10k_warn("failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004889 }
4890
Kalle Valo5e3dd152013-06-12 20:52:10 +03004891 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
4892 ath10k_reg_notifier);
4893 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004894 ath10k_err("failed to initialise regulatory: %i\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02004895 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004896 }
4897
4898 ret = ieee80211_register_hw(ar->hw);
4899 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004900 ath10k_err("failed to register ieee80211: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02004901 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004902 }
4903
4904 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
4905 ret = regulatory_hint(ar->hw->wiphy,
4906 ar->ath_common.regulatory.alpha2);
4907 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02004908 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004909 }
4910
4911 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02004912
4913err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004914 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02004915err_free:
4916 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4917 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4918
Kalle Valo5e3dd152013-06-12 20:52:10 +03004919 return ret;
4920}
4921
4922void ath10k_mac_unregister(struct ath10k *ar)
4923{
4924 ieee80211_unregister_hw(ar->hw);
4925
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004926 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
4927 ar->dfs_detector->exit(ar->dfs_detector);
4928
Kalle Valo5e3dd152013-06-12 20:52:10 +03004929 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4930 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4931
4932 SET_IEEE80211_DEV(ar->hw, NULL);
4933}