blob: bbce3a0f8a39e6aa651537fec262a6b4fd4ac2d4 [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
Kalle Valo5e3dd152013-06-12 20:52:10 +0300600 bit = ffs(ar->free_vdev_map);
601 if (bit == 0) {
Michal Kazior1bbc0972014-04-08 09:45:47 +0300602 ath10k_warn("failed to find free vdev id for monitor vdev\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300603 return -ENOMEM;
604 }
605
606 ar->monitor_vdev_id = bit - 1;
607 ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id);
608
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);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300615 goto vdev_fail;
616 }
617
Kalle Valo60c3daa2013-09-08 17:56:07 +0300618 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300619 ar->monitor_vdev_id);
620
Kalle Valo5e3dd152013-06-12 20:52:10 +0300621 return 0;
622
623vdev_fail:
624 /*
625 * Restore the ID to the global map.
626 */
627 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
628 return ret;
629}
630
Michal Kazior1bbc0972014-04-08 09:45:47 +0300631static int ath10k_monitor_vdev_delete(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300632{
633 int ret = 0;
634
635 lockdep_assert_held(&ar->conf_mutex);
636
Kalle Valo5e3dd152013-06-12 20:52:10 +0300637 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
638 if (ret) {
Michal Kazior1bbc0972014-04-08 09:45:47 +0300639 ath10k_warn("failed to request wmi monitor vdev %i removal: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +0200640 ar->monitor_vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300641 return ret;
642 }
643
644 ar->free_vdev_map |= 1 << (ar->monitor_vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300645
Kalle Valo60c3daa2013-09-08 17:56:07 +0300646 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300647 ar->monitor_vdev_id);
648 return ret;
649}
650
Michal Kazior1bbc0972014-04-08 09:45:47 +0300651static int ath10k_monitor_start(struct ath10k *ar)
652{
653 int ret;
654
655 lockdep_assert_held(&ar->conf_mutex);
656
657 if (!ath10k_monitor_is_enabled(ar)) {
658 ath10k_warn("trying to start monitor with no references\n");
659 return 0;
660 }
661
662 if (ar->monitor_started) {
663 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor already started\n");
664 return 0;
665 }
666
667 ret = ath10k_monitor_vdev_create(ar);
668 if (ret) {
669 ath10k_warn("failed to create monitor vdev: %d\n", ret);
670 return ret;
671 }
672
673 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
674 if (ret) {
675 ath10k_warn("failed to start monitor vdev: %d\n", ret);
676 ath10k_monitor_vdev_delete(ar);
677 return ret;
678 }
679
680 ar->monitor_started = true;
681 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor started\n");
682
683 return 0;
684}
685
686static void ath10k_monitor_stop(struct ath10k *ar)
687{
688 int ret;
689
690 lockdep_assert_held(&ar->conf_mutex);
691
692 if (ath10k_monitor_is_enabled(ar)) {
693 ath10k_dbg(ATH10K_DBG_MAC,
694 "mac monitor will be stopped later\n");
695 return;
696 }
697
698 if (!ar->monitor_started) {
699 ath10k_dbg(ATH10K_DBG_MAC,
700 "mac monitor probably failed to start earlier\n");
701 return;
702 }
703
704 ret = ath10k_monitor_vdev_stop(ar);
705 if (ret)
706 ath10k_warn("failed to stop monitor vdev: %d\n", ret);
707
708 ret = ath10k_monitor_vdev_delete(ar);
709 if (ret)
710 ath10k_warn("failed to delete monitor vdev: %d\n", ret);
711
712 ar->monitor_started = false;
713 ath10k_dbg(ATH10K_DBG_MAC, "mac monitor stopped\n");
714}
715
Marek Kwaczynskie81bd102014-03-11 12:58:00 +0200716static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
717{
718 struct ath10k *ar = arvif->ar;
719 u32 vdev_param, rts_cts = 0;
720
721 lockdep_assert_held(&ar->conf_mutex);
722
723 vdev_param = ar->wmi.vdev_param->enable_rtscts;
724
725 if (arvif->use_cts_prot || arvif->num_legacy_stations > 0)
726 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
727
728 if (arvif->num_legacy_stations > 0)
729 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
730 WMI_RTSCTS_PROFILE);
731
732 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
733 rts_cts);
734}
735
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200736static int ath10k_start_cac(struct ath10k *ar)
737{
738 int ret;
739
740 lockdep_assert_held(&ar->conf_mutex);
741
742 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
743
Michal Kazior1bbc0972014-04-08 09:45:47 +0300744 ret = ath10k_monitor_start(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200745 if (ret) {
Michal Kazior1bbc0972014-04-08 09:45:47 +0300746 ath10k_warn("failed to start monitor (cac): %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200747 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
748 return ret;
749 }
750
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200751 ath10k_dbg(ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
752 ar->monitor_vdev_id);
753
754 return 0;
755}
756
757static int ath10k_stop_cac(struct ath10k *ar)
758{
759 lockdep_assert_held(&ar->conf_mutex);
760
761 /* CAC is not running - do nothing */
762 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
763 return 0;
764
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200765 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
Michal Kazior1bbc0972014-04-08 09:45:47 +0300766 ath10k_monitor_stop(ar);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200767
768 ath10k_dbg(ATH10K_DBG_MAC, "mac cac finished\n");
769
770 return 0;
771}
772
Michal Kaziord6500972014-04-08 09:56:09 +0300773static void ath10k_recalc_radar_detection(struct ath10k *ar)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200774{
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200775 int ret;
776
777 lockdep_assert_held(&ar->conf_mutex);
778
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200779 ath10k_stop_cac(ar);
780
Michal Kaziord6500972014-04-08 09:56:09 +0300781 if (!ar->radar_enabled)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200782 return;
783
Michal Kaziord6500972014-04-08 09:56:09 +0300784 if (ar->num_started_vdevs > 0)
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200785 return;
786
787 ret = ath10k_start_cac(ar);
788 if (ret) {
789 /*
790 * Not possible to start CAC on current channel so starting
791 * radiation is not allowed, make this channel DFS_UNAVAILABLE
792 * by indicating that radar was detected.
793 */
Kalle Valobe6546f2014-03-25 14:18:51 +0200794 ath10k_warn("failed to start CAC: %d\n", ret);
Marek Puzyniake8a50f82013-11-20 09:59:47 +0200795 ieee80211_radar_detected(ar->hw);
796 }
797}
798
Michal Kazior72654fa2014-04-08 09:56:09 +0300799static int ath10k_vdev_start(struct ath10k_vif *arvif)
800{
801 struct ath10k *ar = arvif->ar;
802 struct cfg80211_chan_def *chandef = &ar->chandef;
803 struct wmi_vdev_start_request_arg arg = {};
804 int ret = 0;
805
806 lockdep_assert_held(&ar->conf_mutex);
807
808 reinit_completion(&ar->vdev_setup_done);
809
810 arg.vdev_id = arvif->vdev_id;
811 arg.dtim_period = arvif->dtim_period;
812 arg.bcn_intval = arvif->beacon_interval;
813
814 arg.channel.freq = chandef->chan->center_freq;
815 arg.channel.band_center_freq1 = chandef->center_freq1;
816 arg.channel.mode = chan_to_phymode(chandef);
817
818 arg.channel.min_power = 0;
819 arg.channel.max_power = chandef->chan->max_power * 2;
820 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
821 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
822
823 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
824 arg.ssid = arvif->u.ap.ssid;
825 arg.ssid_len = arvif->u.ap.ssid_len;
826 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
827
828 /* For now allow DFS for AP mode */
829 arg.channel.chan_radar =
830 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
831 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
832 arg.ssid = arvif->vif->bss_conf.ssid;
833 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
834 }
835
836 ath10k_dbg(ATH10K_DBG_MAC,
837 "mac vdev %d start center_freq %d phymode %s\n",
838 arg.vdev_id, arg.channel.freq,
839 ath10k_wmi_phymode_str(arg.channel.mode));
840
841 ret = ath10k_wmi_vdev_start(ar, &arg);
842 if (ret) {
843 ath10k_warn("failed to start WMI vdev %i: %d\n",
844 arg.vdev_id, ret);
845 return ret;
846 }
847
848 ret = ath10k_vdev_setup_sync(ar);
849 if (ret) {
850 ath10k_warn("failed to synchronise setup for vdev %i: %d\n",
851 arg.vdev_id, ret);
852 return ret;
853 }
854
Michal Kaziord6500972014-04-08 09:56:09 +0300855 ar->num_started_vdevs++;
856 ath10k_recalc_radar_detection(ar);
857
Michal Kazior72654fa2014-04-08 09:56:09 +0300858 return ret;
859}
860
861static int ath10k_vdev_stop(struct ath10k_vif *arvif)
862{
863 struct ath10k *ar = arvif->ar;
864 int ret;
865
866 lockdep_assert_held(&ar->conf_mutex);
867
868 reinit_completion(&ar->vdev_setup_done);
869
870 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
871 if (ret) {
872 ath10k_warn("failed to stop WMI vdev %i: %d\n",
873 arvif->vdev_id, ret);
874 return ret;
875 }
876
877 ret = ath10k_vdev_setup_sync(ar);
878 if (ret) {
879 ath10k_warn("failed to syncronise setup for vdev %i: %d\n",
880 arvif->vdev_id, ret);
881 return ret;
882 }
883
Michal Kaziord6500972014-04-08 09:56:09 +0300884 WARN_ON(ar->num_started_vdevs == 0);
885
886 if (ar->num_started_vdevs != 0) {
887 ar->num_started_vdevs--;
888 ath10k_recalc_radar_detection(ar);
889 }
890
Michal Kazior72654fa2014-04-08 09:56:09 +0300891 return ret;
892}
893
Kalle Valo5e3dd152013-06-12 20:52:10 +0300894static void ath10k_control_beaconing(struct ath10k_vif *arvif,
895 struct ieee80211_bss_conf *info)
896{
897 int ret = 0;
898
Michal Kazior548db542013-07-05 16:15:15 +0300899 lockdep_assert_held(&arvif->ar->conf_mutex);
900
Kalle Valo5e3dd152013-06-12 20:52:10 +0300901 if (!info->enable_beacon) {
902 ath10k_vdev_stop(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +0100903
904 arvif->is_started = false;
905 arvif->is_up = false;
906
Michal Kazior748afc42014-01-23 12:48:21 +0100907 spin_lock_bh(&arvif->ar->data_lock);
908 if (arvif->beacon) {
Michal Kazior767d34f2014-02-27 18:50:03 +0200909 dma_unmap_single(arvif->ar->dev,
910 ATH10K_SKB_CB(arvif->beacon)->paddr,
911 arvif->beacon->len, DMA_TO_DEVICE);
Michal Kazior748afc42014-01-23 12:48:21 +0100912 dev_kfree_skb_any(arvif->beacon);
913
914 arvif->beacon = NULL;
915 arvif->beacon_sent = false;
916 }
917 spin_unlock_bh(&arvif->ar->data_lock);
918
Kalle Valo5e3dd152013-06-12 20:52:10 +0300919 return;
920 }
921
922 arvif->tx_seq_no = 0x1000;
923
924 ret = ath10k_vdev_start(arvif);
925 if (ret)
926 return;
927
Michal Kaziorc930f742014-01-23 11:38:25 +0100928 arvif->aid = 0;
929 memcpy(arvif->bssid, info->bssid, ETH_ALEN);
930
931 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
932 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300933 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200934 ath10k_warn("failed to bring up vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +0200935 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +0100936 ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300937 return;
938 }
Michal Kaziorc930f742014-01-23 11:38:25 +0100939
940 arvif->is_started = true;
941 arvif->is_up = true;
942
Kalle Valo60c3daa2013-09-08 17:56:07 +0300943 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300944}
945
946static void ath10k_control_ibss(struct ath10k_vif *arvif,
947 struct ieee80211_bss_conf *info,
948 const u8 self_peer[ETH_ALEN])
949{
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200950 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300951 int ret = 0;
952
Michal Kazior548db542013-07-05 16:15:15 +0300953 lockdep_assert_held(&arvif->ar->conf_mutex);
954
Kalle Valo5e3dd152013-06-12 20:52:10 +0300955 if (!info->ibss_joined) {
956 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, self_peer);
957 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +0200958 ath10k_warn("failed to delete IBSS self peer %pM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300959 self_peer, arvif->vdev_id, ret);
960
Michal Kaziorc930f742014-01-23 11:38:25 +0100961 if (is_zero_ether_addr(arvif->bssid))
Kalle Valo5e3dd152013-06-12 20:52:10 +0300962 return;
963
964 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id,
Michal Kaziorc930f742014-01-23 11:38:25 +0100965 arvif->bssid);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300966 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200967 ath10k_warn("failed to delete IBSS BSSID peer %pM for vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +0100968 arvif->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300969 return;
970 }
971
Michal Kaziorc930f742014-01-23 11:38:25 +0100972 memset(arvif->bssid, 0, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300973
974 return;
975 }
976
977 ret = ath10k_peer_create(arvif->ar, arvif->vdev_id, self_peer);
978 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +0200979 ath10k_warn("failed to create IBSS self peer %pM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300980 self_peer, arvif->vdev_id, ret);
981 return;
982 }
983
Bartosz Markowski6d1506e2013-09-26 17:47:15 +0200984 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
985 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +0300986 ATH10K_DEFAULT_ATIM);
987 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +0200988 ath10k_warn("failed to set IBSS ATIM for vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300989 arvif->vdev_id, ret);
990}
991
992/*
993 * Review this when mac80211 gains per-interface powersave support.
994 */
Michal Kaziorad088bf2013-10-16 15:44:46 +0300995static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300996{
Michal Kaziorad088bf2013-10-16 15:44:46 +0300997 struct ath10k *ar = arvif->ar;
998 struct ieee80211_conf *conf = &ar->hw->conf;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300999 enum wmi_sta_powersave_param param;
1000 enum wmi_sta_ps_mode psmode;
1001 int ret;
1002
Michal Kazior548db542013-07-05 16:15:15 +03001003 lockdep_assert_held(&arvif->ar->conf_mutex);
1004
Michal Kaziorad088bf2013-10-16 15:44:46 +03001005 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1006 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001007
1008 if (conf->flags & IEEE80211_CONF_PS) {
1009 psmode = WMI_STA_PS_MODE_ENABLED;
1010 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1011
Michal Kaziorad088bf2013-10-16 15:44:46 +03001012 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001013 conf->dynamic_ps_timeout);
1014 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001015 ath10k_warn("failed to set inactivity time for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001016 arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001017 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001018 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001019 } else {
1020 psmode = WMI_STA_PS_MODE_DISABLED;
1021 }
1022
Kalle Valo60c3daa2013-09-08 17:56:07 +03001023 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
1024 arvif->vdev_id, psmode ? "enable" : "disable");
1025
Michal Kaziorad088bf2013-10-16 15:44:46 +03001026 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1027 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001028 ath10k_warn("failed to set PS Mode %d for vdev %d: %d\n",
1029 psmode, arvif->vdev_id, ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03001030 return ret;
1031 }
1032
1033 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001034}
1035
1036/**********************/
1037/* Station management */
1038/**********************/
1039
1040static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
1041 struct ath10k_vif *arvif,
1042 struct ieee80211_sta *sta,
1043 struct ieee80211_bss_conf *bss_conf,
1044 struct wmi_peer_assoc_complete_arg *arg)
1045{
Michal Kazior548db542013-07-05 16:15:15 +03001046 lockdep_assert_held(&ar->conf_mutex);
1047
Kalle Valo5e3dd152013-06-12 20:52:10 +03001048 memcpy(arg->addr, sta->addr, ETH_ALEN);
1049 arg->vdev_id = arvif->vdev_id;
1050 arg->peer_aid = sta->aid;
1051 arg->peer_flags |= WMI_PEER_AUTH;
1052
1053 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
1054 /*
1055 * Seems FW have problems with Power Save in STA
1056 * mode when we setup this parameter to high (eg. 5).
1057 * Often we see that FW don't send NULL (with clean P flags)
1058 * frame even there is info about buffered frames in beacons.
1059 * Sometimes we have to wait more than 10 seconds before FW
1060 * will wakeup. Often sending one ping from AP to our device
1061 * just fail (more than 50%).
1062 *
1063 * Seems setting this FW parameter to 1 couse FW
1064 * will check every beacon and will wakup immediately
1065 * after detection buffered data.
1066 */
1067 arg->peer_listen_intval = 1;
1068 else
1069 arg->peer_listen_intval = ar->hw->conf.listen_interval;
1070
1071 arg->peer_num_spatial_streams = 1;
1072
1073 /*
1074 * The assoc capabilities are available only in managed mode.
1075 */
1076 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && bss_conf)
1077 arg->peer_caps = bss_conf->assoc_capability;
1078}
1079
1080static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1081 struct ath10k_vif *arvif,
1082 struct wmi_peer_assoc_complete_arg *arg)
1083{
1084 struct ieee80211_vif *vif = arvif->vif;
1085 struct ieee80211_bss_conf *info = &vif->bss_conf;
1086 struct cfg80211_bss *bss;
1087 const u8 *rsnie = NULL;
1088 const u8 *wpaie = NULL;
1089
Michal Kazior548db542013-07-05 16:15:15 +03001090 lockdep_assert_held(&ar->conf_mutex);
1091
Kalle Valo5e3dd152013-06-12 20:52:10 +03001092 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1093 info->bssid, NULL, 0, 0, 0);
1094 if (bss) {
1095 const struct cfg80211_bss_ies *ies;
1096
1097 rcu_read_lock();
1098 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1099
1100 ies = rcu_dereference(bss->ies);
1101
1102 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1103 WLAN_OUI_TYPE_MICROSOFT_WPA,
1104 ies->data,
1105 ies->len);
1106 rcu_read_unlock();
1107 cfg80211_put_bss(ar->hw->wiphy, bss);
1108 }
1109
1110 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1111 if (rsnie || wpaie) {
1112 ath10k_dbg(ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
1113 arg->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
1114 }
1115
1116 if (wpaie) {
1117 ath10k_dbg(ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
1118 arg->peer_flags |= WMI_PEER_NEED_GTK_2_WAY;
1119 }
1120}
1121
1122static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
1123 struct ieee80211_sta *sta,
1124 struct wmi_peer_assoc_complete_arg *arg)
1125{
1126 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1127 const struct ieee80211_supported_band *sband;
1128 const struct ieee80211_rate *rates;
1129 u32 ratemask;
1130 int i;
1131
Michal Kazior548db542013-07-05 16:15:15 +03001132 lockdep_assert_held(&ar->conf_mutex);
1133
Kalle Valo5e3dd152013-06-12 20:52:10 +03001134 sband = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band];
1135 ratemask = sta->supp_rates[ar->hw->conf.chandef.chan->band];
1136 rates = sband->bitrates;
1137
1138 rateset->num_rates = 0;
1139
1140 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1141 if (!(ratemask & 1))
1142 continue;
1143
1144 rateset->rates[rateset->num_rates] = rates->hw_value;
1145 rateset->num_rates++;
1146 }
1147}
1148
1149static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1150 struct ieee80211_sta *sta,
1151 struct wmi_peer_assoc_complete_arg *arg)
1152{
1153 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001154 int i, n;
1155
Michal Kazior548db542013-07-05 16:15:15 +03001156 lockdep_assert_held(&ar->conf_mutex);
1157
Kalle Valo5e3dd152013-06-12 20:52:10 +03001158 if (!ht_cap->ht_supported)
1159 return;
1160
1161 arg->peer_flags |= WMI_PEER_HT;
1162 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1163 ht_cap->ampdu_factor)) - 1;
1164
1165 arg->peer_mpdu_density =
1166 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
1167
1168 arg->peer_ht_caps = ht_cap->cap;
1169 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
1170
1171 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1172 arg->peer_flags |= WMI_PEER_LDPC;
1173
1174 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1175 arg->peer_flags |= WMI_PEER_40MHZ;
1176 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
1177 }
1178
1179 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
1180 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1181
1182 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
1183 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
1184
1185 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1186 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
1187 arg->peer_flags |= WMI_PEER_STBC;
1188 }
1189
1190 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1191 u32 stbc;
1192 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1193 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1194 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
1195 arg->peer_rate_caps |= stbc;
1196 arg->peer_flags |= WMI_PEER_STBC;
1197 }
1198
Kalle Valo5e3dd152013-06-12 20:52:10 +03001199 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1200 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
1201 else if (ht_cap->mcs.rx_mask[1])
1202 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
1203
1204 for (i = 0, n = 0; i < IEEE80211_HT_MCS_MASK_LEN*8; i++)
1205 if (ht_cap->mcs.rx_mask[i/8] & (1 << i%8))
1206 arg->peer_ht_rates.rates[n++] = i;
1207
Bartosz Markowskifd71f802014-02-10 13:12:55 +01001208 /*
1209 * This is a workaround for HT-enabled STAs which break the spec
1210 * and have no HT capabilities RX mask (no HT RX MCS map).
1211 *
1212 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1213 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1214 *
1215 * Firmware asserts if such situation occurs.
1216 */
1217 if (n == 0) {
1218 arg->peer_ht_rates.num_rates = 8;
1219 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1220 arg->peer_ht_rates.rates[i] = i;
1221 } else {
1222 arg->peer_ht_rates.num_rates = n;
1223 arg->peer_num_spatial_streams = sta->rx_nss;
1224 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001225
Kalle Valo60c3daa2013-09-08 17:56:07 +03001226 ath10k_dbg(ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1227 arg->addr,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001228 arg->peer_ht_rates.num_rates,
1229 arg->peer_num_spatial_streams);
1230}
1231
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001232static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1233 struct ath10k_vif *arvif,
1234 struct ieee80211_sta *sta)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001235{
1236 u32 uapsd = 0;
1237 u32 max_sp = 0;
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001238 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001239
Michal Kazior548db542013-07-05 16:15:15 +03001240 lockdep_assert_held(&ar->conf_mutex);
1241
Kalle Valo5e3dd152013-06-12 20:52:10 +03001242 if (sta->wme && sta->uapsd_queues) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03001243 ath10k_dbg(ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001244 sta->uapsd_queues, sta->max_sp);
1245
Kalle Valo5e3dd152013-06-12 20:52:10 +03001246 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1247 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1248 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1249 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1250 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1251 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1252 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1253 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1254 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1255 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1256 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1257 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1258
1259
1260 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1261 max_sp = sta->max_sp;
1262
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001263 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1264 sta->addr,
1265 WMI_AP_PS_PEER_PARAM_UAPSD,
1266 uapsd);
1267 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001268 ath10k_warn("failed to set ap ps peer param uapsd for vdev %i: %d\n",
1269 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001270 return ret;
1271 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001272
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001273 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
1274 sta->addr,
1275 WMI_AP_PS_PEER_PARAM_MAX_SP,
1276 max_sp);
1277 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001278 ath10k_warn("failed to set ap ps peer param max sp for vdev %i: %d\n",
1279 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001280 return ret;
1281 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001282
1283 /* TODO setup this based on STA listen interval and
1284 beacon interval. Currently we don't know
1285 sta->listen_interval - mac80211 patch required.
1286 Currently use 10 seconds */
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001287 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
1288 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME, 10);
1289 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001290 ath10k_warn("failed to set ap ps peer param ageout time for vdev %i: %d\n",
1291 arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001292 return ret;
1293 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001294 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001295
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001296 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001297}
1298
1299static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1300 struct ieee80211_sta *sta,
1301 struct wmi_peer_assoc_complete_arg *arg)
1302{
1303 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001304 u8 ampdu_factor;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001305
1306 if (!vht_cap->vht_supported)
1307 return;
1308
1309 arg->peer_flags |= WMI_PEER_VHT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001310 arg->peer_vht_caps = vht_cap->cap;
1311
Sujith Manoharana24b88b2013-10-07 19:51:57 -07001312
1313 ampdu_factor = (vht_cap->cap &
1314 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1315 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1316
1317 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1318 * zero in VHT IE. Using it would result in degraded throughput.
1319 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1320 * it if VHT max_mpdu is smaller. */
1321 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1322 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1323 ampdu_factor)) - 1);
1324
Kalle Valo5e3dd152013-06-12 20:52:10 +03001325 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1326 arg->peer_flags |= WMI_PEER_80MHZ;
1327
1328 arg->peer_vht_rates.rx_max_rate =
1329 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1330 arg->peer_vht_rates.rx_mcs_set =
1331 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1332 arg->peer_vht_rates.tx_max_rate =
1333 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1334 arg->peer_vht_rates.tx_mcs_set =
1335 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1336
Kalle Valo60c3daa2013-09-08 17:56:07 +03001337 ath10k_dbg(ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1338 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001339}
1340
1341static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
1342 struct ath10k_vif *arvif,
1343 struct ieee80211_sta *sta,
1344 struct ieee80211_bss_conf *bss_conf,
1345 struct wmi_peer_assoc_complete_arg *arg)
1346{
1347 switch (arvif->vdev_type) {
1348 case WMI_VDEV_TYPE_AP:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001349 if (sta->wme)
1350 arg->peer_flags |= WMI_PEER_QOS;
1351
1352 if (sta->wme && sta->uapsd_queues) {
1353 arg->peer_flags |= WMI_PEER_APSD;
1354 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
1355 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001356 break;
1357 case WMI_VDEV_TYPE_STA:
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001358 if (bss_conf->qos)
1359 arg->peer_flags |= WMI_PEER_QOS;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001360 break;
1361 default:
1362 break;
1363 }
1364}
1365
1366static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
1367 struct ath10k_vif *arvif,
1368 struct ieee80211_sta *sta,
1369 struct wmi_peer_assoc_complete_arg *arg)
1370{
1371 enum wmi_phy_mode phymode = MODE_UNKNOWN;
1372
Kalle Valo5e3dd152013-06-12 20:52:10 +03001373 switch (ar->hw->conf.chandef.chan->band) {
1374 case IEEE80211_BAND_2GHZ:
1375 if (sta->ht_cap.ht_supported) {
1376 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1377 phymode = MODE_11NG_HT40;
1378 else
1379 phymode = MODE_11NG_HT20;
1380 } else {
1381 phymode = MODE_11G;
1382 }
1383
1384 break;
1385 case IEEE80211_BAND_5GHZ:
Sujith Manoharan7cc45e92013-09-08 18:19:55 +03001386 /*
1387 * Check VHT first.
1388 */
1389 if (sta->vht_cap.vht_supported) {
1390 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1391 phymode = MODE_11AC_VHT80;
1392 else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1393 phymode = MODE_11AC_VHT40;
1394 else if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
1395 phymode = MODE_11AC_VHT20;
1396 } else if (sta->ht_cap.ht_supported) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03001397 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
1398 phymode = MODE_11NA_HT40;
1399 else
1400 phymode = MODE_11NA_HT20;
1401 } else {
1402 phymode = MODE_11A;
1403 }
1404
1405 break;
1406 default:
1407 break;
1408 }
1409
Kalle Valo38a1d472013-09-08 17:56:14 +03001410 ath10k_dbg(ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
1411 sta->addr, ath10k_wmi_phymode_str(phymode));
Kalle Valo60c3daa2013-09-08 17:56:07 +03001412
Kalle Valo5e3dd152013-06-12 20:52:10 +03001413 arg->peer_phymode = phymode;
1414 WARN_ON(phymode == MODE_UNKNOWN);
1415}
1416
Kalle Valob9ada652013-10-16 15:44:46 +03001417static int ath10k_peer_assoc_prepare(struct ath10k *ar,
1418 struct ath10k_vif *arvif,
1419 struct ieee80211_sta *sta,
1420 struct ieee80211_bss_conf *bss_conf,
1421 struct wmi_peer_assoc_complete_arg *arg)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001422{
Michal Kazior548db542013-07-05 16:15:15 +03001423 lockdep_assert_held(&ar->conf_mutex);
1424
Kalle Valob9ada652013-10-16 15:44:46 +03001425 memset(arg, 0, sizeof(*arg));
Kalle Valo5e3dd152013-06-12 20:52:10 +03001426
Kalle Valob9ada652013-10-16 15:44:46 +03001427 ath10k_peer_assoc_h_basic(ar, arvif, sta, bss_conf, arg);
1428 ath10k_peer_assoc_h_crypto(ar, arvif, arg);
1429 ath10k_peer_assoc_h_rates(ar, sta, arg);
1430 ath10k_peer_assoc_h_ht(ar, sta, arg);
1431 ath10k_peer_assoc_h_vht(ar, sta, arg);
1432 ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, arg);
1433 ath10k_peer_assoc_h_phymode(ar, arvif, sta, arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001434
Kalle Valob9ada652013-10-16 15:44:46 +03001435 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001436}
1437
Michal Kazior90046f52014-02-14 14:45:51 +01001438static const u32 ath10k_smps_map[] = {
1439 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
1440 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
1441 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
1442 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
1443};
1444
1445static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1446 const u8 *addr,
1447 const struct ieee80211_sta_ht_cap *ht_cap)
1448{
1449 int smps;
1450
1451 if (!ht_cap->ht_supported)
1452 return 0;
1453
1454 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1455 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1456
1457 if (smps >= ARRAY_SIZE(ath10k_smps_map))
1458 return -EINVAL;
1459
1460 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
1461 WMI_PEER_SMPS_STATE,
1462 ath10k_smps_map[smps]);
1463}
1464
Kalle Valo5e3dd152013-06-12 20:52:10 +03001465/* can be called only in mac80211 callbacks due to `key_count` usage */
1466static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1467 struct ieee80211_vif *vif,
1468 struct ieee80211_bss_conf *bss_conf)
1469{
1470 struct ath10k *ar = hw->priv;
1471 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior90046f52014-02-14 14:45:51 +01001472 struct ieee80211_sta_ht_cap ht_cap;
Kalle Valob9ada652013-10-16 15:44:46 +03001473 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001474 struct ieee80211_sta *ap_sta;
1475 int ret;
1476
Michal Kazior548db542013-07-05 16:15:15 +03001477 lockdep_assert_held(&ar->conf_mutex);
1478
Kalle Valo5e3dd152013-06-12 20:52:10 +03001479 rcu_read_lock();
1480
1481 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
1482 if (!ap_sta) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001483 ath10k_warn("failed to find station entry for bss %pM vdev %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001484 bss_conf->bssid, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001485 rcu_read_unlock();
1486 return;
1487 }
1488
Michal Kazior90046f52014-02-14 14:45:51 +01001489 /* ap_sta must be accessed only within rcu section which must be left
1490 * before calling ath10k_setup_peer_smps() which might sleep. */
1491 ht_cap = ap_sta->ht_cap;
1492
Kalle Valob9ada652013-10-16 15:44:46 +03001493 ret = ath10k_peer_assoc_prepare(ar, arvif, ap_sta,
1494 bss_conf, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001495 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001496 ath10k_warn("failed to prepare peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001497 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001498 rcu_read_unlock();
1499 return;
1500 }
1501
1502 rcu_read_unlock();
1503
Kalle Valob9ada652013-10-16 15:44:46 +03001504 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1505 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001506 ath10k_warn("failed to run peer assoc for %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001507 bss_conf->bssid, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001508 return;
1509 }
1510
Michal Kazior90046f52014-02-14 14:45:51 +01001511 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
1512 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02001513 ath10k_warn("failed to setup peer SMPS for vdev %i: %d\n",
1514 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01001515 return;
1516 }
1517
Kalle Valo60c3daa2013-09-08 17:56:07 +03001518 ath10k_dbg(ATH10K_DBG_MAC,
1519 "mac vdev %d up (associated) bssid %pM aid %d\n",
1520 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1521
Michal Kaziorc930f742014-01-23 11:38:25 +01001522 arvif->aid = bss_conf->aid;
1523 memcpy(arvif->bssid, bss_conf->bssid, ETH_ALEN);
1524
1525 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1526 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001527 ath10k_warn("failed to set vdev %d up: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03001528 arvif->vdev_id, ret);
Michal Kaziorc930f742014-01-23 11:38:25 +01001529 return;
1530 }
1531
1532 arvif->is_up = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001533}
1534
1535/*
1536 * FIXME: flush TIDs
1537 */
1538static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1539 struct ieee80211_vif *vif)
1540{
1541 struct ath10k *ar = hw->priv;
1542 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1543 int ret;
1544
Michal Kazior548db542013-07-05 16:15:15 +03001545 lockdep_assert_held(&ar->conf_mutex);
1546
Kalle Valo5e3dd152013-06-12 20:52:10 +03001547 /*
1548 * For some reason, calling VDEV-DOWN before VDEV-STOP
1549 * makes the FW to send frames via HTT after disassociation.
1550 * No idea why this happens, even though VDEV-DOWN is supposed
1551 * to be analogous to link down, so just stop the VDEV.
1552 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03001553 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d stop (disassociated\n",
1554 arvif->vdev_id);
1555
1556 /* FIXME: check return value */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001557 ret = ath10k_vdev_stop(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001558
1559 /*
1560 * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1561 * report beacons from previously associated network through HTT.
1562 * This in turn would spam mac80211 WARN_ON if we bring down all
1563 * interfaces as it expects there is no rx when no interface is
1564 * running.
1565 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03001566 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d down\n", arvif->vdev_id);
1567
1568 /* FIXME: why don't we print error if wmi call fails? */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001569 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001570
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001571 arvif->def_wep_key_idx = 0;
Michal Kaziorc930f742014-01-23 11:38:25 +01001572
1573 arvif->is_started = false;
1574 arvif->is_up = false;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001575}
1576
1577static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02001578 struct ieee80211_sta *sta, bool reassoc)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001579{
Kalle Valob9ada652013-10-16 15:44:46 +03001580 struct wmi_peer_assoc_complete_arg peer_arg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001581 int ret = 0;
1582
Michal Kazior548db542013-07-05 16:15:15 +03001583 lockdep_assert_held(&ar->conf_mutex);
1584
Kalle Valob9ada652013-10-16 15:44:46 +03001585 ret = ath10k_peer_assoc_prepare(ar, arvif, sta, NULL, &peer_arg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001586 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001587 ath10k_warn("failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02001588 sta->addr, arvif->vdev_id, ret);
Kalle Valob9ada652013-10-16 15:44:46 +03001589 return ret;
1590 }
1591
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02001592 peer_arg.peer_reassoc = reassoc;
Kalle Valob9ada652013-10-16 15:44:46 +03001593 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1594 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001595 ath10k_warn("failed to run peer assoc for STA %pM vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001596 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001597 return ret;
1598 }
1599
Michal Kazior90046f52014-02-14 14:45:51 +01001600 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr, &sta->ht_cap);
1601 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001602 ath10k_warn("failed to setup peer SMPS for vdev %d: %d\n",
1603 arvif->vdev_id, ret);
Michal Kazior90046f52014-02-14 14:45:51 +01001604 return ret;
1605 }
1606
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001607 if (!sta->wme) {
1608 arvif->num_legacy_stations++;
1609 ret = ath10k_recalc_rtscts_prot(arvif);
1610 if (ret) {
1611 ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
1612 arvif->vdev_id, ret);
1613 return ret;
1614 }
1615 }
1616
Kalle Valo5e3dd152013-06-12 20:52:10 +03001617 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
1618 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001619 ath10k_warn("failed to install peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001620 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001621 return ret;
1622 }
1623
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001624 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
1625 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001626 ath10k_warn("failed to set qos params for STA %pM for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001627 sta->addr, arvif->vdev_id, ret);
Janusz Dziedzicd3d3ff42014-01-21 07:06:53 +01001628 return ret;
1629 }
1630
Kalle Valo5e3dd152013-06-12 20:52:10 +03001631 return ret;
1632}
1633
1634static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
1635 struct ieee80211_sta *sta)
1636{
1637 int ret = 0;
1638
Michal Kazior548db542013-07-05 16:15:15 +03001639 lockdep_assert_held(&ar->conf_mutex);
1640
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02001641 if (!sta->wme) {
1642 arvif->num_legacy_stations--;
1643 ret = ath10k_recalc_rtscts_prot(arvif);
1644 if (ret) {
1645 ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
1646 arvif->vdev_id, ret);
1647 return ret;
1648 }
1649 }
1650
Kalle Valo5e3dd152013-06-12 20:52:10 +03001651 ret = ath10k_clear_peer_keys(arvif, sta->addr);
1652 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001653 ath10k_warn("failed to clear all peer wep keys for vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02001654 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001655 return ret;
1656 }
1657
1658 return ret;
1659}
1660
1661/**************/
1662/* Regulatory */
1663/**************/
1664
1665static int ath10k_update_channel_list(struct ath10k *ar)
1666{
1667 struct ieee80211_hw *hw = ar->hw;
1668 struct ieee80211_supported_band **bands;
1669 enum ieee80211_band band;
1670 struct ieee80211_channel *channel;
1671 struct wmi_scan_chan_list_arg arg = {0};
1672 struct wmi_channel_arg *ch;
1673 bool passive;
1674 int len;
1675 int ret;
1676 int i;
1677
Michal Kazior548db542013-07-05 16:15:15 +03001678 lockdep_assert_held(&ar->conf_mutex);
1679
Kalle Valo5e3dd152013-06-12 20:52:10 +03001680 bands = hw->wiphy->bands;
1681 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1682 if (!bands[band])
1683 continue;
1684
1685 for (i = 0; i < bands[band]->n_channels; i++) {
1686 if (bands[band]->channels[i].flags &
1687 IEEE80211_CHAN_DISABLED)
1688 continue;
1689
1690 arg.n_channels++;
1691 }
1692 }
1693
1694 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
1695 arg.channels = kzalloc(len, GFP_KERNEL);
1696 if (!arg.channels)
1697 return -ENOMEM;
1698
1699 ch = arg.channels;
1700 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1701 if (!bands[band])
1702 continue;
1703
1704 for (i = 0; i < bands[band]->n_channels; i++) {
1705 channel = &bands[band]->channels[i];
1706
1707 if (channel->flags & IEEE80211_CHAN_DISABLED)
1708 continue;
1709
1710 ch->allow_ht = true;
1711
1712 /* FIXME: when should we really allow VHT? */
1713 ch->allow_vht = true;
1714
1715 ch->allow_ibss =
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001716 !(channel->flags & IEEE80211_CHAN_NO_IR);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001717
1718 ch->ht40plus =
1719 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
1720
Marek Puzyniake8a50f82013-11-20 09:59:47 +02001721 ch->chan_radar =
1722 !!(channel->flags & IEEE80211_CHAN_RADAR);
1723
Luis R. Rodriguez8fe02e12013-10-21 19:22:25 +02001724 passive = channel->flags & IEEE80211_CHAN_NO_IR;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001725 ch->passive = passive;
1726
1727 ch->freq = channel->center_freq;
Michal Kazior89c5c842013-10-23 04:02:13 -07001728 ch->min_power = 0;
Michal Kazior02256932013-10-23 04:02:14 -07001729 ch->max_power = channel->max_power * 2;
1730 ch->max_reg_power = channel->max_reg_power * 2;
1731 ch->max_antenna_gain = channel->max_antenna_gain * 2;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001732 ch->reg_class_id = 0; /* FIXME */
1733
1734 /* FIXME: why use only legacy modes, why not any
1735 * HT/VHT modes? Would that even make any
1736 * difference? */
1737 if (channel->band == IEEE80211_BAND_2GHZ)
1738 ch->mode = MODE_11G;
1739 else
1740 ch->mode = MODE_11A;
1741
1742 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
1743 continue;
1744
1745 ath10k_dbg(ATH10K_DBG_WMI,
Kalle Valo60c3daa2013-09-08 17:56:07 +03001746 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1747 ch - arg.channels, arg.n_channels,
Kalle Valo5e3dd152013-06-12 20:52:10 +03001748 ch->freq, ch->max_power, ch->max_reg_power,
1749 ch->max_antenna_gain, ch->mode);
1750
1751 ch++;
1752 }
1753 }
1754
1755 ret = ath10k_wmi_scan_chan_list(ar, &arg);
1756 kfree(arg.channels);
1757
1758 return ret;
1759}
1760
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001761static enum wmi_dfs_region
1762ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
1763{
1764 switch (dfs_region) {
1765 case NL80211_DFS_UNSET:
1766 return WMI_UNINIT_DFS_DOMAIN;
1767 case NL80211_DFS_FCC:
1768 return WMI_FCC_DFS_DOMAIN;
1769 case NL80211_DFS_ETSI:
1770 return WMI_ETSI_DFS_DOMAIN;
1771 case NL80211_DFS_JP:
1772 return WMI_MKK4_DFS_DOMAIN;
1773 }
1774 return WMI_UNINIT_DFS_DOMAIN;
1775}
1776
Michal Kaziorf7843d72013-07-16 09:38:52 +02001777static void ath10k_regd_update(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001778{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001779 struct reg_dmn_pair_mapping *regpair;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001780 int ret;
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001781 enum wmi_dfs_region wmi_dfs_reg;
1782 enum nl80211_dfs_regions nl_dfs_reg;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001783
Michal Kaziorf7843d72013-07-16 09:38:52 +02001784 lockdep_assert_held(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001785
1786 ret = ath10k_update_channel_list(ar);
1787 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02001788 ath10k_warn("failed to update channel list: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001789
1790 regpair = ar->ath_common.regulatory.regpair;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001791
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001792 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1793 nl_dfs_reg = ar->dfs_detector->region;
1794 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
1795 } else {
1796 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
1797 }
1798
Kalle Valo5e3dd152013-06-12 20:52:10 +03001799 /* Target allows setting up per-band regdomain but ath_common provides
1800 * a combined one only */
1801 ret = ath10k_wmi_pdev_set_regdomain(ar,
Kalle Valoef8c0012014-02-13 18:13:12 +02001802 regpair->reg_domain,
1803 regpair->reg_domain, /* 2ghz */
1804 regpair->reg_domain, /* 5ghz */
Kalle Valo5e3dd152013-06-12 20:52:10 +03001805 regpair->reg_2ghz_ctl,
Marek Puzyniak821af6a2014-03-21 17:46:57 +02001806 regpair->reg_5ghz_ctl,
1807 wmi_dfs_reg);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001808 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02001809 ath10k_warn("failed to set pdev regdomain: %d\n", ret);
Michal Kaziorf7843d72013-07-16 09:38:52 +02001810}
Michal Kazior548db542013-07-05 16:15:15 +03001811
Michal Kaziorf7843d72013-07-16 09:38:52 +02001812static void ath10k_reg_notifier(struct wiphy *wiphy,
1813 struct regulatory_request *request)
1814{
1815 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1816 struct ath10k *ar = hw->priv;
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001817 bool result;
Michal Kaziorf7843d72013-07-16 09:38:52 +02001818
1819 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
1820
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001821 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1822 ath10k_dbg(ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
1823 request->dfs_region);
1824 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
1825 request->dfs_region);
1826 if (!result)
Kalle Valobe6546f2014-03-25 14:18:51 +02001827 ath10k_warn("DFS region 0x%X not supported, will trigger radar for every pulse\n",
Janusz Dziedzic9702c682013-11-20 09:59:41 +02001828 request->dfs_region);
1829 }
1830
Michal Kaziorf7843d72013-07-16 09:38:52 +02001831 mutex_lock(&ar->conf_mutex);
1832 if (ar->state == ATH10K_STATE_ON)
1833 ath10k_regd_update(ar);
Michal Kazior548db542013-07-05 16:15:15 +03001834 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001835}
1836
1837/***************/
1838/* TX handlers */
1839/***************/
1840
Michal Kazior42c3aa62013-10-02 11:03:38 +02001841static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1842{
1843 if (ieee80211_is_mgmt(hdr->frame_control))
1844 return HTT_DATA_TX_EXT_TID_MGMT;
1845
1846 if (!ieee80211_is_data_qos(hdr->frame_control))
1847 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1848
1849 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
1850 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1851
1852 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1853}
1854
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001855static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar,
1856 struct ieee80211_tx_info *info)
1857{
1858 if (info->control.vif)
1859 return ath10k_vif_to_arvif(info->control.vif)->vdev_id;
1860
Michal Kazior1bbc0972014-04-08 09:45:47 +03001861 if (ar->monitor_started)
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001862 return ar->monitor_vdev_id;
1863
Kalle Valobe6546f2014-03-25 14:18:51 +02001864 ath10k_warn("failed to resolve vdev id\n");
Michal Kaziorddb6ad72013-10-02 11:03:39 +02001865 return 0;
1866}
1867
Michal Kazior4b604552014-07-21 21:03:09 +03001868/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
1869 * Control in the header.
Kalle Valo5e3dd152013-06-12 20:52:10 +03001870 */
Michal Kazior4b604552014-07-21 21:03:09 +03001871static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001872{
1873 struct ieee80211_hdr *hdr = (void *)skb->data;
1874 u8 *qos_ctl;
1875
1876 if (!ieee80211_is_data_qos(hdr->frame_control))
1877 return;
1878
1879 qos_ctl = ieee80211_get_qos_ctl(hdr);
Michal Kaziorba0ccd72013-07-22 14:25:28 +02001880 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1881 skb->data, (void *)qos_ctl - (void *)skb->data);
1882 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001883}
1884
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001885static void ath10k_tx_wep_key_work(struct work_struct *work)
1886{
1887 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
1888 wep_key_work);
1889 int ret, keyidx = arvif->def_wep_key_newidx;
1890
Michal Kazior911e6c02014-05-26 12:46:03 +03001891 mutex_lock(&arvif->ar->conf_mutex);
1892
1893 if (arvif->ar->state != ATH10K_STATE_ON)
1894 goto unlock;
1895
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001896 if (arvif->def_wep_key_idx == keyidx)
Michal Kazior911e6c02014-05-26 12:46:03 +03001897 goto unlock;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001898
1899 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
1900 arvif->vdev_id, keyidx);
1901
1902 ret = ath10k_wmi_vdev_set_param(arvif->ar,
1903 arvif->vdev_id,
1904 arvif->ar->wmi.vdev_param->def_keyid,
1905 keyidx);
1906 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001907 ath10k_warn("failed to update wep key index for vdev %d: %d\n",
1908 arvif->vdev_id,
1909 ret);
Michal Kazior911e6c02014-05-26 12:46:03 +03001910 goto unlock;
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001911 }
1912
1913 arvif->def_wep_key_idx = keyidx;
Michal Kazior911e6c02014-05-26 12:46:03 +03001914
1915unlock:
1916 mutex_unlock(&arvif->ar->conf_mutex);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001917}
1918
Michal Kazior4b604552014-07-21 21:03:09 +03001919static void ath10k_tx_h_update_wep_key(struct ieee80211_vif *vif,
1920 struct ieee80211_key_conf *key,
1921 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001922{
Kalle Valo5e3dd152013-06-12 20:52:10 +03001923 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1924 struct ath10k *ar = arvif->ar;
1925 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001926
Kalle Valo5e3dd152013-06-12 20:52:10 +03001927 if (!ieee80211_has_protected(hdr->frame_control))
1928 return;
1929
1930 if (!key)
1931 return;
1932
1933 if (key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
1934 key->cipher != WLAN_CIPHER_SUITE_WEP104)
1935 return;
1936
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001937 if (key->keyidx == arvif->def_wep_key_idx)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001938 return;
1939
Michal Kaziorcc4827b2013-10-16 15:44:45 +03001940 /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1941 * queueing frames until key index is updated is not an option because
1942 * sk_buff may need more processing to be done, e.g. offchannel */
1943 arvif->def_wep_key_newidx = key->keyidx;
1944 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001945}
1946
Michal Kazior4b604552014-07-21 21:03:09 +03001947static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
1948 struct ieee80211_vif *vif,
1949 struct sk_buff *skb)
Kalle Valo5e3dd152013-06-12 20:52:10 +03001950{
1951 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001952 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1953
1954 /* This is case only for P2P_GO */
1955 if (arvif->vdev_type != WMI_VDEV_TYPE_AP ||
1956 arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1957 return;
1958
1959 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
1960 spin_lock_bh(&ar->data_lock);
1961 if (arvif->u.ap.noa_data)
1962 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
1963 GFP_ATOMIC))
1964 memcpy(skb_put(skb, arvif->u.ap.noa_len),
1965 arvif->u.ap.noa_data,
1966 arvif->u.ap.noa_len);
1967 spin_unlock_bh(&ar->data_lock);
1968 }
1969}
1970
1971static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
1972{
1973 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001974 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001975
Michal Kazior961d4c32013-08-09 10:13:34 +02001976 if (ar->htt.target_version_major >= 3) {
1977 /* Since HTT 3.0 there is no separate mgmt tx command */
1978 ret = ath10k_htt_tx(&ar->htt, skb);
1979 goto exit;
1980 }
1981
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001982 if (ieee80211_is_mgmt(hdr->frame_control)) {
1983 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1984 ar->fw_features)) {
1985 if (skb_queue_len(&ar->wmi_mgmt_tx_queue) >=
1986 ATH10K_MAX_NUM_MGMT_PENDING) {
Kalle Valobe6546f2014-03-25 14:18:51 +02001987 ath10k_warn("reached WMI management tranmist queue limit\n");
Bartosz Markowski5e00d312013-09-26 17:47:12 +02001988 ret = -EBUSY;
1989 goto exit;
1990 }
1991
1992 skb_queue_tail(&ar->wmi_mgmt_tx_queue, skb);
1993 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
1994 } else {
1995 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
1996 }
1997 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
1998 ar->fw_features) &&
1999 ieee80211_is_nullfunc(hdr->frame_control)) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002000 /* FW does not report tx status properly for NullFunc frames
2001 * unless they are sent through mgmt tx path. mac80211 sends
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002002 * those frames when it detects link/beacon loss and depends
2003 * on the tx status to be correct. */
Michal Kazioredb82362013-07-05 16:15:14 +03002004 ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002005 } else {
Michal Kazioredb82362013-07-05 16:15:14 +03002006 ret = ath10k_htt_tx(&ar->htt, skb);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002007 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002008
Michal Kazior961d4c32013-08-09 10:13:34 +02002009exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03002010 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002011 ath10k_warn("failed to transmit packet, dropping: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002012 ieee80211_free_txskb(ar->hw, skb);
2013 }
2014}
2015
2016void ath10k_offchan_tx_purge(struct ath10k *ar)
2017{
2018 struct sk_buff *skb;
2019
2020 for (;;) {
2021 skb = skb_dequeue(&ar->offchan_tx_queue);
2022 if (!skb)
2023 break;
2024
2025 ieee80211_free_txskb(ar->hw, skb);
2026 }
2027}
2028
2029void ath10k_offchan_tx_work(struct work_struct *work)
2030{
2031 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
2032 struct ath10k_peer *peer;
2033 struct ieee80211_hdr *hdr;
2034 struct sk_buff *skb;
2035 const u8 *peer_addr;
2036 int vdev_id;
2037 int ret;
2038
2039 /* FW requirement: We must create a peer before FW will send out
2040 * an offchannel frame. Otherwise the frame will be stuck and
2041 * never transmitted. We delete the peer upon tx completion.
2042 * It is unlikely that a peer for offchannel tx will already be
2043 * present. However it may be in some rare cases so account for that.
2044 * Otherwise we might remove a legitimate peer and break stuff. */
2045
2046 for (;;) {
2047 skb = skb_dequeue(&ar->offchan_tx_queue);
2048 if (!skb)
2049 break;
2050
2051 mutex_lock(&ar->conf_mutex);
2052
Kalle Valo60c3daa2013-09-08 17:56:07 +03002053 ath10k_dbg(ATH10K_DBG_MAC, "mac offchannel skb %p\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002054 skb);
2055
2056 hdr = (struct ieee80211_hdr *)skb->data;
2057 peer_addr = ieee80211_get_DA(hdr);
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002058 vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002059
2060 spin_lock_bh(&ar->data_lock);
2061 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
2062 spin_unlock_bh(&ar->data_lock);
2063
2064 if (peer)
Kalle Valo60c3daa2013-09-08 17:56:07 +03002065 /* FIXME: should this use ath10k_warn()? */
Kalle Valo5e3dd152013-06-12 20:52:10 +03002066 ath10k_dbg(ATH10K_DBG_MAC, "peer %pM on vdev %d already present\n",
2067 peer_addr, vdev_id);
2068
2069 if (!peer) {
2070 ret = ath10k_peer_create(ar, vdev_id, peer_addr);
2071 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002072 ath10k_warn("failed to create peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002073 peer_addr, vdev_id, ret);
2074 }
2075
2076 spin_lock_bh(&ar->data_lock);
Wolfram Sang16735d02013-11-14 14:32:02 -08002077 reinit_completion(&ar->offchan_tx_completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002078 ar->offchan_tx_skb = skb;
2079 spin_unlock_bh(&ar->data_lock);
2080
2081 ath10k_tx_htt(ar, skb);
2082
2083 ret = wait_for_completion_timeout(&ar->offchan_tx_completed,
2084 3 * HZ);
2085 if (ret <= 0)
2086 ath10k_warn("timed out waiting for offchannel skb %p\n",
2087 skb);
2088
2089 if (!peer) {
2090 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
2091 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002092 ath10k_warn("failed to delete peer %pM on vdev %d: %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002093 peer_addr, vdev_id, ret);
2094 }
2095
2096 mutex_unlock(&ar->conf_mutex);
2097 }
2098}
2099
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002100void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
2101{
2102 struct sk_buff *skb;
2103
2104 for (;;) {
2105 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2106 if (!skb)
2107 break;
2108
2109 ieee80211_free_txskb(ar->hw, skb);
2110 }
2111}
2112
2113void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
2114{
2115 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
2116 struct sk_buff *skb;
2117 int ret;
2118
2119 for (;;) {
2120 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
2121 if (!skb)
2122 break;
2123
2124 ret = ath10k_wmi_mgmt_tx(ar, skb);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002125 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002126 ath10k_warn("failed to transmit management frame via WMI: %d\n",
2127 ret);
Michal Kazior5fb5e412013-10-28 07:18:13 +01002128 ieee80211_free_txskb(ar->hw, skb);
2129 }
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002130 }
2131}
2132
Kalle Valo5e3dd152013-06-12 20:52:10 +03002133/************/
2134/* Scanning */
2135/************/
2136
2137/*
2138 * This gets called if we dont get a heart-beat during scan.
2139 * This may indicate the FW has hung and we need to abort the
2140 * scan manually to prevent cancel_hw_scan() from deadlocking
2141 */
2142void ath10k_reset_scan(unsigned long ptr)
2143{
2144 struct ath10k *ar = (struct ath10k *)ptr;
2145
2146 spin_lock_bh(&ar->data_lock);
2147 if (!ar->scan.in_progress) {
2148 spin_unlock_bh(&ar->data_lock);
2149 return;
2150 }
2151
Kalle Valobe6546f2014-03-25 14:18:51 +02002152 ath10k_warn("scan timed out, firmware problem?\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002153
2154 if (ar->scan.is_roc)
2155 ieee80211_remain_on_channel_expired(ar->hw);
2156 else
2157 ieee80211_scan_completed(ar->hw, 1 /* aborted */);
2158
2159 ar->scan.in_progress = false;
2160 complete_all(&ar->scan.completed);
2161 spin_unlock_bh(&ar->data_lock);
2162}
2163
2164static int ath10k_abort_scan(struct ath10k *ar)
2165{
2166 struct wmi_stop_scan_arg arg = {
2167 .req_id = 1, /* FIXME */
2168 .req_type = WMI_SCAN_STOP_ONE,
2169 .u.scan_id = ATH10K_SCAN_ID,
2170 };
2171 int ret;
2172
2173 lockdep_assert_held(&ar->conf_mutex);
2174
2175 del_timer_sync(&ar->scan.timeout);
2176
2177 spin_lock_bh(&ar->data_lock);
2178 if (!ar->scan.in_progress) {
2179 spin_unlock_bh(&ar->data_lock);
2180 return 0;
2181 }
2182
2183 ar->scan.aborting = true;
2184 spin_unlock_bh(&ar->data_lock);
2185
2186 ret = ath10k_wmi_stop_scan(ar, &arg);
2187 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002188 ath10k_warn("failed to stop wmi scan: %d\n", ret);
Michal Kazioradb8c9b2013-07-05 16:15:16 +03002189 spin_lock_bh(&ar->data_lock);
2190 ar->scan.in_progress = false;
2191 ath10k_offchan_tx_purge(ar);
2192 spin_unlock_bh(&ar->data_lock);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002193 return -EIO;
2194 }
2195
Kalle Valo5e3dd152013-06-12 20:52:10 +03002196 ret = wait_for_completion_timeout(&ar->scan.completed, 3*HZ);
2197 if (ret == 0)
2198 ath10k_warn("timed out while waiting for scan to stop\n");
2199
2200 /* scan completion may be done right after we timeout here, so let's
2201 * check the in_progress and tell mac80211 scan is completed. if we
2202 * don't do that and FW fails to send us scan completion indication
2203 * then userspace won't be able to scan anymore */
2204 ret = 0;
2205
2206 spin_lock_bh(&ar->data_lock);
2207 if (ar->scan.in_progress) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002208 ath10k_warn("failed to stop scan, it's still in progress\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03002209 ar->scan.in_progress = false;
2210 ath10k_offchan_tx_purge(ar);
2211 ret = -ETIMEDOUT;
2212 }
2213 spin_unlock_bh(&ar->data_lock);
2214
2215 return ret;
2216}
2217
2218static int ath10k_start_scan(struct ath10k *ar,
2219 const struct wmi_start_scan_arg *arg)
2220{
2221 int ret;
2222
2223 lockdep_assert_held(&ar->conf_mutex);
2224
2225 ret = ath10k_wmi_start_scan(ar, arg);
2226 if (ret)
2227 return ret;
2228
Kalle Valo5e3dd152013-06-12 20:52:10 +03002229 ret = wait_for_completion_timeout(&ar->scan.started, 1*HZ);
2230 if (ret == 0) {
2231 ath10k_abort_scan(ar);
2232 return ret;
2233 }
2234
2235 /* the scan can complete earlier, before we even
2236 * start the timer. in that case the timer handler
2237 * checks ar->scan.in_progress and bails out if its
2238 * false. Add a 200ms margin to account event/command
2239 * processing. */
2240 mod_timer(&ar->scan.timeout, jiffies +
2241 msecs_to_jiffies(arg->max_scan_time+200));
2242 return 0;
2243}
2244
2245/**********************/
2246/* mac80211 callbacks */
2247/**********************/
2248
2249static void ath10k_tx(struct ieee80211_hw *hw,
2250 struct ieee80211_tx_control *control,
2251 struct sk_buff *skb)
2252{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002253 struct ath10k *ar = hw->priv;
Michal Kazior4b604552014-07-21 21:03:09 +03002254 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2255 struct ieee80211_vif *vif = info->control.vif;
2256 struct ieee80211_key_conf *key = info->control.hw_key;
2257 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002258
2259 /* We should disable CCK RATE due to P2P */
2260 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2261 ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2262
Michal Kazior4b604552014-07-21 21:03:09 +03002263 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2264 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
2265 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, info);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002266
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002267 /* it makes no sense to process injected frames like that */
Michal Kazior4b604552014-07-21 21:03:09 +03002268 if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
2269 ath10k_tx_h_nwifi(hw, skb);
2270 ath10k_tx_h_update_wep_key(vif, key, skb);
2271 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
2272 ath10k_tx_h_seq_no(vif, skb);
Michal Kaziorcf84bd42013-07-16 11:04:54 +02002273 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002274
Kalle Valo5e3dd152013-06-12 20:52:10 +03002275 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2276 spin_lock_bh(&ar->data_lock);
2277 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
Bartosz Markowski5e00d312013-09-26 17:47:12 +02002278 ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002279 spin_unlock_bh(&ar->data_lock);
2280
2281 ath10k_dbg(ATH10K_DBG_MAC, "queued offchannel skb %p\n", skb);
2282
2283 skb_queue_tail(&ar->offchan_tx_queue, skb);
2284 ieee80211_queue_work(hw, &ar->offchan_tx_work);
2285 return;
2286 }
2287
2288 ath10k_tx_htt(ar, skb);
2289}
2290
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002291/* Must not be called with conf_mutex held as workers can use that also. */
2292static void ath10k_drain_tx(struct ath10k *ar)
2293{
2294 /* make sure rcu-protected mac80211 tx path itself is drained */
2295 synchronize_net();
2296
2297 ath10k_offchan_tx_purge(ar);
2298 ath10k_mgmt_over_wmi_tx_purge(ar);
2299
2300 cancel_work_sync(&ar->offchan_tx_work);
2301 cancel_work_sync(&ar->wmi_mgmt_tx_work);
2302}
2303
Michal Kazioraffd3212013-07-16 09:54:35 +02002304void ath10k_halt(struct ath10k *ar)
Michal Kazior818bdd12013-07-16 09:38:57 +02002305{
Michal Kaziord9bc4b92014-04-23 19:30:06 +03002306 struct ath10k_vif *arvif;
2307
Michal Kazior818bdd12013-07-16 09:38:57 +02002308 lockdep_assert_held(&ar->conf_mutex);
2309
Michal Kazior1bbc0972014-04-08 09:45:47 +03002310 if (ath10k_monitor_is_enabled(ar)) {
2311 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
2312 ar->promisc = false;
2313 ar->monitor = false;
2314 ath10k_monitor_stop(ar);
2315 }
2316
Michal Kazior818bdd12013-07-16 09:38:57 +02002317 del_timer_sync(&ar->scan.timeout);
Michal Kaziorc5058f52014-05-26 12:46:03 +03002318 ath10k_reset_scan((unsigned long)ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02002319 ath10k_peer_cleanup_all(ar);
2320 ath10k_core_stop(ar);
2321 ath10k_hif_power_down(ar);
2322
2323 spin_lock_bh(&ar->data_lock);
Michal Kaziord9bc4b92014-04-23 19:30:06 +03002324 list_for_each_entry(arvif, &ar->arvifs, list) {
2325 if (!arvif->beacon)
2326 continue;
2327
2328 dma_unmap_single(arvif->ar->dev,
2329 ATH10K_SKB_CB(arvif->beacon)->paddr,
2330 arvif->beacon->len, DMA_TO_DEVICE);
2331 dev_kfree_skb_any(arvif->beacon);
2332 arvif->beacon = NULL;
2333 }
Michal Kazior818bdd12013-07-16 09:38:57 +02002334 spin_unlock_bh(&ar->data_lock);
2335}
2336
Ben Greear46acf7b2014-05-16 17:15:38 +03002337static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
2338{
2339 struct ath10k *ar = hw->priv;
2340
2341 mutex_lock(&ar->conf_mutex);
2342
2343 if (ar->cfg_tx_chainmask) {
2344 *tx_ant = ar->cfg_tx_chainmask;
2345 *rx_ant = ar->cfg_rx_chainmask;
2346 } else {
2347 *tx_ant = ar->supp_tx_chainmask;
2348 *rx_ant = ar->supp_rx_chainmask;
2349 }
2350
2351 mutex_unlock(&ar->conf_mutex);
2352
2353 return 0;
2354}
2355
2356static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
2357{
2358 int ret;
2359
2360 lockdep_assert_held(&ar->conf_mutex);
2361
2362 ar->cfg_tx_chainmask = tx_ant;
2363 ar->cfg_rx_chainmask = rx_ant;
2364
2365 if ((ar->state != ATH10K_STATE_ON) &&
2366 (ar->state != ATH10K_STATE_RESTARTED))
2367 return 0;
2368
2369 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
2370 tx_ant);
2371 if (ret) {
2372 ath10k_warn("failed to set tx-chainmask: %d, req 0x%x\n",
2373 ret, tx_ant);
2374 return ret;
2375 }
2376
2377 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
2378 rx_ant);
2379 if (ret) {
2380 ath10k_warn("failed to set rx-chainmask: %d, req 0x%x\n",
2381 ret, rx_ant);
2382 return ret;
2383 }
2384
2385 return 0;
2386}
2387
2388static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
2389{
2390 struct ath10k *ar = hw->priv;
2391 int ret;
2392
2393 mutex_lock(&ar->conf_mutex);
2394 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
2395 mutex_unlock(&ar->conf_mutex);
2396 return ret;
2397}
2398
Kalle Valo5e3dd152013-06-12 20:52:10 +03002399static int ath10k_start(struct ieee80211_hw *hw)
2400{
2401 struct ath10k *ar = hw->priv;
Michal Kazior818bdd12013-07-16 09:38:57 +02002402 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002403
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002404 /*
2405 * This makes sense only when restarting hw. It is harmless to call
2406 * uncoditionally. This is necessary to make sure no HTT/WMI tx
2407 * commands will be submitted while restarting.
2408 */
2409 ath10k_drain_tx(ar);
2410
Michal Kazior548db542013-07-05 16:15:15 +03002411 mutex_lock(&ar->conf_mutex);
2412
Michal Kaziorc5058f52014-05-26 12:46:03 +03002413 switch (ar->state) {
2414 case ATH10K_STATE_OFF:
2415 ar->state = ATH10K_STATE_ON;
2416 break;
2417 case ATH10K_STATE_RESTARTING:
2418 ath10k_halt(ar);
2419 ar->state = ATH10K_STATE_RESTARTED;
2420 break;
2421 case ATH10K_STATE_ON:
2422 case ATH10K_STATE_RESTARTED:
2423 case ATH10K_STATE_WEDGED:
2424 WARN_ON(1);
Michal Kazior818bdd12013-07-16 09:38:57 +02002425 ret = -EINVAL;
Michal Kaziorae254432014-05-26 12:46:02 +03002426 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02002427 }
2428
2429 ret = ath10k_hif_power_up(ar);
2430 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002431 ath10k_err("Could not init hif: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002432 goto err_off;
Michal Kazior818bdd12013-07-16 09:38:57 +02002433 }
2434
2435 ret = ath10k_core_start(ar);
2436 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002437 ath10k_err("Could not init core: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002438 goto err_power_down;
Michal Kazior818bdd12013-07-16 09:38:57 +02002439 }
2440
Bartosz Markowski226a3392013-09-26 17:47:16 +02002441 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03002442 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002443 ath10k_warn("failed to enable PMF QOS: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002444 goto err_core_stop;
2445 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002446
Michal Kaziorc4dd0d02013-11-13 11:05:10 +01002447 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->dynamic_bw, 1);
Michal Kaziorae254432014-05-26 12:46:02 +03002448 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002449 ath10k_warn("failed to enable dynamic BW: %d\n", ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002450 goto err_core_stop;
2451 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002452
Ben Greear46acf7b2014-05-16 17:15:38 +03002453 if (ar->cfg_tx_chainmask)
2454 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask,
2455 ar->cfg_rx_chainmask);
2456
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002457 /*
2458 * By default FW set ARP frames ac to voice (6). In that case ARP
2459 * exchange is not working properly for UAPSD enabled AP. ARP requests
2460 * which arrives with access category 0 are processed by network stack
2461 * and send back with access category 0, but FW changes access category
2462 * to 6. Set ARP frames access category to best effort (0) solves
2463 * this problem.
2464 */
2465
2466 ret = ath10k_wmi_pdev_set_param(ar,
2467 ar->wmi.pdev_param->arp_ac_override, 0);
2468 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002469 ath10k_warn("failed to set arp ac override parameter: %d\n",
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002470 ret);
Michal Kaziorae254432014-05-26 12:46:02 +03002471 goto err_core_stop;
Marek Puzyniakab6258e2014-01-29 15:03:31 +02002472 }
2473
Michal Kaziord6500972014-04-08 09:56:09 +03002474 ar->num_started_vdevs = 0;
Michal Kaziorf7843d72013-07-16 09:38:52 +02002475 ath10k_regd_update(ar);
2476
Michal Kaziorae254432014-05-26 12:46:02 +03002477 mutex_unlock(&ar->conf_mutex);
2478 return 0;
2479
2480err_core_stop:
2481 ath10k_core_stop(ar);
2482
2483err_power_down:
2484 ath10k_hif_power_down(ar);
2485
2486err_off:
2487 ar->state = ATH10K_STATE_OFF;
2488
2489err:
Michal Kazior548db542013-07-05 16:15:15 +03002490 mutex_unlock(&ar->conf_mutex);
Michal Kaziorc60bdd82014-01-29 07:26:31 +01002491 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002492}
2493
2494static void ath10k_stop(struct ieee80211_hw *hw)
2495{
2496 struct ath10k *ar = hw->priv;
2497
Michal Kaziorbca7baf2014-05-26 12:46:03 +03002498 ath10k_drain_tx(ar);
2499
Michal Kazior548db542013-07-05 16:15:15 +03002500 mutex_lock(&ar->conf_mutex);
Michal Kaziorc5058f52014-05-26 12:46:03 +03002501 if (ar->state != ATH10K_STATE_OFF) {
Michal Kazior818bdd12013-07-16 09:38:57 +02002502 ath10k_halt(ar);
Michal Kaziorc5058f52014-05-26 12:46:03 +03002503 ar->state = ATH10K_STATE_OFF;
2504 }
Michal Kazior548db542013-07-05 16:15:15 +03002505 mutex_unlock(&ar->conf_mutex);
2506
Michal Kazioraffd3212013-07-16 09:54:35 +02002507 cancel_work_sync(&ar->restart_work);
2508}
2509
Michal Kaziorad088bf2013-10-16 15:44:46 +03002510static int ath10k_config_ps(struct ath10k *ar)
Michal Kazioraffd3212013-07-16 09:54:35 +02002511{
Michal Kaziorad088bf2013-10-16 15:44:46 +03002512 struct ath10k_vif *arvif;
2513 int ret = 0;
Michal Kazioraffd3212013-07-16 09:54:35 +02002514
2515 lockdep_assert_held(&ar->conf_mutex);
2516
Michal Kaziorad088bf2013-10-16 15:44:46 +03002517 list_for_each_entry(arvif, &ar->arvifs, list) {
2518 ret = ath10k_mac_vif_setup_ps(arvif);
2519 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002520 ath10k_warn("failed to setup powersave: %d\n", ret);
Michal Kaziorad088bf2013-10-16 15:44:46 +03002521 break;
2522 }
2523 }
Michal Kazioraffd3212013-07-16 09:54:35 +02002524
Michal Kaziorad088bf2013-10-16 15:44:46 +03002525 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002526}
2527
Michal Kaziorc930f742014-01-23 11:38:25 +01002528static const char *chandef_get_width(enum nl80211_chan_width width)
2529{
2530 switch (width) {
2531 case NL80211_CHAN_WIDTH_20_NOHT:
2532 return "20 (noht)";
2533 case NL80211_CHAN_WIDTH_20:
2534 return "20";
2535 case NL80211_CHAN_WIDTH_40:
2536 return "40";
2537 case NL80211_CHAN_WIDTH_80:
2538 return "80";
2539 case NL80211_CHAN_WIDTH_80P80:
2540 return "80+80";
2541 case NL80211_CHAN_WIDTH_160:
2542 return "160";
2543 case NL80211_CHAN_WIDTH_5:
2544 return "5";
2545 case NL80211_CHAN_WIDTH_10:
2546 return "10";
2547 }
2548 return "?";
2549}
2550
2551static void ath10k_config_chan(struct ath10k *ar)
2552{
2553 struct ath10k_vif *arvif;
Michal Kaziorc930f742014-01-23 11:38:25 +01002554 int ret;
2555
2556 lockdep_assert_held(&ar->conf_mutex);
2557
2558 ath10k_dbg(ATH10K_DBG_MAC,
2559 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2560 ar->chandef.chan->center_freq,
2561 ar->chandef.center_freq1,
2562 ar->chandef.center_freq2,
2563 chandef_get_width(ar->chandef.width));
2564
2565 /* First stop monitor interface. Some FW versions crash if there's a
2566 * lone monitor interface. */
Michal Kazior1bbc0972014-04-08 09:45:47 +03002567 if (ar->monitor_started)
2568 ath10k_monitor_vdev_stop(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002569
2570 list_for_each_entry(arvif, &ar->arvifs, list) {
2571 if (!arvif->is_started)
2572 continue;
2573
2574 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2575 continue;
2576
2577 ret = ath10k_vdev_stop(arvif);
2578 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002579 ath10k_warn("failed to stop vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002580 arvif->vdev_id, ret);
2581 continue;
2582 }
2583 }
2584
2585 /* all vdevs are now stopped - now attempt to restart them */
2586
2587 list_for_each_entry(arvif, &ar->arvifs, list) {
2588 if (!arvif->is_started)
2589 continue;
2590
2591 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
2592 continue;
2593
2594 ret = ath10k_vdev_start(arvif);
2595 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002596 ath10k_warn("failed to start vdev %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002597 arvif->vdev_id, ret);
2598 continue;
2599 }
2600
2601 if (!arvif->is_up)
2602 continue;
2603
2604 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
2605 arvif->bssid);
2606 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002607 ath10k_warn("failed to bring vdev up %d: %d\n",
Michal Kaziorc930f742014-01-23 11:38:25 +01002608 arvif->vdev_id, ret);
2609 continue;
2610 }
2611 }
2612
Michal Kazior1bbc0972014-04-08 09:45:47 +03002613 if (ath10k_monitor_is_enabled(ar))
2614 ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
Michal Kaziorc930f742014-01-23 11:38:25 +01002615}
2616
Kalle Valo5e3dd152013-06-12 20:52:10 +03002617static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2618{
Kalle Valo5e3dd152013-06-12 20:52:10 +03002619 struct ath10k *ar = hw->priv;
2620 struct ieee80211_conf *conf = &hw->conf;
2621 int ret = 0;
Michal Kazior5474efe2013-10-23 04:02:15 -07002622 u32 param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002623
2624 mutex_lock(&ar->conf_mutex);
2625
2626 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002627 ath10k_dbg(ATH10K_DBG_MAC,
Michal Kaziord6500972014-04-08 09:56:09 +03002628 "mac config channel %dMHz flags 0x%x radar %d\n",
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002629 conf->chandef.chan->center_freq,
Michal Kaziord6500972014-04-08 09:56:09 +03002630 conf->chandef.chan->flags,
2631 conf->radar_enabled);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002632
Kalle Valo5e3dd152013-06-12 20:52:10 +03002633 spin_lock_bh(&ar->data_lock);
2634 ar->rx_channel = conf->chandef.chan;
2635 spin_unlock_bh(&ar->data_lock);
Marek Puzyniake8a50f82013-11-20 09:59:47 +02002636
Michal Kaziord6500972014-04-08 09:56:09 +03002637 ar->radar_enabled = conf->radar_enabled;
2638 ath10k_recalc_radar_detection(ar);
Michal Kaziorc930f742014-01-23 11:38:25 +01002639
2640 if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) {
2641 ar->chandef = conf->chandef;
2642 ath10k_config_chan(ar);
2643 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002644 }
2645
Michal Kazior5474efe2013-10-23 04:02:15 -07002646 if (changed & IEEE80211_CONF_CHANGE_POWER) {
2647 ath10k_dbg(ATH10K_DBG_MAC, "mac config power %d\n",
2648 hw->conf.power_level);
2649
2650 param = ar->wmi.pdev_param->txpower_limit2g;
2651 ret = ath10k_wmi_pdev_set_param(ar, param,
2652 hw->conf.power_level * 2);
2653 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002654 ath10k_warn("failed to set 2g txpower %d: %d\n",
Michal Kazior5474efe2013-10-23 04:02:15 -07002655 hw->conf.power_level, ret);
2656
2657 param = ar->wmi.pdev_param->txpower_limit5g;
2658 ret = ath10k_wmi_pdev_set_param(ar, param,
2659 hw->conf.power_level * 2);
2660 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002661 ath10k_warn("failed to set 5g txpower %d: %d\n",
Michal Kazior5474efe2013-10-23 04:02:15 -07002662 hw->conf.power_level, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002663 }
2664
Michal Kazioraffd3212013-07-16 09:54:35 +02002665 if (changed & IEEE80211_CONF_CHANGE_PS)
2666 ath10k_config_ps(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002667
2668 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
Michal Kazior1bbc0972014-04-08 09:45:47 +03002669 if (conf->flags & IEEE80211_CONF_MONITOR && !ar->monitor) {
2670 ar->monitor = true;
2671 ret = ath10k_monitor_start(ar);
2672 if (ret) {
2673 ath10k_warn("failed to start monitor (config): %d\n",
2674 ret);
2675 ar->monitor = false;
2676 }
2677 } else if (!(conf->flags & IEEE80211_CONF_MONITOR) &&
2678 ar->monitor) {
2679 ar->monitor = false;
2680 ath10k_monitor_stop(ar);
2681 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002682 }
2683
2684 mutex_unlock(&ar->conf_mutex);
2685 return ret;
2686}
2687
2688/*
2689 * TODO:
2690 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2691 * because we will send mgmt frames without CCK. This requirement
2692 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2693 * in the TX packet.
2694 */
2695static int ath10k_add_interface(struct ieee80211_hw *hw,
2696 struct ieee80211_vif *vif)
2697{
2698 struct ath10k *ar = hw->priv;
2699 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2700 enum wmi_sta_powersave_param param;
2701 int ret = 0;
Kalle Valo5a13e762014-01-20 11:01:46 +02002702 u32 value;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002703 int bit;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002704 u32 vdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002705
2706 mutex_lock(&ar->conf_mutex);
2707
Michal Kazior0dbd09e2013-07-31 10:55:14 +02002708 memset(arvif, 0, sizeof(*arvif));
2709
Kalle Valo5e3dd152013-06-12 20:52:10 +03002710 arvif->ar = ar;
2711 arvif->vif = vif;
2712
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002713 INIT_WORK(&arvif->wep_key_work, ath10k_tx_wep_key_work);
Ben Greeare63b33f2013-10-22 14:54:14 -07002714 INIT_LIST_HEAD(&arvif->list);
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002715
Kalle Valo5e3dd152013-06-12 20:52:10 +03002716 bit = ffs(ar->free_vdev_map);
2717 if (bit == 0) {
2718 ret = -EBUSY;
Michal Kazior9dad14a2013-10-16 15:44:45 +03002719 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002720 }
2721
2722 arvif->vdev_id = bit - 1;
2723 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002724
2725 if (ar->p2p)
2726 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
2727
2728 switch (vif->type) {
2729 case NL80211_IFTYPE_UNSPECIFIED:
2730 case NL80211_IFTYPE_STATION:
2731 arvif->vdev_type = WMI_VDEV_TYPE_STA;
2732 if (vif->p2p)
2733 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
2734 break;
2735 case NL80211_IFTYPE_ADHOC:
2736 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
2737 break;
2738 case NL80211_IFTYPE_AP:
2739 arvif->vdev_type = WMI_VDEV_TYPE_AP;
2740
2741 if (vif->p2p)
2742 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
2743 break;
2744 case NL80211_IFTYPE_MONITOR:
2745 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
2746 break;
2747 default:
2748 WARN_ON(1);
2749 break;
2750 }
2751
Kalle Valo60c3daa2013-09-08 17:56:07 +03002752 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03002753 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype);
2754
2755 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
2756 arvif->vdev_subtype, vif->addr);
2757 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002758 ath10k_warn("failed to create WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002759 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002760 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002761 }
2762
Michal Kazior9dad14a2013-10-16 15:44:45 +03002763 ar->free_vdev_map &= ~BIT(arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002764 list_add(&arvif->list, &ar->arvifs);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002765
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002766 vdev_param = ar->wmi.vdev_param->def_keyid;
2767 ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002768 arvif->def_wep_key_idx);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002769 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002770 ath10k_warn("failed to set vdev %i default key id: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002771 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002772 goto err_vdev_delete;
2773 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002774
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002775 vdev_param = ar->wmi.vdev_param->tx_encap_type;
2776 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002777 ATH10K_HW_TXRX_NATIVE_WIFI);
Bartosz Markowskiebc9abd2013-10-15 09:26:20 +02002778 /* 10.X firmware does not support this VDEV parameter. Do not warn */
Michal Kazior9dad14a2013-10-16 15:44:45 +03002779 if (ret && ret != -EOPNOTSUPP) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002780 ath10k_warn("failed to set vdev %i TX encapsulation: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002781 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002782 goto err_vdev_delete;
2783 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002784
2785 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2786 ret = ath10k_peer_create(ar, arvif->vdev_id, vif->addr);
2787 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002788 ath10k_warn("failed to create vdev %i peer for AP: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002789 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002790 goto err_vdev_delete;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002791 }
Marek Puzyniakcdf07402013-12-30 09:07:51 +01002792
Kalle Valo5a13e762014-01-20 11:01:46 +02002793 ret = ath10k_mac_set_kickout(arvif);
2794 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002795 ath10k_warn("failed to set vdev %i kickout parameters: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002796 arvif->vdev_id, ret);
Kalle Valo5a13e762014-01-20 11:01:46 +02002797 goto err_peer_delete;
2798 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002799 }
2800
2801 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
2802 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
2803 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
2804 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2805 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002806 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002807 ath10k_warn("failed to set vdev %i RX wake policy: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002808 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002809 goto err_peer_delete;
2810 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002811
2812 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
2813 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
2814 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2815 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002816 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002817 ath10k_warn("failed to set vdev %i TX wake thresh: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002818 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002819 goto err_peer_delete;
2820 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002821
2822 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
2823 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
2824 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
2825 param, value);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002826 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002827 ath10k_warn("failed to set vdev %i PSPOLL count: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002828 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002829 goto err_peer_delete;
2830 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03002831 }
2832
Michal Kazior424121c2013-07-22 14:13:31 +02002833 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002834 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002835 ath10k_warn("failed to set rts threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03002836 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002837 goto err_peer_delete;
2838 }
Michal Kazior679c54a2013-07-05 16:15:04 +03002839
Michal Kazior424121c2013-07-22 14:13:31 +02002840 ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002841 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02002842 ath10k_warn("failed to set frag threshold for vdev %d: %d\n",
Michal Kazior679c54a2013-07-05 16:15:04 +03002843 arvif->vdev_id, ret);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002844 goto err_peer_delete;
2845 }
Michal Kazior679c54a2013-07-05 16:15:04 +03002846
Kalle Valo5e3dd152013-06-12 20:52:10 +03002847 mutex_unlock(&ar->conf_mutex);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002848 return 0;
2849
2850err_peer_delete:
2851 if (arvif->vdev_type == WMI_VDEV_TYPE_AP)
2852 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
2853
2854err_vdev_delete:
2855 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2856 ar->free_vdev_map &= ~BIT(arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002857 list_del(&arvif->list);
Michal Kazior9dad14a2013-10-16 15:44:45 +03002858
2859err:
2860 mutex_unlock(&ar->conf_mutex);
2861
Kalle Valo5e3dd152013-06-12 20:52:10 +03002862 return ret;
2863}
2864
2865static void ath10k_remove_interface(struct ieee80211_hw *hw,
2866 struct ieee80211_vif *vif)
2867{
2868 struct ath10k *ar = hw->priv;
2869 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2870 int ret;
2871
2872 mutex_lock(&ar->conf_mutex);
2873
Michal Kaziorcc4827b2013-10-16 15:44:45 +03002874 cancel_work_sync(&arvif->wep_key_work);
2875
Michal Kaziored543882013-09-13 14:16:56 +02002876 spin_lock_bh(&ar->data_lock);
2877 if (arvif->beacon) {
Michal Kaziorec6bc552014-04-23 19:30:05 +03002878 dma_unmap_single(arvif->ar->dev,
2879 ATH10K_SKB_CB(arvif->beacon)->paddr,
2880 arvif->beacon->len, DMA_TO_DEVICE);
Michal Kaziored543882013-09-13 14:16:56 +02002881 dev_kfree_skb_any(arvif->beacon);
2882 arvif->beacon = NULL;
2883 }
2884 spin_unlock_bh(&ar->data_lock);
2885
Kalle Valo5e3dd152013-06-12 20:52:10 +03002886 ar->free_vdev_map |= 1 << (arvif->vdev_id);
Michal Kazior05791192013-10-16 15:44:45 +03002887 list_del(&arvif->list);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002888
2889 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
2890 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
2891 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002892 ath10k_warn("failed to remove peer for AP vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002893 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002894
2895 kfree(arvif->u.ap.noa_data);
2896 }
2897
Ben Greear69244e52014-02-27 18:50:00 +02002898 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
Kalle Valo60c3daa2013-09-08 17:56:07 +03002899 arvif->vdev_id);
2900
Kalle Valo5e3dd152013-06-12 20:52:10 +03002901 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
2902 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002903 ath10k_warn("failed to delete WMI vdev %i: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02002904 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002905
Kalle Valo5e3dd152013-06-12 20:52:10 +03002906 ath10k_peer_cleanup(ar, arvif->vdev_id);
2907
2908 mutex_unlock(&ar->conf_mutex);
2909}
2910
2911/*
2912 * FIXME: Has to be verified.
2913 */
2914#define SUPPORTED_FILTERS \
2915 (FIF_PROMISC_IN_BSS | \
2916 FIF_ALLMULTI | \
2917 FIF_CONTROL | \
2918 FIF_PSPOLL | \
2919 FIF_OTHER_BSS | \
2920 FIF_BCN_PRBRESP_PROMISC | \
2921 FIF_PROBE_REQ | \
2922 FIF_FCSFAIL)
2923
2924static void ath10k_configure_filter(struct ieee80211_hw *hw,
2925 unsigned int changed_flags,
2926 unsigned int *total_flags,
2927 u64 multicast)
2928{
2929 struct ath10k *ar = hw->priv;
2930 int ret;
2931
2932 mutex_lock(&ar->conf_mutex);
2933
2934 changed_flags &= SUPPORTED_FILTERS;
2935 *total_flags &= SUPPORTED_FILTERS;
2936 ar->filter_flags = *total_flags;
2937
Michal Kazior1bbc0972014-04-08 09:45:47 +03002938 if (ar->filter_flags & FIF_PROMISC_IN_BSS && !ar->promisc) {
2939 ar->promisc = true;
2940 ret = ath10k_monitor_start(ar);
2941 if (ret) {
2942 ath10k_warn("failed to start monitor (promisc): %d\n",
2943 ret);
2944 ar->promisc = false;
2945 }
2946 } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) && ar->promisc) {
2947 ar->promisc = false;
2948 ath10k_monitor_stop(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002949 }
2950
2951 mutex_unlock(&ar->conf_mutex);
2952}
2953
2954static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
2955 struct ieee80211_vif *vif,
2956 struct ieee80211_bss_conf *info,
2957 u32 changed)
2958{
2959 struct ath10k *ar = hw->priv;
2960 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2961 int ret = 0;
Bartosz Markowski226a3392013-09-26 17:47:16 +02002962 u32 vdev_param, pdev_param;
Kalle Valo5e3dd152013-06-12 20:52:10 +03002963
2964 mutex_lock(&ar->conf_mutex);
2965
2966 if (changed & BSS_CHANGED_IBSS)
2967 ath10k_control_ibss(arvif, info, vif->addr);
2968
2969 if (changed & BSS_CHANGED_BEACON_INT) {
2970 arvif->beacon_interval = info->beacon_int;
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02002971 vdev_param = ar->wmi.vdev_param->beacon_interval;
2972 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002973 arvif->beacon_interval);
Kalle Valo60c3daa2013-09-08 17:56:07 +03002974 ath10k_dbg(ATH10K_DBG_MAC,
2975 "mac vdev %d beacon_interval %d\n",
2976 arvif->vdev_id, arvif->beacon_interval);
2977
Kalle Valo5e3dd152013-06-12 20:52:10 +03002978 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002979 ath10k_warn("failed to set beacon interval for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002980 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002981 }
2982
2983 if (changed & BSS_CHANGED_BEACON) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03002984 ath10k_dbg(ATH10K_DBG_MAC,
2985 "vdev %d set beacon tx mode to staggered\n",
2986 arvif->vdev_id);
2987
Bartosz Markowski226a3392013-09-26 17:47:16 +02002988 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
2989 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03002990 WMI_BEACON_STAGGERED_MODE);
2991 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02002992 ath10k_warn("failed to set beacon mode for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02002993 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03002994 }
2995
John W. Linvilleb70727e2013-06-13 13:34:29 -04002996 if (changed & BSS_CHANGED_BEACON_INFO) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03002997 arvif->dtim_period = info->dtim_period;
2998
Kalle Valo60c3daa2013-09-08 17:56:07 +03002999 ath10k_dbg(ATH10K_DBG_MAC,
3000 "mac vdev %d dtim_period %d\n",
3001 arvif->vdev_id, arvif->dtim_period);
3002
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003003 vdev_param = ar->wmi.vdev_param->dtim_period;
3004 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003005 arvif->dtim_period);
3006 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003007 ath10k_warn("failed to set dtim period for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003008 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003009 }
3010
3011 if (changed & BSS_CHANGED_SSID &&
3012 vif->type == NL80211_IFTYPE_AP) {
3013 arvif->u.ap.ssid_len = info->ssid_len;
3014 if (info->ssid_len)
3015 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
3016 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3017 }
3018
Michal Kazior7b161a72014-05-26 12:46:03 +03003019 /*
3020 * Firmware manages AP self-peer internally so make sure to not create
3021 * it in driver. Otherwise AP self-peer deletion may timeout later.
3022 */
3023 if (changed & BSS_CHANGED_BSSID &&
3024 vif->type != NL80211_IFTYPE_AP) {
Kalle Valo5e3dd152013-06-12 20:52:10 +03003025 if (!is_zero_ether_addr(info->bssid)) {
Kalle Valo60c3daa2013-09-08 17:56:07 +03003026 ath10k_dbg(ATH10K_DBG_MAC,
3027 "mac vdev %d create peer %pM\n",
3028 arvif->vdev_id, info->bssid);
3029
Kalle Valo5e3dd152013-06-12 20:52:10 +03003030 ret = ath10k_peer_create(ar, arvif->vdev_id,
3031 info->bssid);
3032 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003033 ath10k_warn("failed to add peer %pM for vdev %d when changing bssid: %i\n",
Ben Greear479398b2013-11-04 09:19:34 -08003034 info->bssid, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003035
3036 if (vif->type == NL80211_IFTYPE_STATION) {
3037 /*
3038 * this is never erased as we it for crypto key
3039 * clearing; this is FW requirement
3040 */
Michal Kaziorc930f742014-01-23 11:38:25 +01003041 memcpy(arvif->bssid, info->bssid, ETH_ALEN);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003042
Kalle Valo60c3daa2013-09-08 17:56:07 +03003043 ath10k_dbg(ATH10K_DBG_MAC,
3044 "mac vdev %d start %pM\n",
3045 arvif->vdev_id, info->bssid);
3046
Kalle Valo5e3dd152013-06-12 20:52:10 +03003047 ret = ath10k_vdev_start(arvif);
Michal Kaziorc930f742014-01-23 11:38:25 +01003048 if (ret) {
Ben Greear69244e52014-02-27 18:50:00 +02003049 ath10k_warn("failed to start vdev %i: %d\n",
3050 arvif->vdev_id, ret);
Kalle Valo75459e32014-02-13 18:13:12 +02003051 goto exit;
Michal Kaziorc930f742014-01-23 11:38:25 +01003052 }
3053
3054 arvif->is_started = true;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003055 }
3056
3057 /*
3058 * Mac80211 does not keep IBSS bssid when leaving IBSS,
3059 * so driver need to store it. It is needed when leaving
3060 * IBSS in order to remove BSSID peer.
3061 */
3062 if (vif->type == NL80211_IFTYPE_ADHOC)
Michal Kaziorc930f742014-01-23 11:38:25 +01003063 memcpy(arvif->bssid, info->bssid,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003064 ETH_ALEN);
3065 }
3066 }
3067
3068 if (changed & BSS_CHANGED_BEACON_ENABLED)
3069 ath10k_control_beaconing(arvif, info);
3070
3071 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003072 arvif->use_cts_prot = info->use_cts_prot;
Kalle Valo60c3daa2013-09-08 17:56:07 +03003073 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003074 arvif->vdev_id, info->use_cts_prot);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003075
Marek Kwaczynskie81bd102014-03-11 12:58:00 +02003076 ret = ath10k_recalc_rtscts_prot(arvif);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003077 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003078 ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003079 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003080 }
3081
3082 if (changed & BSS_CHANGED_ERP_SLOT) {
3083 u32 slottime;
3084 if (info->use_short_slot)
3085 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3086
3087 else
3088 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3089
Kalle Valo60c3daa2013-09-08 17:56:07 +03003090 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
3091 arvif->vdev_id, slottime);
3092
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003093 vdev_param = ar->wmi.vdev_param->slot_time;
3094 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003095 slottime);
3096 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003097 ath10k_warn("failed to set erp slot for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003098 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003099 }
3100
3101 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3102 u32 preamble;
3103 if (info->use_short_preamble)
3104 preamble = WMI_VDEV_PREAMBLE_SHORT;
3105 else
3106 preamble = WMI_VDEV_PREAMBLE_LONG;
3107
Kalle Valo60c3daa2013-09-08 17:56:07 +03003108 ath10k_dbg(ATH10K_DBG_MAC,
3109 "mac vdev %d preamble %dn",
3110 arvif->vdev_id, preamble);
3111
Bartosz Markowski6d1506e2013-09-26 17:47:15 +02003112 vdev_param = ar->wmi.vdev_param->preamble;
3113 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
Kalle Valo5e3dd152013-06-12 20:52:10 +03003114 preamble);
3115 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003116 ath10k_warn("failed to set preamble for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003117 arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003118 }
3119
3120 if (changed & BSS_CHANGED_ASSOC) {
3121 if (info->assoc)
3122 ath10k_bss_assoc(hw, vif, info);
3123 }
3124
Kalle Valo75459e32014-02-13 18:13:12 +02003125exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003126 mutex_unlock(&ar->conf_mutex);
3127}
3128
3129static int ath10k_hw_scan(struct ieee80211_hw *hw,
3130 struct ieee80211_vif *vif,
David Spinadelc56ef672014-02-05 15:21:13 +02003131 struct ieee80211_scan_request *hw_req)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003132{
3133 struct ath10k *ar = hw->priv;
3134 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
David Spinadelc56ef672014-02-05 15:21:13 +02003135 struct cfg80211_scan_request *req = &hw_req->req;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003136 struct wmi_start_scan_arg arg;
3137 int ret = 0;
3138 int i;
3139
3140 mutex_lock(&ar->conf_mutex);
3141
3142 spin_lock_bh(&ar->data_lock);
3143 if (ar->scan.in_progress) {
3144 spin_unlock_bh(&ar->data_lock);
3145 ret = -EBUSY;
3146 goto exit;
3147 }
3148
Wolfram Sang16735d02013-11-14 14:32:02 -08003149 reinit_completion(&ar->scan.started);
3150 reinit_completion(&ar->scan.completed);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003151 ar->scan.in_progress = true;
3152 ar->scan.aborting = false;
3153 ar->scan.is_roc = false;
3154 ar->scan.vdev_id = arvif->vdev_id;
3155 spin_unlock_bh(&ar->data_lock);
3156
3157 memset(&arg, 0, sizeof(arg));
3158 ath10k_wmi_start_scan_init(ar, &arg);
3159 arg.vdev_id = arvif->vdev_id;
3160 arg.scan_id = ATH10K_SCAN_ID;
3161
3162 if (!req->no_cck)
3163 arg.scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES;
3164
3165 if (req->ie_len) {
3166 arg.ie_len = req->ie_len;
3167 memcpy(arg.ie, req->ie, arg.ie_len);
3168 }
3169
3170 if (req->n_ssids) {
3171 arg.n_ssids = req->n_ssids;
3172 for (i = 0; i < arg.n_ssids; i++) {
3173 arg.ssids[i].len = req->ssids[i].ssid_len;
3174 arg.ssids[i].ssid = req->ssids[i].ssid;
3175 }
Michal Kaziordcd4a562013-07-31 10:55:12 +02003176 } else {
3177 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003178 }
3179
3180 if (req->n_channels) {
3181 arg.n_channels = req->n_channels;
3182 for (i = 0; i < arg.n_channels; i++)
3183 arg.channels[i] = req->channels[i]->center_freq;
3184 }
3185
3186 ret = ath10k_start_scan(ar, &arg);
3187 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003188 ath10k_warn("failed to start hw scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003189 spin_lock_bh(&ar->data_lock);
3190 ar->scan.in_progress = false;
3191 spin_unlock_bh(&ar->data_lock);
3192 }
3193
3194exit:
3195 mutex_unlock(&ar->conf_mutex);
3196 return ret;
3197}
3198
3199static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
3200 struct ieee80211_vif *vif)
3201{
3202 struct ath10k *ar = hw->priv;
3203 int ret;
3204
3205 mutex_lock(&ar->conf_mutex);
3206 ret = ath10k_abort_scan(ar);
3207 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003208 ath10k_warn("failed to abort scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003209 ieee80211_scan_completed(hw, 1 /* aborted */);
3210 }
3211 mutex_unlock(&ar->conf_mutex);
3212}
3213
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003214static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
3215 struct ath10k_vif *arvif,
3216 enum set_key_cmd cmd,
3217 struct ieee80211_key_conf *key)
3218{
3219 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
3220 int ret;
3221
3222 /* 10.1 firmware branch requires default key index to be set to group
3223 * key index after installing it. Otherwise FW/HW Txes corrupted
3224 * frames with multi-vif APs. This is not required for main firmware
3225 * branch (e.g. 636).
3226 *
3227 * FIXME: This has been tested only in AP. It remains unknown if this
3228 * is required for multi-vif STA interfaces on 10.1 */
3229
3230 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
3231 return;
3232
3233 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
3234 return;
3235
3236 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
3237 return;
3238
3239 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3240 return;
3241
3242 if (cmd != SET_KEY)
3243 return;
3244
3245 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
3246 key->keyidx);
3247 if (ret)
Ben Greear69244e52014-02-27 18:50:00 +02003248 ath10k_warn("failed to set vdev %i group key as default key: %d\n",
3249 arvif->vdev_id, ret);
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003250}
3251
Kalle Valo5e3dd152013-06-12 20:52:10 +03003252static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3253 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3254 struct ieee80211_key_conf *key)
3255{
3256 struct ath10k *ar = hw->priv;
3257 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3258 struct ath10k_peer *peer;
3259 const u8 *peer_addr;
3260 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
3261 key->cipher == WLAN_CIPHER_SUITE_WEP104;
3262 int ret = 0;
3263
3264 if (key->keyidx > WMI_MAX_KEY_INDEX)
3265 return -ENOSPC;
3266
3267 mutex_lock(&ar->conf_mutex);
3268
3269 if (sta)
3270 peer_addr = sta->addr;
3271 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3272 peer_addr = vif->bss_conf.bssid;
3273 else
3274 peer_addr = vif->addr;
3275
3276 key->hw_key_idx = key->keyidx;
3277
3278 /* the peer should not disappear in mid-way (unless FW goes awry) since
3279 * we already hold conf_mutex. we just make sure its there now. */
3280 spin_lock_bh(&ar->data_lock);
3281 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3282 spin_unlock_bh(&ar->data_lock);
3283
3284 if (!peer) {
3285 if (cmd == SET_KEY) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003286 ath10k_warn("failed to install key for non-existent peer %pM\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +03003287 peer_addr);
3288 ret = -EOPNOTSUPP;
3289 goto exit;
3290 } else {
3291 /* if the peer doesn't exist there is no key to disable
3292 * anymore */
3293 goto exit;
3294 }
3295 }
3296
3297 if (is_wep) {
3298 if (cmd == SET_KEY)
3299 arvif->wep_keys[key->keyidx] = key;
3300 else
3301 arvif->wep_keys[key->keyidx] = NULL;
3302
3303 if (cmd == DISABLE_KEY)
3304 ath10k_clear_vdev_key(arvif, key);
3305 }
3306
3307 ret = ath10k_install_key(arvif, key, cmd, peer_addr);
3308 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003309 ath10k_warn("failed to install key for vdev %i peer %pM: %d\n",
Ben Greear69244e52014-02-27 18:50:00 +02003310 arvif->vdev_id, peer_addr, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003311 goto exit;
3312 }
3313
Michal Kaziorcfb27d22013-12-02 09:06:36 +01003314 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
3315
Kalle Valo5e3dd152013-06-12 20:52:10 +03003316 spin_lock_bh(&ar->data_lock);
3317 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
3318 if (peer && cmd == SET_KEY)
3319 peer->keys[key->keyidx] = key;
3320 else if (peer && cmd == DISABLE_KEY)
3321 peer->keys[key->keyidx] = NULL;
3322 else if (peer == NULL)
3323 /* impossible unless FW goes crazy */
Kalle Valobe6546f2014-03-25 14:18:51 +02003324 ath10k_warn("Peer %pM disappeared!\n", peer_addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003325 spin_unlock_bh(&ar->data_lock);
3326
3327exit:
3328 mutex_unlock(&ar->conf_mutex);
3329 return ret;
3330}
3331
Michal Kazior9797feb2014-02-14 14:49:48 +01003332static void ath10k_sta_rc_update_wk(struct work_struct *wk)
3333{
3334 struct ath10k *ar;
3335 struct ath10k_vif *arvif;
3336 struct ath10k_sta *arsta;
3337 struct ieee80211_sta *sta;
3338 u32 changed, bw, nss, smps;
3339 int err;
3340
3341 arsta = container_of(wk, struct ath10k_sta, update_wk);
3342 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3343 arvif = arsta->arvif;
3344 ar = arvif->ar;
3345
3346 spin_lock_bh(&ar->data_lock);
3347
3348 changed = arsta->changed;
3349 arsta->changed = 0;
3350
3351 bw = arsta->bw;
3352 nss = arsta->nss;
3353 smps = arsta->smps;
3354
3355 spin_unlock_bh(&ar->data_lock);
3356
3357 mutex_lock(&ar->conf_mutex);
3358
3359 if (changed & IEEE80211_RC_BW_CHANGED) {
3360 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
3361 sta->addr, bw);
3362
3363 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3364 WMI_PEER_CHAN_WIDTH, bw);
3365 if (err)
3366 ath10k_warn("failed to update STA %pM peer bw %d: %d\n",
3367 sta->addr, bw, err);
3368 }
3369
3370 if (changed & IEEE80211_RC_NSS_CHANGED) {
3371 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM nss %d\n",
3372 sta->addr, nss);
3373
3374 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3375 WMI_PEER_NSS, nss);
3376 if (err)
3377 ath10k_warn("failed to update STA %pM nss %d: %d\n",
3378 sta->addr, nss, err);
3379 }
3380
3381 if (changed & IEEE80211_RC_SMPS_CHANGED) {
3382 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM smps %d\n",
3383 sta->addr, smps);
3384
3385 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
3386 WMI_PEER_SMPS_STATE, smps);
3387 if (err)
3388 ath10k_warn("failed to update STA %pM smps %d: %d\n",
3389 sta->addr, smps, err);
3390 }
3391
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003392 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3393 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM supp rates\n",
3394 sta->addr);
3395
3396 err = ath10k_station_assoc(ar, arvif, sta, true);
3397 if (err)
Kalle Valobe6546f2014-03-25 14:18:51 +02003398 ath10k_warn("failed to reassociate station: %pM\n",
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003399 sta->addr);
3400 }
3401
Michal Kazior9797feb2014-02-14 14:49:48 +01003402 mutex_unlock(&ar->conf_mutex);
3403}
3404
Kalle Valo5e3dd152013-06-12 20:52:10 +03003405static int ath10k_sta_state(struct ieee80211_hw *hw,
3406 struct ieee80211_vif *vif,
3407 struct ieee80211_sta *sta,
3408 enum ieee80211_sta_state old_state,
3409 enum ieee80211_sta_state new_state)
3410{
3411 struct ath10k *ar = hw->priv;
3412 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01003413 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003414 int max_num_peers;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003415 int ret = 0;
3416
Michal Kazior76f90022014-02-25 09:29:57 +02003417 if (old_state == IEEE80211_STA_NOTEXIST &&
3418 new_state == IEEE80211_STA_NONE) {
3419 memset(arsta, 0, sizeof(*arsta));
3420 arsta->arvif = arvif;
3421 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
3422 }
3423
Michal Kazior9797feb2014-02-14 14:49:48 +01003424 /* cancel must be done outside the mutex to avoid deadlock */
3425 if ((old_state == IEEE80211_STA_NONE &&
3426 new_state == IEEE80211_STA_NOTEXIST))
3427 cancel_work_sync(&arsta->update_wk);
3428
Kalle Valo5e3dd152013-06-12 20:52:10 +03003429 mutex_lock(&ar->conf_mutex);
3430
3431 if (old_state == IEEE80211_STA_NOTEXIST &&
3432 new_state == IEEE80211_STA_NONE &&
3433 vif->type != NL80211_IFTYPE_STATION) {
3434 /*
3435 * New station addition.
3436 */
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003437 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
3438 max_num_peers = TARGET_10X_NUM_PEERS_MAX - 1;
3439 else
3440 max_num_peers = TARGET_NUM_PEERS;
3441
3442 if (ar->num_peers >= max_num_peers) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003443 ath10k_warn("number of peers exceeded: peers number %d (max peers %d)\n",
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003444 ar->num_peers, max_num_peers);
3445 ret = -ENOBUFS;
3446 goto exit;
3447 }
3448
Kalle Valo60c3daa2013-09-08 17:56:07 +03003449 ath10k_dbg(ATH10K_DBG_MAC,
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003450 "mac vdev %d peer create %pM (new sta) num_peers %d\n",
3451 arvif->vdev_id, sta->addr, ar->num_peers);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003452
Kalle Valo5e3dd152013-06-12 20:52:10 +03003453 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
3454 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003455 ath10k_warn("failed to add peer %pM for vdev %d when adding a new sta: %i\n",
Ben Greear479398b2013-11-04 09:19:34 -08003456 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003457 } else if ((old_state == IEEE80211_STA_NONE &&
3458 new_state == IEEE80211_STA_NOTEXIST)) {
3459 /*
3460 * Existing station deletion.
3461 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003462 ath10k_dbg(ATH10K_DBG_MAC,
3463 "mac vdev %d peer delete %pM (sta gone)\n",
3464 arvif->vdev_id, sta->addr);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003465 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
3466 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003467 ath10k_warn("failed to delete peer %pM for vdev %d: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003468 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003469
3470 if (vif->type == NL80211_IFTYPE_STATION)
3471 ath10k_bss_disassoc(hw, vif);
3472 } else if (old_state == IEEE80211_STA_AUTH &&
3473 new_state == IEEE80211_STA_ASSOC &&
3474 (vif->type == NL80211_IFTYPE_AP ||
3475 vif->type == NL80211_IFTYPE_ADHOC)) {
3476 /*
3477 * New association.
3478 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003479 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM associated\n",
3480 sta->addr);
3481
Chun-Yeow Yeoh44d6fa92014-03-07 10:19:30 +02003482 ret = ath10k_station_assoc(ar, arvif, sta, false);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003483 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003484 ath10k_warn("failed to associate station %pM for vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003485 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003486 } else if (old_state == IEEE80211_STA_ASSOC &&
3487 new_state == IEEE80211_STA_AUTH &&
3488 (vif->type == NL80211_IFTYPE_AP ||
3489 vif->type == NL80211_IFTYPE_ADHOC)) {
3490 /*
3491 * Disassociation.
3492 */
Kalle Valo60c3daa2013-09-08 17:56:07 +03003493 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM disassociated\n",
3494 sta->addr);
3495
Kalle Valo5e3dd152013-06-12 20:52:10 +03003496 ret = ath10k_station_disassoc(ar, arvif, sta);
3497 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003498 ath10k_warn("failed to disassociate station: %pM vdev %i: %i\n",
Ben Greear69244e52014-02-27 18:50:00 +02003499 sta->addr, arvif->vdev_id, ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003500 }
Bartosz Markowski0e759f32014-01-02 14:38:33 +01003501exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +03003502 mutex_unlock(&ar->conf_mutex);
3503 return ret;
3504}
3505
3506static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
3507 u16 ac, bool enable)
3508{
3509 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3510 u32 value = 0;
3511 int ret = 0;
3512
Michal Kazior548db542013-07-05 16:15:15 +03003513 lockdep_assert_held(&ar->conf_mutex);
3514
Kalle Valo5e3dd152013-06-12 20:52:10 +03003515 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
3516 return 0;
3517
3518 switch (ac) {
3519 case IEEE80211_AC_VO:
3520 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
3521 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
3522 break;
3523 case IEEE80211_AC_VI:
3524 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
3525 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
3526 break;
3527 case IEEE80211_AC_BE:
3528 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
3529 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
3530 break;
3531 case IEEE80211_AC_BK:
3532 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
3533 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
3534 break;
3535 }
3536
3537 if (enable)
3538 arvif->u.sta.uapsd |= value;
3539 else
3540 arvif->u.sta.uapsd &= ~value;
3541
3542 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3543 WMI_STA_PS_PARAM_UAPSD,
3544 arvif->u.sta.uapsd);
3545 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003546 ath10k_warn("failed to set uapsd params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003547 goto exit;
3548 }
3549
3550 if (arvif->u.sta.uapsd)
3551 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
3552 else
3553 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
3554
3555 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
3556 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
3557 value);
3558 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003559 ath10k_warn("failed to set rx wake param: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003560
3561exit:
3562 return ret;
3563}
3564
3565static int ath10k_conf_tx(struct ieee80211_hw *hw,
3566 struct ieee80211_vif *vif, u16 ac,
3567 const struct ieee80211_tx_queue_params *params)
3568{
3569 struct ath10k *ar = hw->priv;
3570 struct wmi_wmm_params_arg *p = NULL;
3571 int ret;
3572
3573 mutex_lock(&ar->conf_mutex);
3574
3575 switch (ac) {
3576 case IEEE80211_AC_VO:
3577 p = &ar->wmm_params.ac_vo;
3578 break;
3579 case IEEE80211_AC_VI:
3580 p = &ar->wmm_params.ac_vi;
3581 break;
3582 case IEEE80211_AC_BE:
3583 p = &ar->wmm_params.ac_be;
3584 break;
3585 case IEEE80211_AC_BK:
3586 p = &ar->wmm_params.ac_bk;
3587 break;
3588 }
3589
3590 if (WARN_ON(!p)) {
3591 ret = -EINVAL;
3592 goto exit;
3593 }
3594
3595 p->cwmin = params->cw_min;
3596 p->cwmax = params->cw_max;
3597 p->aifs = params->aifs;
3598
3599 /*
3600 * The channel time duration programmed in the HW is in absolute
3601 * microseconds, while mac80211 gives the txop in units of
3602 * 32 microseconds.
3603 */
3604 p->txop = params->txop * 32;
3605
3606 /* FIXME: FW accepts wmm params per hw, not per vif */
3607 ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
3608 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003609 ath10k_warn("failed to set wmm params: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003610 goto exit;
3611 }
3612
3613 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
3614 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003615 ath10k_warn("failed to set sta uapsd: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003616
3617exit:
3618 mutex_unlock(&ar->conf_mutex);
3619 return ret;
3620}
3621
3622#define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3623
3624static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
3625 struct ieee80211_vif *vif,
3626 struct ieee80211_channel *chan,
3627 int duration,
3628 enum ieee80211_roc_type type)
3629{
3630 struct ath10k *ar = hw->priv;
3631 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3632 struct wmi_start_scan_arg arg;
3633 int ret;
3634
3635 mutex_lock(&ar->conf_mutex);
3636
3637 spin_lock_bh(&ar->data_lock);
3638 if (ar->scan.in_progress) {
3639 spin_unlock_bh(&ar->data_lock);
3640 ret = -EBUSY;
3641 goto exit;
3642 }
3643
Wolfram Sang16735d02013-11-14 14:32:02 -08003644 reinit_completion(&ar->scan.started);
3645 reinit_completion(&ar->scan.completed);
3646 reinit_completion(&ar->scan.on_channel);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003647 ar->scan.in_progress = true;
3648 ar->scan.aborting = false;
3649 ar->scan.is_roc = true;
3650 ar->scan.vdev_id = arvif->vdev_id;
3651 ar->scan.roc_freq = chan->center_freq;
3652 spin_unlock_bh(&ar->data_lock);
3653
3654 memset(&arg, 0, sizeof(arg));
3655 ath10k_wmi_start_scan_init(ar, &arg);
3656 arg.vdev_id = arvif->vdev_id;
3657 arg.scan_id = ATH10K_SCAN_ID;
3658 arg.n_channels = 1;
3659 arg.channels[0] = chan->center_freq;
3660 arg.dwell_time_active = duration;
3661 arg.dwell_time_passive = duration;
3662 arg.max_scan_time = 2 * duration;
3663 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
3664 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
3665
3666 ret = ath10k_start_scan(ar, &arg);
3667 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003668 ath10k_warn("failed to start roc scan: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003669 spin_lock_bh(&ar->data_lock);
3670 ar->scan.in_progress = false;
3671 spin_unlock_bh(&ar->data_lock);
3672 goto exit;
3673 }
3674
3675 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3*HZ);
3676 if (ret == 0) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003677 ath10k_warn("failed to switch to channel for roc scan\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03003678 ath10k_abort_scan(ar);
3679 ret = -ETIMEDOUT;
3680 goto exit;
3681 }
3682
3683 ret = 0;
3684exit:
3685 mutex_unlock(&ar->conf_mutex);
3686 return ret;
3687}
3688
3689static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
3690{
3691 struct ath10k *ar = hw->priv;
3692
3693 mutex_lock(&ar->conf_mutex);
3694 ath10k_abort_scan(ar);
3695 mutex_unlock(&ar->conf_mutex);
3696
3697 return 0;
3698}
3699
3700/*
3701 * Both RTS and Fragmentation threshold are interface-specific
3702 * in ath10k, but device-specific in mac80211.
3703 */
Kalle Valo5e3dd152013-06-12 20:52:10 +03003704
3705static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3706{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003707 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003708 struct ath10k_vif *arvif;
3709 int ret = 0;
Michal Kazior548db542013-07-05 16:15:15 +03003710
Michal Kaziorad088bf2013-10-16 15:44:46 +03003711 mutex_lock(&ar->conf_mutex);
3712 list_for_each_entry(arvif, &ar->arvifs, list) {
3713 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
3714 arvif->vdev_id, value);
Kalle Valo60c3daa2013-09-08 17:56:07 +03003715
Michal Kaziorad088bf2013-10-16 15:44:46 +03003716 ret = ath10k_mac_set_rts(arvif, value);
3717 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003718 ath10k_warn("failed to set rts threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03003719 arvif->vdev_id, ret);
3720 break;
3721 }
3722 }
3723 mutex_unlock(&ar->conf_mutex);
3724
3725 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003726}
3727
3728static int ath10k_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3729{
Kalle Valo5e3dd152013-06-12 20:52:10 +03003730 struct ath10k *ar = hw->priv;
Michal Kaziorad088bf2013-10-16 15:44:46 +03003731 struct ath10k_vif *arvif;
3732 int ret = 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003733
Kalle Valo5e3dd152013-06-12 20:52:10 +03003734 mutex_lock(&ar->conf_mutex);
Michal Kaziorad088bf2013-10-16 15:44:46 +03003735 list_for_each_entry(arvif, &ar->arvifs, list) {
3736 ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d fragmentation threshold %d\n",
3737 arvif->vdev_id, value);
3738
3739 ret = ath10k_mac_set_rts(arvif, value);
3740 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003741 ath10k_warn("failed to set fragmentation threshold for vdev %d: %d\n",
Michal Kaziorad088bf2013-10-16 15:44:46 +03003742 arvif->vdev_id, ret);
3743 break;
3744 }
3745 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03003746 mutex_unlock(&ar->conf_mutex);
3747
Michal Kaziorad088bf2013-10-16 15:44:46 +03003748 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003749}
3750
Emmanuel Grumbach77be2c52014-03-27 11:30:29 +02003751static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
3752 u32 queues, bool drop)
Kalle Valo5e3dd152013-06-12 20:52:10 +03003753{
3754 struct ath10k *ar = hw->priv;
Michal Kazioraffd3212013-07-16 09:54:35 +02003755 bool skip;
Kalle Valo5e3dd152013-06-12 20:52:10 +03003756 int ret;
3757
3758 /* mac80211 doesn't care if we really xmit queued frames or not
3759 * we'll collect those frames either way if we stop/delete vdevs */
3760 if (drop)
3761 return;
3762
Michal Kazior548db542013-07-05 16:15:15 +03003763 mutex_lock(&ar->conf_mutex);
3764
Michal Kazioraffd3212013-07-16 09:54:35 +02003765 if (ar->state == ATH10K_STATE_WEDGED)
3766 goto skip;
3767
Michal Kazioredb82362013-07-05 16:15:14 +03003768 ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
Kalle Valo5e3dd152013-06-12 20:52:10 +03003769 bool empty;
Michal Kazioraffd3212013-07-16 09:54:35 +02003770
Michal Kazioredb82362013-07-05 16:15:14 +03003771 spin_lock_bh(&ar->htt.tx_lock);
Michal Kazior0945baf2013-09-18 14:43:18 +02003772 empty = (ar->htt.num_pending_tx == 0);
Michal Kazioredb82362013-07-05 16:15:14 +03003773 spin_unlock_bh(&ar->htt.tx_lock);
Michal Kazioraffd3212013-07-16 09:54:35 +02003774
3775 skip = (ar->state == ATH10K_STATE_WEDGED);
3776
3777 (empty || skip);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003778 }), ATH10K_FLUSH_TIMEOUT_HZ);
Michal Kazioraffd3212013-07-16 09:54:35 +02003779
3780 if (ret <= 0 || skip)
Kalle Valobe6546f2014-03-25 14:18:51 +02003781 ath10k_warn("failed to flush transmit queue (skip %i ar-state %i): %i\n",
Ben Greear9ba4c782014-02-25 09:29:57 +02003782 skip, ar->state, ret);
Michal Kazior548db542013-07-05 16:15:15 +03003783
Michal Kazioraffd3212013-07-16 09:54:35 +02003784skip:
Michal Kazior548db542013-07-05 16:15:15 +03003785 mutex_unlock(&ar->conf_mutex);
Kalle Valo5e3dd152013-06-12 20:52:10 +03003786}
3787
3788/* TODO: Implement this function properly
3789 * For now it is needed to reply to Probe Requests in IBSS mode.
3790 * Propably we need this information from FW.
3791 */
3792static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
3793{
3794 return 1;
3795}
3796
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003797#ifdef CONFIG_PM
3798static int ath10k_suspend(struct ieee80211_hw *hw,
3799 struct cfg80211_wowlan *wowlan)
3800{
3801 struct ath10k *ar = hw->priv;
3802 int ret;
3803
Marek Puzyniak9042e172014-02-10 17:14:23 +01003804 mutex_lock(&ar->conf_mutex);
3805
Marek Puzyniak00f54822014-02-10 17:14:24 +01003806 ret = ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND);
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003807 if (ret) {
Marek Puzyniak00f54822014-02-10 17:14:24 +01003808 if (ret == -ETIMEDOUT)
3809 goto resume;
Marek Puzyniak9042e172014-02-10 17:14:23 +01003810 ret = 1;
3811 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003812 }
3813
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003814 ret = ath10k_hif_suspend(ar);
3815 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003816 ath10k_warn("failed to suspend hif: %d\n", ret);
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003817 goto resume;
3818 }
3819
Marek Puzyniak9042e172014-02-10 17:14:23 +01003820 ret = 0;
3821 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003822resume:
3823 ret = ath10k_wmi_pdev_resume_target(ar);
3824 if (ret)
Kalle Valobe6546f2014-03-25 14:18:51 +02003825 ath10k_warn("failed to resume target: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003826
3827 ret = 1;
3828exit:
3829 mutex_unlock(&ar->conf_mutex);
3830 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003831}
3832
3833static int ath10k_resume(struct ieee80211_hw *hw)
3834{
3835 struct ath10k *ar = hw->priv;
3836 int ret;
3837
Marek Puzyniak9042e172014-02-10 17:14:23 +01003838 mutex_lock(&ar->conf_mutex);
3839
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003840 ret = ath10k_hif_resume(ar);
3841 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003842 ath10k_warn("failed to resume hif: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003843 ret = 1;
3844 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003845 }
3846
3847 ret = ath10k_wmi_pdev_resume_target(ar);
3848 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02003849 ath10k_warn("failed to resume target: %d\n", ret);
Marek Puzyniak9042e172014-02-10 17:14:23 +01003850 ret = 1;
3851 goto exit;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003852 }
3853
Marek Puzyniak9042e172014-02-10 17:14:23 +01003854 ret = 0;
3855exit:
3856 mutex_unlock(&ar->conf_mutex);
3857 return ret;
Michal Kazior8cd13ca2013-07-16 09:38:54 +02003858}
3859#endif
3860
Michal Kazioraffd3212013-07-16 09:54:35 +02003861static void ath10k_restart_complete(struct ieee80211_hw *hw)
3862{
3863 struct ath10k *ar = hw->priv;
3864
3865 mutex_lock(&ar->conf_mutex);
3866
3867 /* If device failed to restart it will be in a different state, e.g.
3868 * ATH10K_STATE_WEDGED */
3869 if (ar->state == ATH10K_STATE_RESTARTED) {
3870 ath10k_info("device successfully recovered\n");
3871 ar->state = ATH10K_STATE_ON;
3872 }
3873
3874 mutex_unlock(&ar->conf_mutex);
3875}
3876
Michal Kazior2e1dea42013-07-31 10:32:40 +02003877static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
3878 struct survey_info *survey)
3879{
3880 struct ath10k *ar = hw->priv;
3881 struct ieee80211_supported_band *sband;
3882 struct survey_info *ar_survey = &ar->survey[idx];
3883 int ret = 0;
3884
3885 mutex_lock(&ar->conf_mutex);
3886
3887 sband = hw->wiphy->bands[IEEE80211_BAND_2GHZ];
3888 if (sband && idx >= sband->n_channels) {
3889 idx -= sband->n_channels;
3890 sband = NULL;
3891 }
3892
3893 if (!sband)
3894 sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
3895
3896 if (!sband || idx >= sband->n_channels) {
3897 ret = -ENOENT;
3898 goto exit;
3899 }
3900
3901 spin_lock_bh(&ar->data_lock);
3902 memcpy(survey, ar_survey, sizeof(*survey));
3903 spin_unlock_bh(&ar->data_lock);
3904
3905 survey->channel = &sband->channels[idx];
3906
3907exit:
3908 mutex_unlock(&ar->conf_mutex);
3909 return ret;
3910}
3911
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01003912/* Helper table for legacy fixed_rate/bitrate_mask */
3913static const u8 cck_ofdm_rate[] = {
3914 /* CCK */
3915 3, /* 1Mbps */
3916 2, /* 2Mbps */
3917 1, /* 5.5Mbps */
3918 0, /* 11Mbps */
3919 /* OFDM */
3920 3, /* 6Mbps */
3921 7, /* 9Mbps */
3922 2, /* 12Mbps */
3923 6, /* 18Mbps */
3924 1, /* 24Mbps */
3925 5, /* 36Mbps */
3926 0, /* 48Mbps */
3927 4, /* 54Mbps */
3928};
3929
3930/* Check if only one bit set */
3931static int ath10k_check_single_mask(u32 mask)
3932{
3933 int bit;
3934
3935 bit = ffs(mask);
3936 if (!bit)
3937 return 0;
3938
3939 mask &= ~BIT(bit - 1);
3940 if (mask)
3941 return 2;
3942
3943 return 1;
3944}
3945
3946static bool
3947ath10k_default_bitrate_mask(struct ath10k *ar,
3948 enum ieee80211_band band,
3949 const struct cfg80211_bitrate_mask *mask)
3950{
3951 u32 legacy = 0x00ff;
3952 u8 ht = 0xff, i;
3953 u16 vht = 0x3ff;
3954
3955 switch (band) {
3956 case IEEE80211_BAND_2GHZ:
3957 legacy = 0x00fff;
3958 vht = 0;
3959 break;
3960 case IEEE80211_BAND_5GHZ:
3961 break;
3962 default:
3963 return false;
3964 }
3965
3966 if (mask->control[band].legacy != legacy)
3967 return false;
3968
3969 for (i = 0; i < ar->num_rf_chains; i++)
3970 if (mask->control[band].ht_mcs[i] != ht)
3971 return false;
3972
3973 for (i = 0; i < ar->num_rf_chains; i++)
3974 if (mask->control[band].vht_mcs[i] != vht)
3975 return false;
3976
3977 return true;
3978}
3979
3980static bool
3981ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
3982 enum ieee80211_band band,
3983 u8 *fixed_nss)
3984{
3985 int ht_nss = 0, vht_nss = 0, i;
3986
3987 /* check legacy */
3988 if (ath10k_check_single_mask(mask->control[band].legacy))
3989 return false;
3990
3991 /* check HT */
3992 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3993 if (mask->control[band].ht_mcs[i] == 0xff)
3994 continue;
3995 else if (mask->control[band].ht_mcs[i] == 0x00)
3996 break;
3997 else
3998 return false;
3999 }
4000
4001 ht_nss = i;
4002
4003 /* check VHT */
4004 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4005 if (mask->control[band].vht_mcs[i] == 0x03ff)
4006 continue;
4007 else if (mask->control[band].vht_mcs[i] == 0x0000)
4008 break;
4009 else
4010 return false;
4011 }
4012
4013 vht_nss = i;
4014
4015 if (ht_nss > 0 && vht_nss > 0)
4016 return false;
4017
4018 if (ht_nss)
4019 *fixed_nss = ht_nss;
4020 else if (vht_nss)
4021 *fixed_nss = vht_nss;
4022 else
4023 return false;
4024
4025 return true;
4026}
4027
4028static bool
4029ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
4030 enum ieee80211_band band,
4031 enum wmi_rate_preamble *preamble)
4032{
4033 int legacy = 0, ht = 0, vht = 0, i;
4034
4035 *preamble = WMI_RATE_PREAMBLE_OFDM;
4036
4037 /* check legacy */
4038 legacy = ath10k_check_single_mask(mask->control[band].legacy);
4039 if (legacy > 1)
4040 return false;
4041
4042 /* check HT */
4043 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4044 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
4045 if (ht > 1)
4046 return false;
4047
4048 /* check VHT */
4049 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4050 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
4051 if (vht > 1)
4052 return false;
4053
4054 /* Currently we support only one fixed_rate */
4055 if ((legacy + ht + vht) != 1)
4056 return false;
4057
4058 if (ht)
4059 *preamble = WMI_RATE_PREAMBLE_HT;
4060 else if (vht)
4061 *preamble = WMI_RATE_PREAMBLE_VHT;
4062
4063 return true;
4064}
4065
4066static bool
4067ath10k_bitrate_mask_rate(const struct cfg80211_bitrate_mask *mask,
4068 enum ieee80211_band band,
4069 u8 *fixed_rate,
4070 u8 *fixed_nss)
4071{
4072 u8 rate = 0, pream = 0, nss = 0, i;
4073 enum wmi_rate_preamble preamble;
4074
4075 /* Check if single rate correct */
4076 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
4077 return false;
4078
4079 pream = preamble;
4080
4081 switch (preamble) {
4082 case WMI_RATE_PREAMBLE_CCK:
4083 case WMI_RATE_PREAMBLE_OFDM:
4084 i = ffs(mask->control[band].legacy) - 1;
4085
4086 if (band == IEEE80211_BAND_2GHZ && i < 4)
4087 pream = WMI_RATE_PREAMBLE_CCK;
4088
4089 if (band == IEEE80211_BAND_5GHZ)
4090 i += 4;
4091
4092 if (i >= ARRAY_SIZE(cck_ofdm_rate))
4093 return false;
4094
4095 rate = cck_ofdm_rate[i];
4096 break;
4097 case WMI_RATE_PREAMBLE_HT:
4098 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4099 if (mask->control[band].ht_mcs[i])
4100 break;
4101
4102 if (i == IEEE80211_HT_MCS_MASK_LEN)
4103 return false;
4104
4105 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4106 nss = i;
4107 break;
4108 case WMI_RATE_PREAMBLE_VHT:
4109 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4110 if (mask->control[band].vht_mcs[i])
4111 break;
4112
4113 if (i == NL80211_VHT_NSS_MAX)
4114 return false;
4115
4116 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4117 nss = i;
4118 break;
4119 }
4120
4121 *fixed_nss = nss + 1;
4122 nss <<= 4;
4123 pream <<= 6;
4124
4125 ath10k_dbg(ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
4126 pream, nss, rate);
4127
4128 *fixed_rate = pream | nss | rate;
4129
4130 return true;
4131}
4132
4133static bool ath10k_get_fixed_rate_nss(const struct cfg80211_bitrate_mask *mask,
4134 enum ieee80211_band band,
4135 u8 *fixed_rate,
4136 u8 *fixed_nss)
4137{
4138 /* First check full NSS mask, if we can simply limit NSS */
4139 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
4140 return true;
4141
4142 /* Next Check single rate is set */
4143 return ath10k_bitrate_mask_rate(mask, band, fixed_rate, fixed_nss);
4144}
4145
4146static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
4147 u8 fixed_rate,
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004148 u8 fixed_nss,
4149 u8 force_sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004150{
4151 struct ath10k *ar = arvif->ar;
4152 u32 vdev_param;
4153 int ret = 0;
4154
4155 mutex_lock(&ar->conf_mutex);
4156
4157 if (arvif->fixed_rate == fixed_rate &&
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004158 arvif->fixed_nss == fixed_nss &&
4159 arvif->force_sgi == force_sgi)
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004160 goto exit;
4161
4162 if (fixed_rate == WMI_FIXED_RATE_NONE)
4163 ath10k_dbg(ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
4164
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004165 if (force_sgi)
4166 ath10k_dbg(ATH10K_DBG_MAC, "mac force sgi\n");
4167
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004168 vdev_param = ar->wmi.vdev_param->fixed_rate;
4169 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4170 vdev_param, fixed_rate);
4171 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004172 ath10k_warn("failed to set fixed rate param 0x%02x: %d\n",
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004173 fixed_rate, ret);
4174 ret = -EINVAL;
4175 goto exit;
4176 }
4177
4178 arvif->fixed_rate = fixed_rate;
4179
4180 vdev_param = ar->wmi.vdev_param->nss;
4181 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
4182 vdev_param, fixed_nss);
4183
4184 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004185 ath10k_warn("failed to set fixed nss param %d: %d\n",
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004186 fixed_nss, ret);
4187 ret = -EINVAL;
4188 goto exit;
4189 }
4190
4191 arvif->fixed_nss = fixed_nss;
4192
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004193 vdev_param = ar->wmi.vdev_param->sgi;
4194 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
4195 force_sgi);
4196
4197 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004198 ath10k_warn("failed to set sgi param %d: %d\n",
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004199 force_sgi, ret);
4200 ret = -EINVAL;
4201 goto exit;
4202 }
4203
4204 arvif->force_sgi = force_sgi;
4205
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004206exit:
4207 mutex_unlock(&ar->conf_mutex);
4208 return ret;
4209}
4210
4211static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
4212 struct ieee80211_vif *vif,
4213 const struct cfg80211_bitrate_mask *mask)
4214{
4215 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4216 struct ath10k *ar = arvif->ar;
4217 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
4218 u8 fixed_rate = WMI_FIXED_RATE_NONE;
4219 u8 fixed_nss = ar->num_rf_chains;
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004220 u8 force_sgi;
4221
4222 force_sgi = mask->control[band].gi;
4223 if (force_sgi == NL80211_TXRATE_FORCE_LGI)
4224 return -EINVAL;
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004225
4226 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
4227 if (!ath10k_get_fixed_rate_nss(mask, band,
4228 &fixed_rate,
4229 &fixed_nss))
4230 return -EINVAL;
4231 }
4232
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004233 if (fixed_rate == WMI_FIXED_RATE_NONE && force_sgi) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004234 ath10k_warn("failed to force SGI usage for default rate settings\n");
Janusz Dziedzic9f81f722014-01-17 20:04:14 +01004235 return -EINVAL;
4236 }
4237
4238 return ath10k_set_fixed_rate_param(arvif, fixed_rate,
4239 fixed_nss, force_sgi);
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004240}
4241
Michal Kazior9797feb2014-02-14 14:49:48 +01004242static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
4243 struct ieee80211_vif *vif,
4244 struct ieee80211_sta *sta,
4245 u32 changed)
4246{
4247 struct ath10k *ar = hw->priv;
4248 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
4249 u32 bw, smps;
4250
4251 spin_lock_bh(&ar->data_lock);
4252
4253 ath10k_dbg(ATH10K_DBG_MAC,
4254 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4255 sta->addr, changed, sta->bandwidth, sta->rx_nss,
4256 sta->smps_mode);
4257
4258 if (changed & IEEE80211_RC_BW_CHANGED) {
4259 bw = WMI_PEER_CHWIDTH_20MHZ;
4260
4261 switch (sta->bandwidth) {
4262 case IEEE80211_STA_RX_BW_20:
4263 bw = WMI_PEER_CHWIDTH_20MHZ;
4264 break;
4265 case IEEE80211_STA_RX_BW_40:
4266 bw = WMI_PEER_CHWIDTH_40MHZ;
4267 break;
4268 case IEEE80211_STA_RX_BW_80:
4269 bw = WMI_PEER_CHWIDTH_80MHZ;
4270 break;
4271 case IEEE80211_STA_RX_BW_160:
Kalle Valobe6546f2014-03-25 14:18:51 +02004272 ath10k_warn("Invalid bandwith %d in rc update for %pM\n",
4273 sta->bandwidth, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01004274 bw = WMI_PEER_CHWIDTH_20MHZ;
4275 break;
4276 }
4277
4278 arsta->bw = bw;
4279 }
4280
4281 if (changed & IEEE80211_RC_NSS_CHANGED)
4282 arsta->nss = sta->rx_nss;
4283
4284 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4285 smps = WMI_PEER_SMPS_PS_NONE;
4286
4287 switch (sta->smps_mode) {
4288 case IEEE80211_SMPS_AUTOMATIC:
4289 case IEEE80211_SMPS_OFF:
4290 smps = WMI_PEER_SMPS_PS_NONE;
4291 break;
4292 case IEEE80211_SMPS_STATIC:
4293 smps = WMI_PEER_SMPS_STATIC;
4294 break;
4295 case IEEE80211_SMPS_DYNAMIC:
4296 smps = WMI_PEER_SMPS_DYNAMIC;
4297 break;
4298 case IEEE80211_SMPS_NUM_MODES:
Kalle Valobe6546f2014-03-25 14:18:51 +02004299 ath10k_warn("Invalid smps %d in sta rc update for %pM\n",
4300 sta->smps_mode, sta->addr);
Michal Kazior9797feb2014-02-14 14:49:48 +01004301 smps = WMI_PEER_SMPS_PS_NONE;
4302 break;
4303 }
4304
4305 arsta->smps = smps;
4306 }
4307
Michal Kazior9797feb2014-02-14 14:49:48 +01004308 arsta->changed |= changed;
4309
4310 spin_unlock_bh(&ar->data_lock);
4311
4312 ieee80211_queue_work(hw, &arsta->update_wk);
4313}
4314
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02004315static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
4316{
4317 /*
4318 * FIXME: Return 0 for time being. Need to figure out whether FW
4319 * has the API to fetch 64-bit local TSF
4320 */
4321
4322 return 0;
4323}
4324
Kalle Valo5e3dd152013-06-12 20:52:10 +03004325static const struct ieee80211_ops ath10k_ops = {
4326 .tx = ath10k_tx,
4327 .start = ath10k_start,
4328 .stop = ath10k_stop,
4329 .config = ath10k_config,
4330 .add_interface = ath10k_add_interface,
4331 .remove_interface = ath10k_remove_interface,
4332 .configure_filter = ath10k_configure_filter,
4333 .bss_info_changed = ath10k_bss_info_changed,
4334 .hw_scan = ath10k_hw_scan,
4335 .cancel_hw_scan = ath10k_cancel_hw_scan,
4336 .set_key = ath10k_set_key,
4337 .sta_state = ath10k_sta_state,
4338 .conf_tx = ath10k_conf_tx,
4339 .remain_on_channel = ath10k_remain_on_channel,
4340 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
4341 .set_rts_threshold = ath10k_set_rts_threshold,
4342 .set_frag_threshold = ath10k_set_frag_threshold,
4343 .flush = ath10k_flush,
4344 .tx_last_beacon = ath10k_tx_last_beacon,
Ben Greear46acf7b2014-05-16 17:15:38 +03004345 .set_antenna = ath10k_set_antenna,
4346 .get_antenna = ath10k_get_antenna,
Michal Kazioraffd3212013-07-16 09:54:35 +02004347 .restart_complete = ath10k_restart_complete,
Michal Kazior2e1dea42013-07-31 10:32:40 +02004348 .get_survey = ath10k_get_survey,
Janusz Dziedzic51ab1a02014-01-08 09:08:33 +01004349 .set_bitrate_mask = ath10k_set_bitrate_mask,
Michal Kazior9797feb2014-02-14 14:49:48 +01004350 .sta_rc_update = ath10k_sta_rc_update,
Chun-Yeow Yeoh26ebbcc2014-02-25 09:29:54 +02004351 .get_tsf = ath10k_get_tsf,
Michal Kazior8cd13ca2013-07-16 09:38:54 +02004352#ifdef CONFIG_PM
4353 .suspend = ath10k_suspend,
4354 .resume = ath10k_resume,
4355#endif
Kalle Valo5e3dd152013-06-12 20:52:10 +03004356};
4357
4358#define RATETAB_ENT(_rate, _rateid, _flags) { \
4359 .bitrate = (_rate), \
4360 .flags = (_flags), \
4361 .hw_value = (_rateid), \
4362}
4363
4364#define CHAN2G(_channel, _freq, _flags) { \
4365 .band = IEEE80211_BAND_2GHZ, \
4366 .hw_value = (_channel), \
4367 .center_freq = (_freq), \
4368 .flags = (_flags), \
4369 .max_antenna_gain = 0, \
4370 .max_power = 30, \
4371}
4372
4373#define CHAN5G(_channel, _freq, _flags) { \
4374 .band = IEEE80211_BAND_5GHZ, \
4375 .hw_value = (_channel), \
4376 .center_freq = (_freq), \
4377 .flags = (_flags), \
4378 .max_antenna_gain = 0, \
4379 .max_power = 30, \
4380}
4381
4382static const struct ieee80211_channel ath10k_2ghz_channels[] = {
4383 CHAN2G(1, 2412, 0),
4384 CHAN2G(2, 2417, 0),
4385 CHAN2G(3, 2422, 0),
4386 CHAN2G(4, 2427, 0),
4387 CHAN2G(5, 2432, 0),
4388 CHAN2G(6, 2437, 0),
4389 CHAN2G(7, 2442, 0),
4390 CHAN2G(8, 2447, 0),
4391 CHAN2G(9, 2452, 0),
4392 CHAN2G(10, 2457, 0),
4393 CHAN2G(11, 2462, 0),
4394 CHAN2G(12, 2467, 0),
4395 CHAN2G(13, 2472, 0),
4396 CHAN2G(14, 2484, 0),
4397};
4398
4399static const struct ieee80211_channel ath10k_5ghz_channels[] = {
Michal Kazior429ff562013-06-26 08:54:54 +02004400 CHAN5G(36, 5180, 0),
4401 CHAN5G(40, 5200, 0),
4402 CHAN5G(44, 5220, 0),
4403 CHAN5G(48, 5240, 0),
4404 CHAN5G(52, 5260, 0),
4405 CHAN5G(56, 5280, 0),
4406 CHAN5G(60, 5300, 0),
4407 CHAN5G(64, 5320, 0),
4408 CHAN5G(100, 5500, 0),
4409 CHAN5G(104, 5520, 0),
4410 CHAN5G(108, 5540, 0),
4411 CHAN5G(112, 5560, 0),
4412 CHAN5G(116, 5580, 0),
4413 CHAN5G(120, 5600, 0),
4414 CHAN5G(124, 5620, 0),
4415 CHAN5G(128, 5640, 0),
4416 CHAN5G(132, 5660, 0),
4417 CHAN5G(136, 5680, 0),
4418 CHAN5G(140, 5700, 0),
4419 CHAN5G(149, 5745, 0),
4420 CHAN5G(153, 5765, 0),
4421 CHAN5G(157, 5785, 0),
4422 CHAN5G(161, 5805, 0),
4423 CHAN5G(165, 5825, 0),
Kalle Valo5e3dd152013-06-12 20:52:10 +03004424};
4425
4426static struct ieee80211_rate ath10k_rates[] = {
4427 /* CCK */
4428 RATETAB_ENT(10, 0x82, 0),
4429 RATETAB_ENT(20, 0x84, 0),
4430 RATETAB_ENT(55, 0x8b, 0),
4431 RATETAB_ENT(110, 0x96, 0),
4432 /* OFDM */
4433 RATETAB_ENT(60, 0x0c, 0),
4434 RATETAB_ENT(90, 0x12, 0),
4435 RATETAB_ENT(120, 0x18, 0),
4436 RATETAB_ENT(180, 0x24, 0),
4437 RATETAB_ENT(240, 0x30, 0),
4438 RATETAB_ENT(360, 0x48, 0),
4439 RATETAB_ENT(480, 0x60, 0),
4440 RATETAB_ENT(540, 0x6c, 0),
4441};
4442
4443#define ath10k_a_rates (ath10k_rates + 4)
4444#define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
4445#define ath10k_g_rates (ath10k_rates + 0)
4446#define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
4447
4448struct ath10k *ath10k_mac_create(void)
4449{
4450 struct ieee80211_hw *hw;
4451 struct ath10k *ar;
4452
4453 hw = ieee80211_alloc_hw(sizeof(struct ath10k), &ath10k_ops);
4454 if (!hw)
4455 return NULL;
4456
4457 ar = hw->priv;
4458 ar->hw = hw;
4459
4460 return ar;
4461}
4462
4463void ath10k_mac_destroy(struct ath10k *ar)
4464{
4465 ieee80211_free_hw(ar->hw);
4466}
4467
4468static const struct ieee80211_iface_limit ath10k_if_limits[] = {
4469 {
4470 .max = 8,
4471 .types = BIT(NL80211_IFTYPE_STATION)
4472 | BIT(NL80211_IFTYPE_P2P_CLIENT)
Michal Kaziord531cb82013-07-31 10:55:13 +02004473 },
4474 {
4475 .max = 3,
4476 .types = BIT(NL80211_IFTYPE_P2P_GO)
4477 },
4478 {
4479 .max = 7,
4480 .types = BIT(NL80211_IFTYPE_AP)
4481 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004482};
4483
Bartosz Markowskif2595092013-12-10 16:20:39 +01004484static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004485 {
4486 .max = 8,
4487 .types = BIT(NL80211_IFTYPE_AP)
4488 },
4489};
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004490
4491static const struct ieee80211_iface_combination ath10k_if_comb[] = {
4492 {
4493 .limits = ath10k_if_limits,
4494 .n_limits = ARRAY_SIZE(ath10k_if_limits),
4495 .max_interfaces = 8,
4496 .num_different_channels = 1,
4497 .beacon_int_infra_match = true,
4498 },
Bartosz Markowskif2595092013-12-10 16:20:39 +01004499};
4500
4501static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004502 {
Bartosz Markowskif2595092013-12-10 16:20:39 +01004503 .limits = ath10k_10x_if_limits,
4504 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004505 .max_interfaces = 8,
4506 .num_different_channels = 1,
4507 .beacon_int_infra_match = true,
Bartosz Markowskif2595092013-12-10 16:20:39 +01004508#ifdef CONFIG_ATH10K_DFS_CERTIFIED
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004509 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
4510 BIT(NL80211_CHAN_WIDTH_20) |
4511 BIT(NL80211_CHAN_WIDTH_40) |
4512 BIT(NL80211_CHAN_WIDTH_80),
Marek Puzyniake8a50f82013-11-20 09:59:47 +02004513#endif
Bartosz Markowskif2595092013-12-10 16:20:39 +01004514 },
Kalle Valo5e3dd152013-06-12 20:52:10 +03004515};
4516
4517static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4518{
4519 struct ieee80211_sta_vht_cap vht_cap = {0};
4520 u16 mcs_map;
Michal Kazior8865bee42013-07-24 12:36:46 +02004521 int i;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004522
4523 vht_cap.vht_supported = 1;
4524 vht_cap.cap = ar->vht_cap_info;
4525
Michal Kazior8865bee42013-07-24 12:36:46 +02004526 mcs_map = 0;
4527 for (i = 0; i < 8; i++) {
4528 if (i < ar->num_rf_chains)
4529 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
4530 else
4531 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
4532 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004533
4534 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4535 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4536
4537 return vht_cap;
4538}
4539
4540static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4541{
4542 int i;
4543 struct ieee80211_sta_ht_cap ht_cap = {0};
4544
4545 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4546 return ht_cap;
4547
4548 ht_cap.ht_supported = 1;
4549 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4550 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4551 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4552 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4553 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4554
4555 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4556 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4557
4558 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4559 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4560
4561 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4562 u32 smps;
4563
4564 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4565 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4566
4567 ht_cap.cap |= smps;
4568 }
4569
4570 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
4571 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4572
4573 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4574 u32 stbc;
4575
4576 stbc = ar->ht_cap_info;
4577 stbc &= WMI_HT_CAP_RX_STBC;
4578 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4579 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4580 stbc &= IEEE80211_HT_CAP_RX_STBC;
4581
4582 ht_cap.cap |= stbc;
4583 }
4584
4585 if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
4586 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4587
4588 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4589 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4590
4591 /* max AMSDU is implicitly taken from vht_cap_info */
4592 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4593 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4594
Michal Kazior8865bee42013-07-24 12:36:46 +02004595 for (i = 0; i < ar->num_rf_chains; i++)
Kalle Valo5e3dd152013-06-12 20:52:10 +03004596 ht_cap.mcs.rx_mask[i] = 0xFF;
4597
4598 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4599
4600 return ht_cap;
4601}
4602
4603
4604static void ath10k_get_arvif_iter(void *data, u8 *mac,
4605 struct ieee80211_vif *vif)
4606{
4607 struct ath10k_vif_iter *arvif_iter = data;
4608 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4609
4610 if (arvif->vdev_id == arvif_iter->vdev_id)
4611 arvif_iter->arvif = arvif;
4612}
4613
4614struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
4615{
4616 struct ath10k_vif_iter arvif_iter;
4617 u32 flags;
4618
4619 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
4620 arvif_iter.vdev_id = vdev_id;
4621
4622 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
4623 ieee80211_iterate_active_interfaces_atomic(ar->hw,
4624 flags,
4625 ath10k_get_arvif_iter,
4626 &arvif_iter);
4627 if (!arvif_iter.arvif) {
Ben Greear69244e52014-02-27 18:50:00 +02004628 ath10k_warn("No VIF found for vdev %d\n", vdev_id);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004629 return NULL;
4630 }
4631
4632 return arvif_iter.arvif;
4633}
4634
4635int ath10k_mac_register(struct ath10k *ar)
4636{
4637 struct ieee80211_supported_band *band;
4638 struct ieee80211_sta_vht_cap vht_cap;
4639 struct ieee80211_sta_ht_cap ht_cap;
4640 void *channels;
4641 int ret;
4642
4643 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
4644
4645 SET_IEEE80211_DEV(ar->hw, ar->dev);
4646
4647 ht_cap = ath10k_get_ht_cap(ar);
4648 vht_cap = ath10k_create_vht_cap(ar);
4649
4650 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4651 channels = kmemdup(ath10k_2ghz_channels,
4652 sizeof(ath10k_2ghz_channels),
4653 GFP_KERNEL);
Michal Kaziord6015b22013-07-22 14:13:30 +02004654 if (!channels) {
4655 ret = -ENOMEM;
4656 goto err_free;
4657 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004658
4659 band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
4660 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
4661 band->channels = channels;
4662 band->n_bitrates = ath10k_g_rates_size;
4663 band->bitrates = ath10k_g_rates;
4664 band->ht_cap = ht_cap;
4665
4666 /* vht is not supported in 2.4 GHz */
4667
4668 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
4669 }
4670
4671 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4672 channels = kmemdup(ath10k_5ghz_channels,
4673 sizeof(ath10k_5ghz_channels),
4674 GFP_KERNEL);
4675 if (!channels) {
Michal Kaziord6015b22013-07-22 14:13:30 +02004676 ret = -ENOMEM;
4677 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004678 }
4679
4680 band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
4681 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
4682 band->channels = channels;
4683 band->n_bitrates = ath10k_a_rates_size;
4684 band->bitrates = ath10k_a_rates;
4685 band->ht_cap = ht_cap;
4686 band->vht_cap = vht_cap;
4687 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
4688 }
4689
4690 ar->hw->wiphy->interface_modes =
4691 BIT(NL80211_IFTYPE_STATION) |
4692 BIT(NL80211_IFTYPE_ADHOC) |
Bartosz Markowskid3541812013-12-10 16:20:40 +01004693 BIT(NL80211_IFTYPE_AP);
4694
Ben Greear46acf7b2014-05-16 17:15:38 +03004695 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4696 /* TODO: Have to deal with 2x2 chips if/when the come out. */
4697 ar->supp_tx_chainmask = TARGET_10X_TX_CHAIN_MASK;
4698 ar->supp_rx_chainmask = TARGET_10X_RX_CHAIN_MASK;
4699 } else {
4700 ar->supp_tx_chainmask = TARGET_TX_CHAIN_MASK;
4701 ar->supp_rx_chainmask = TARGET_RX_CHAIN_MASK;
4702 }
4703
4704 ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask;
4705 ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask;
4706
Bartosz Markowskid3541812013-12-10 16:20:40 +01004707 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
4708 ar->hw->wiphy->interface_modes |=
4709 BIT(NL80211_IFTYPE_P2P_CLIENT) |
4710 BIT(NL80211_IFTYPE_P2P_GO);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004711
4712 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
4713 IEEE80211_HW_SUPPORTS_PS |
4714 IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
4715 IEEE80211_HW_SUPPORTS_UAPSD |
4716 IEEE80211_HW_MFP_CAPABLE |
4717 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
4718 IEEE80211_HW_HAS_RATE_CONTROL |
4719 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
Janusz Dziedzic2f0f1122014-02-26 18:42:09 +02004720 IEEE80211_HW_AP_LINK_PS |
4721 IEEE80211_HW_SPECTRUM_MGMT;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004722
Michal Kazior1f8bb152013-09-18 14:43:22 +02004723 /* MSDU can have HTT TX fragment pushed in front. The additional 4
4724 * bytes is used for padding/alignment if necessary. */
4725 ar->hw->extra_tx_headroom += sizeof(struct htt_data_tx_desc_frag)*2 + 4;
4726
Kalle Valo5e3dd152013-06-12 20:52:10 +03004727 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4728 ar->hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS;
4729
4730 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
4731 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
4732 ar->hw->flags |= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
4733 }
4734
4735 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
4736 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
4737
4738 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
Michal Kazior9797feb2014-02-14 14:49:48 +01004739 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
Kalle Valo5e3dd152013-06-12 20:52:10 +03004740
Kalle Valo5e3dd152013-06-12 20:52:10 +03004741 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
4742
4743 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
Michal Kaziorc2df44b2014-01-23 11:38:26 +01004744 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004745 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
4746
4747 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
4748 /*
4749 * on LL hardware queues are managed entirely by the FW
4750 * so we only advertise to mac we can do the queues thing
4751 */
4752 ar->hw->queues = 4;
4753
Bartosz Markowskif2595092013-12-10 16:20:39 +01004754 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
4755 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
4756 ar->hw->wiphy->n_iface_combinations =
4757 ARRAY_SIZE(ath10k_10x_if_comb);
4758 } else {
4759 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
4760 ar->hw->wiphy->n_iface_combinations =
4761 ARRAY_SIZE(ath10k_if_comb);
4762 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03004763
Michal Kazior7c199992013-07-31 10:47:57 +02004764 ar->hw->netdev_features = NETIF_F_HW_CSUM;
4765
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004766 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
4767 /* Init ath dfs pattern detector */
4768 ar->ath_common.debug_mask = ATH_DBG_DFS;
4769 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
4770 NL80211_DFS_UNSET);
4771
4772 if (!ar->dfs_detector)
Kalle Valobe6546f2014-03-25 14:18:51 +02004773 ath10k_warn("failed to initialise DFS pattern detector\n");
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004774 }
4775
Kalle Valo5e3dd152013-06-12 20:52:10 +03004776 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
4777 ath10k_reg_notifier);
4778 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004779 ath10k_err("failed to initialise regulatory: %i\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02004780 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004781 }
4782
4783 ret = ieee80211_register_hw(ar->hw);
4784 if (ret) {
Kalle Valobe6546f2014-03-25 14:18:51 +02004785 ath10k_err("failed to register ieee80211: %d\n", ret);
Michal Kaziord6015b22013-07-22 14:13:30 +02004786 goto err_free;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004787 }
4788
4789 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
4790 ret = regulatory_hint(ar->hw->wiphy,
4791 ar->ath_common.regulatory.alpha2);
4792 if (ret)
Michal Kaziord6015b22013-07-22 14:13:30 +02004793 goto err_unregister;
Kalle Valo5e3dd152013-06-12 20:52:10 +03004794 }
4795
4796 return 0;
Michal Kaziord6015b22013-07-22 14:13:30 +02004797
4798err_unregister:
Kalle Valo5e3dd152013-06-12 20:52:10 +03004799 ieee80211_unregister_hw(ar->hw);
Michal Kaziord6015b22013-07-22 14:13:30 +02004800err_free:
4801 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4802 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4803
Kalle Valo5e3dd152013-06-12 20:52:10 +03004804 return ret;
4805}
4806
4807void ath10k_mac_unregister(struct ath10k *ar)
4808{
4809 ieee80211_unregister_hw(ar->hw);
4810
Janusz Dziedzic9702c682013-11-20 09:59:41 +02004811 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
4812 ar->dfs_detector->exit(ar->dfs_detector);
4813
Kalle Valo5e3dd152013-06-12 20:52:10 +03004814 kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
4815 kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
4816
4817 SET_IEEE80211_DEV(ar->hw, NULL);
4818}