blob: 95e4bf05e5594a1066319c4791b1a9da6e603685 [file] [log] [blame]
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001/*
2 * Atheros CARL9170 driver
3 *
4 * mac80211 interaction code
5 *
6 * Copyright 2008, Johannes Berg <johannes@sipsolutions.net>
7 * Copyright 2009, 2010, Christian Lamparter <chunkeey@googlemail.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; see the file COPYING. If not, see
21 * http://www.gnu.org/licenses/.
22 *
23 * This file incorporates work covered by the following copyright and
24 * permission notice:
25 * Copyright (c) 2007-2008 Atheros Communications, Inc.
26 *
27 * Permission to use, copy, modify, and/or distribute this software for any
28 * purpose with or without fee is hereby granted, provided that the above
29 * copyright notice and this permission notice appear in all copies.
30 *
31 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
32 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
33 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
34 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
35 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
36 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
37 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
38 */
39
40#include <linux/init.h>
41#include <linux/slab.h>
42#include <linux/module.h>
43#include <linux/etherdevice.h>
44#include <linux/random.h>
45#include <net/mac80211.h>
46#include <net/cfg80211.h>
47#include "hw.h"
48#include "carl9170.h"
49#include "cmd.h"
50
Rusty Russelleb939922011-12-19 14:08:01 +000051static bool modparam_nohwcrypt;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +020052module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
53MODULE_PARM_DESC(nohwcrypt, "Disable hardware crypto offload.");
54
55int modparam_noht;
56module_param_named(noht, modparam_noht, int, S_IRUGO);
57MODULE_PARM_DESC(noht, "Disable MPDU aggregation.");
58
59#define RATE(_bitrate, _hw_rate, _txpidx, _flags) { \
60 .bitrate = (_bitrate), \
61 .flags = (_flags), \
62 .hw_value = (_hw_rate) | (_txpidx) << 4, \
63}
64
65struct ieee80211_rate __carl9170_ratetable[] = {
66 RATE(10, 0, 0, 0),
67 RATE(20, 1, 1, IEEE80211_RATE_SHORT_PREAMBLE),
68 RATE(55, 2, 2, IEEE80211_RATE_SHORT_PREAMBLE),
69 RATE(110, 3, 3, IEEE80211_RATE_SHORT_PREAMBLE),
70 RATE(60, 0xb, 0, 0),
71 RATE(90, 0xf, 0, 0),
72 RATE(120, 0xa, 0, 0),
73 RATE(180, 0xe, 0, 0),
74 RATE(240, 0x9, 0, 0),
75 RATE(360, 0xd, 1, 0),
76 RATE(480, 0x8, 2, 0),
77 RATE(540, 0xc, 3, 0),
78};
79#undef RATE
80
81#define carl9170_g_ratetable (__carl9170_ratetable + 0)
82#define carl9170_g_ratetable_size 12
83#define carl9170_a_ratetable (__carl9170_ratetable + 4)
84#define carl9170_a_ratetable_size 8
85
86/*
87 * NB: The hw_value is used as an index into the carl9170_phy_freq_params
88 * array in phy.c so that we don't have to do frequency lookups!
89 */
90#define CHAN(_freq, _idx) { \
91 .center_freq = (_freq), \
92 .hw_value = (_idx), \
93 .max_power = 18, /* XXX */ \
94}
95
96static struct ieee80211_channel carl9170_2ghz_chantable[] = {
97 CHAN(2412, 0),
98 CHAN(2417, 1),
99 CHAN(2422, 2),
100 CHAN(2427, 3),
101 CHAN(2432, 4),
102 CHAN(2437, 5),
103 CHAN(2442, 6),
104 CHAN(2447, 7),
105 CHAN(2452, 8),
106 CHAN(2457, 9),
107 CHAN(2462, 10),
108 CHAN(2467, 11),
109 CHAN(2472, 12),
110 CHAN(2484, 13),
111};
112
113static struct ieee80211_channel carl9170_5ghz_chantable[] = {
114 CHAN(4920, 14),
115 CHAN(4940, 15),
116 CHAN(4960, 16),
117 CHAN(4980, 17),
118 CHAN(5040, 18),
119 CHAN(5060, 19),
120 CHAN(5080, 20),
121 CHAN(5180, 21),
122 CHAN(5200, 22),
123 CHAN(5220, 23),
124 CHAN(5240, 24),
125 CHAN(5260, 25),
126 CHAN(5280, 26),
127 CHAN(5300, 27),
128 CHAN(5320, 28),
129 CHAN(5500, 29),
130 CHAN(5520, 30),
131 CHAN(5540, 31),
132 CHAN(5560, 32),
133 CHAN(5580, 33),
134 CHAN(5600, 34),
135 CHAN(5620, 35),
136 CHAN(5640, 36),
137 CHAN(5660, 37),
138 CHAN(5680, 38),
139 CHAN(5700, 39),
140 CHAN(5745, 40),
141 CHAN(5765, 41),
142 CHAN(5785, 42),
143 CHAN(5805, 43),
144 CHAN(5825, 44),
145 CHAN(5170, 45),
146 CHAN(5190, 46),
147 CHAN(5210, 47),
148 CHAN(5230, 48),
149};
150#undef CHAN
151
152#define CARL9170_HT_CAP \
153{ \
154 .ht_supported = true, \
155 .cap = IEEE80211_HT_CAP_MAX_AMSDU | \
156 IEEE80211_HT_CAP_SUP_WIDTH_20_40 | \
157 IEEE80211_HT_CAP_SGI_40 | \
158 IEEE80211_HT_CAP_DSSSCCK40 | \
159 IEEE80211_HT_CAP_SM_PS, \
160 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K, \
161 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8, \
162 .mcs = { \
163 .rx_mask = { 0xff, 0xff, 0, 0, 0x1, 0, 0, 0, 0, 0, }, \
164 .rx_highest = cpu_to_le16(300), \
165 .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
166 }, \
167}
168
169static struct ieee80211_supported_band carl9170_band_2GHz = {
170 .channels = carl9170_2ghz_chantable,
171 .n_channels = ARRAY_SIZE(carl9170_2ghz_chantable),
172 .bitrates = carl9170_g_ratetable,
173 .n_bitrates = carl9170_g_ratetable_size,
174 .ht_cap = CARL9170_HT_CAP,
175};
176
177static struct ieee80211_supported_band carl9170_band_5GHz = {
178 .channels = carl9170_5ghz_chantable,
179 .n_channels = ARRAY_SIZE(carl9170_5ghz_chantable),
180 .bitrates = carl9170_a_ratetable,
181 .n_bitrates = carl9170_a_ratetable_size,
182 .ht_cap = CARL9170_HT_CAP,
183};
184
185static void carl9170_ampdu_gc(struct ar9170 *ar)
186{
187 struct carl9170_sta_tid *tid_info;
188 LIST_HEAD(tid_gc);
189
190 rcu_read_lock();
191 list_for_each_entry_rcu(tid_info, &ar->tx_ampdu_list, list) {
192 spin_lock_bh(&ar->tx_ampdu_list_lock);
193 if (tid_info->state == CARL9170_TID_STATE_SHUTDOWN) {
194 tid_info->state = CARL9170_TID_STATE_KILLED;
195 list_del_rcu(&tid_info->list);
196 ar->tx_ampdu_list_len--;
197 list_add_tail(&tid_info->tmp_list, &tid_gc);
198 }
199 spin_unlock_bh(&ar->tx_ampdu_list_lock);
200
201 }
202 rcu_assign_pointer(ar->tx_ampdu_iter, tid_info);
203 rcu_read_unlock();
204
205 synchronize_rcu();
206
207 while (!list_empty(&tid_gc)) {
208 struct sk_buff *skb;
209 tid_info = list_first_entry(&tid_gc, struct carl9170_sta_tid,
210 tmp_list);
211
212 while ((skb = __skb_dequeue(&tid_info->queue)))
213 carl9170_tx_status(ar, skb, false);
214
215 list_del_init(&tid_info->tmp_list);
216 kfree(tid_info);
217 }
218}
219
220static void carl9170_flush(struct ar9170 *ar, bool drop_queued)
221{
222 if (drop_queued) {
223 int i;
224
225 /*
226 * We can only drop frames which have not been uploaded
227 * to the device yet.
228 */
229
230 for (i = 0; i < ar->hw->queues; i++) {
231 struct sk_buff *skb;
232
Christian Lampartercb139ec2010-09-26 22:49:34 +0200233 while ((skb = skb_dequeue(&ar->tx_pending[i]))) {
234 struct ieee80211_tx_info *info;
235
236 info = IEEE80211_SKB_CB(skb);
237 if (info->flags & IEEE80211_TX_CTL_AMPDU)
238 atomic_dec(&ar->tx_ampdu_upload);
239
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200240 carl9170_tx_status(ar, skb, false);
Christian Lampartercb139ec2010-09-26 22:49:34 +0200241 }
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200242 }
243 }
244
245 /* Wait for all other outstanding frames to timeout. */
246 if (atomic_read(&ar->tx_total_queued))
247 WARN_ON(wait_for_completion_timeout(&ar->tx_flush, HZ) == 0);
248}
249
250static void carl9170_flush_ba(struct ar9170 *ar)
251{
252 struct sk_buff_head free;
253 struct carl9170_sta_tid *tid_info;
254 struct sk_buff *skb;
255
256 __skb_queue_head_init(&free);
257
258 rcu_read_lock();
259 spin_lock_bh(&ar->tx_ampdu_list_lock);
260 list_for_each_entry_rcu(tid_info, &ar->tx_ampdu_list, list) {
261 if (tid_info->state > CARL9170_TID_STATE_SUSPEND) {
262 tid_info->state = CARL9170_TID_STATE_SUSPEND;
263
264 spin_lock(&tid_info->lock);
265 while ((skb = __skb_dequeue(&tid_info->queue)))
266 __skb_queue_tail(&free, skb);
267 spin_unlock(&tid_info->lock);
268 }
269 }
270 spin_unlock_bh(&ar->tx_ampdu_list_lock);
271 rcu_read_unlock();
272
273 while ((skb = __skb_dequeue(&free)))
274 carl9170_tx_status(ar, skb, false);
275}
276
277static void carl9170_zap_queues(struct ar9170 *ar)
278{
279 struct carl9170_vif_info *cvif;
280 unsigned int i;
281
282 carl9170_ampdu_gc(ar);
283
284 carl9170_flush_ba(ar);
285 carl9170_flush(ar, true);
286
287 for (i = 0; i < ar->hw->queues; i++) {
288 spin_lock_bh(&ar->tx_status[i].lock);
289 while (!skb_queue_empty(&ar->tx_status[i])) {
290 struct sk_buff *skb;
291
292 skb = skb_peek(&ar->tx_status[i]);
293 carl9170_tx_get_skb(skb);
294 spin_unlock_bh(&ar->tx_status[i].lock);
295 carl9170_tx_drop(ar, skb);
296 spin_lock_bh(&ar->tx_status[i].lock);
297 carl9170_tx_put_skb(skb);
298 }
299 spin_unlock_bh(&ar->tx_status[i].lock);
300 }
301
302 BUILD_BUG_ON(CARL9170_NUM_TX_LIMIT_SOFT < 1);
303 BUILD_BUG_ON(CARL9170_NUM_TX_LIMIT_HARD < CARL9170_NUM_TX_LIMIT_SOFT);
304 BUILD_BUG_ON(CARL9170_NUM_TX_LIMIT_HARD >= CARL9170_BAW_BITS);
305
306 /* reinitialize queues statistics */
307 memset(&ar->tx_stats, 0, sizeof(ar->tx_stats));
308 for (i = 0; i < ar->hw->queues; i++)
309 ar->tx_stats[i].limit = CARL9170_NUM_TX_LIMIT_HARD;
310
311 for (i = 0; i < DIV_ROUND_UP(ar->fw.mem_blocks, BITS_PER_LONG); i++)
312 ar->mem_bitmap[i] = 0;
313
314 rcu_read_lock();
315 list_for_each_entry_rcu(cvif, &ar->vif_list, list) {
316 spin_lock_bh(&ar->beacon_lock);
317 dev_kfree_skb_any(cvif->beacon);
318 cvif->beacon = NULL;
319 spin_unlock_bh(&ar->beacon_lock);
320 }
321 rcu_read_unlock();
322
323 atomic_set(&ar->tx_ampdu_upload, 0);
324 atomic_set(&ar->tx_ampdu_scheduler, 0);
325 atomic_set(&ar->tx_total_pending, 0);
326 atomic_set(&ar->tx_total_queued, 0);
327 atomic_set(&ar->mem_free_blocks, ar->fw.mem_blocks);
328}
329
330#define CARL9170_FILL_QUEUE(queue, ai_fs, cwmin, cwmax, _txop) \
331do { \
332 queue.aifs = ai_fs; \
333 queue.cw_min = cwmin; \
334 queue.cw_max = cwmax; \
335 queue.txop = _txop; \
336} while (0)
337
338static int carl9170_op_start(struct ieee80211_hw *hw)
339{
340 struct ar9170 *ar = hw->priv;
341 int err, i;
342
343 mutex_lock(&ar->mutex);
344
345 carl9170_zap_queues(ar);
346
347 /* reset QoS defaults */
Christian Lamparterc2a79652011-07-01 15:28:22 +0200348 CARL9170_FILL_QUEUE(ar->edcf[AR9170_TXQ_VO], 2, 3, 7, 47);
349 CARL9170_FILL_QUEUE(ar->edcf[AR9170_TXQ_VI], 2, 7, 15, 94);
350 CARL9170_FILL_QUEUE(ar->edcf[AR9170_TXQ_BE], 3, 15, 1023, 0);
351 CARL9170_FILL_QUEUE(ar->edcf[AR9170_TXQ_BK], 7, 15, 1023, 0);
352 CARL9170_FILL_QUEUE(ar->edcf[AR9170_TXQ_SPECIAL], 2, 3, 7, 0);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200353
354 ar->current_factor = ar->current_density = -1;
355 /* "The first key is unique." */
356 ar->usedkeys = 1;
357 ar->filter_state = 0;
358 ar->ps.last_action = jiffies;
359 ar->ps.last_slept = jiffies;
360 ar->erp_mode = CARL9170_ERP_AUTO;
361 ar->rx_software_decryption = false;
362 ar->disable_offload = false;
363
364 for (i = 0; i < ar->hw->queues; i++) {
365 ar->queue_stop_timeout[i] = jiffies;
366 ar->max_queue_stop_timeout[i] = 0;
367 }
368
369 atomic_set(&ar->mem_allocs, 0);
370
371 err = carl9170_usb_open(ar);
372 if (err)
373 goto out;
374
375 err = carl9170_init_mac(ar);
376 if (err)
377 goto out;
378
379 err = carl9170_set_qos(ar);
380 if (err)
381 goto out;
382
Christian Lamparter5c895692010-09-28 23:00:59 +0200383 if (ar->fw.rx_filter) {
384 err = carl9170_rx_filter(ar, CARL9170_RX_FILTER_OTHER_RA |
385 CARL9170_RX_FILTER_CTL_OTHER | CARL9170_RX_FILTER_BAD);
386 if (err)
387 goto out;
388 }
389
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200390 err = carl9170_write_reg(ar, AR9170_MAC_REG_DMA_TRIGGER,
391 AR9170_DMA_TRIGGER_RXQ);
392 if (err)
393 goto out;
394
395 /* Clear key-cache */
396 for (i = 0; i < AR9170_CAM_MAX_USER + 4; i++) {
397 err = carl9170_upload_key(ar, i, NULL, AR9170_ENC_ALG_NONE,
398 0, NULL, 0);
399 if (err)
400 goto out;
401
402 err = carl9170_upload_key(ar, i, NULL, AR9170_ENC_ALG_NONE,
403 1, NULL, 0);
404 if (err)
405 goto out;
406
407 if (i < AR9170_CAM_MAX_USER) {
408 err = carl9170_disable_key(ar, i);
409 if (err)
410 goto out;
411 }
412 }
413
414 carl9170_set_state_when(ar, CARL9170_IDLE, CARL9170_STARTED);
415
Christian Lamparteracf17712011-08-15 19:50:48 +0200416 ieee80211_queue_delayed_work(ar->hw, &ar->stat_work,
417 round_jiffies(msecs_to_jiffies(CARL9170_STAT_WORK)));
418
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200419 ieee80211_wake_queues(ar->hw);
420 err = 0;
421
422out:
423 mutex_unlock(&ar->mutex);
424 return err;
425}
426
427static void carl9170_cancel_worker(struct ar9170 *ar)
428{
Christian Lamparteracf17712011-08-15 19:50:48 +0200429 cancel_delayed_work_sync(&ar->stat_work);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200430 cancel_delayed_work_sync(&ar->tx_janitor);
431#ifdef CONFIG_CARL9170_LEDS
432 cancel_delayed_work_sync(&ar->led_work);
433#endif /* CONFIG_CARL9170_LEDS */
434 cancel_work_sync(&ar->ps_work);
Christian Lampartere4a668c2010-10-29 23:26:13 +0200435 cancel_work_sync(&ar->ping_work);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200436 cancel_work_sync(&ar->ampdu_work);
437}
438
439static void carl9170_op_stop(struct ieee80211_hw *hw)
440{
441 struct ar9170 *ar = hw->priv;
442
443 carl9170_set_state_when(ar, CARL9170_STARTED, CARL9170_IDLE);
444
445 ieee80211_stop_queues(ar->hw);
446
447 mutex_lock(&ar->mutex);
448 if (IS_ACCEPTING_CMD(ar)) {
Eric Dumazet2cfa5a02011-11-23 07:09:32 +0000449 RCU_INIT_POINTER(ar->beacon_iter, NULL);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200450
451 carl9170_led_set_state(ar, 0);
452
453 /* stop DMA */
454 carl9170_write_reg(ar, AR9170_MAC_REG_DMA_TRIGGER, 0);
455 carl9170_usb_stop(ar);
456 }
457
458 carl9170_zap_queues(ar);
459 mutex_unlock(&ar->mutex);
460
461 carl9170_cancel_worker(ar);
462}
463
464static void carl9170_restart_work(struct work_struct *work)
465{
466 struct ar9170 *ar = container_of(work, struct ar9170,
467 restart_work);
Ronald Wahl5bcbc3f2012-10-08 14:17:07 +0200468 int err = -EIO;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200469
470 ar->usedkeys = 0;
471 ar->filter_state = 0;
472 carl9170_cancel_worker(ar);
473
474 mutex_lock(&ar->mutex);
Ronald Wahl5bcbc3f2012-10-08 14:17:07 +0200475 if (!ar->force_usb_reset) {
476 err = carl9170_usb_restart(ar);
477 if (net_ratelimit()) {
478 if (err)
479 dev_err(&ar->udev->dev, "Failed to restart device (%d).\n", err);
480 else
481 dev_info(&ar->udev->dev, "device restarted successfully.\n");
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200482 }
483 }
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200484 carl9170_zap_queues(ar);
485 mutex_unlock(&ar->mutex);
Ronald Wahl5bcbc3f2012-10-08 14:17:07 +0200486
487 if (!err && !ar->force_usb_reset) {
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200488 ar->restart_counter++;
489 atomic_set(&ar->pending_restarts, 0);
490
491 ieee80211_restart_hw(ar->hw);
492 } else {
493 /*
494 * The reset was unsuccessful and the device seems to
495 * be dead. But there's still one option: a low-level
496 * usb subsystem reset...
497 */
498
499 carl9170_usb_reset(ar);
500 }
501}
502
503void carl9170_restart(struct ar9170 *ar, const enum carl9170_restart_reasons r)
504{
505 carl9170_set_state_when(ar, CARL9170_STARTED, CARL9170_IDLE);
506
507 /*
508 * Sometimes, an error can trigger several different reset events.
509 * By ignoring these *surplus* reset events, the device won't be
510 * killed again, right after it has recovered.
511 */
512 if (atomic_inc_return(&ar->pending_restarts) > 1) {
513 dev_dbg(&ar->udev->dev, "ignoring restart (%d)\n", r);
514 return;
515 }
516
517 ieee80211_stop_queues(ar->hw);
518
519 dev_err(&ar->udev->dev, "restart device (%d)\n", r);
520
521 if (!WARN_ON(r == CARL9170_RR_NO_REASON) ||
522 !WARN_ON(r >= __CARL9170_RR_LAST))
523 ar->last_reason = r;
524
525 if (!ar->registered)
526 return;
527
Ronald Wahl5bcbc3f2012-10-08 14:17:07 +0200528 if (!IS_ACCEPTING_CMD(ar) || ar->needs_full_reset)
529 ar->force_usb_reset = true;
530
531 ieee80211_queue_work(ar->hw, &ar->restart_work);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200532
533 /*
534 * At this point, the device instance might have vanished/disabled.
535 * So, don't put any code which access the ar9170 struct
536 * without proper protection.
537 */
538}
539
Christian Lampartere4a668c2010-10-29 23:26:13 +0200540static void carl9170_ping_work(struct work_struct *work)
541{
542 struct ar9170 *ar = container_of(work, struct ar9170, ping_work);
543 int err;
544
545 if (!IS_STARTED(ar))
546 return;
547
548 mutex_lock(&ar->mutex);
549 err = carl9170_echo_test(ar, 0xdeadbeef);
550 if (err)
551 carl9170_restart(ar, CARL9170_RR_UNRESPONSIVE_DEVICE);
552 mutex_unlock(&ar->mutex);
553}
554
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200555static int carl9170_init_interface(struct ar9170 *ar,
556 struct ieee80211_vif *vif)
557{
558 struct ath_common *common = &ar->common;
559 int err;
560
561 if (!vif) {
562 WARN_ON_ONCE(IS_STARTED(ar));
563 return 0;
564 }
565
566 memcpy(common->macaddr, vif->addr, ETH_ALEN);
567
568 if (modparam_nohwcrypt ||
569 ((vif->type != NL80211_IFTYPE_STATION) &&
570 (vif->type != NL80211_IFTYPE_AP))) {
571 ar->rx_software_decryption = true;
572 ar->disable_offload = true;
573 }
574
575 err = carl9170_set_operating_mode(ar);
576 return err;
577}
578
579static int carl9170_op_add_interface(struct ieee80211_hw *hw,
580 struct ieee80211_vif *vif)
581{
582 struct carl9170_vif_info *vif_priv = (void *) vif->drv_priv;
Christian Lamparter7f878b02012-12-16 01:41:37 +0100583 struct ieee80211_vif *main_vif, *old_main = NULL;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200584 struct ar9170 *ar = hw->priv;
585 int vif_id = -1, err = 0;
586
587 mutex_lock(&ar->mutex);
588 rcu_read_lock();
589 if (vif_priv->active) {
590 /*
591 * Skip the interface structure initialization,
592 * if the vif survived the _restart call.
593 */
594 vif_id = vif_priv->id;
595 vif_priv->enable_beacon = false;
596
597 spin_lock_bh(&ar->beacon_lock);
598 dev_kfree_skb_any(vif_priv->beacon);
599 vif_priv->beacon = NULL;
600 spin_unlock_bh(&ar->beacon_lock);
601
602 goto init;
603 }
604
Christian Lamparter7f878b02012-12-16 01:41:37 +0100605 /* Because the AR9170 HW's MAC doesn't provide full support for
606 * multiple, independent interfaces [of different operation modes].
607 * We have to select ONE main interface [main mode of HW], but we
608 * can have multiple slaves [AKA: entry in the ACK-table].
609 *
610 * The first (from HEAD/TOP) interface in the ar->vif_list is
611 * always the main intf. All following intfs in this list
612 * are considered to be slave intfs.
613 */
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200614 main_vif = carl9170_get_main_vif(ar);
615
616 if (main_vif) {
617 switch (main_vif->type) {
618 case NL80211_IFTYPE_STATION:
619 if (vif->type == NL80211_IFTYPE_STATION)
620 break;
621
Christian Lamparter7f878b02012-12-16 01:41:37 +0100622 /* P2P GO [master] use-case
623 * Because the P2P GO station is selected dynamically
624 * by all participating peers of a WIFI Direct network,
625 * the driver has be able to change the main interface
626 * operating mode on the fly.
627 */
628 if (main_vif->p2p && vif->p2p &&
629 vif->type == NL80211_IFTYPE_AP) {
630 old_main = main_vif;
631 break;
632 }
633
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200634 err = -EBUSY;
635 rcu_read_unlock();
636
637 goto unlock;
638
Javier Lopezda93c262012-07-27 11:27:25 -0700639 case NL80211_IFTYPE_MESH_POINT:
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200640 case NL80211_IFTYPE_AP:
641 if ((vif->type == NL80211_IFTYPE_STATION) ||
642 (vif->type == NL80211_IFTYPE_WDS) ||
Javier Lopezda93c262012-07-27 11:27:25 -0700643 (vif->type == NL80211_IFTYPE_AP) ||
644 (vif->type == NL80211_IFTYPE_MESH_POINT))
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200645 break;
646
647 err = -EBUSY;
648 rcu_read_unlock();
649 goto unlock;
650
651 default:
652 rcu_read_unlock();
653 goto unlock;
654 }
655 }
656
657 vif_id = bitmap_find_free_region(&ar->vif_bitmap, ar->fw.vif_num, 0);
658
659 if (vif_id < 0) {
660 rcu_read_unlock();
661
662 err = -ENOSPC;
663 goto unlock;
664 }
665
666 BUG_ON(ar->vif_priv[vif_id].id != vif_id);
667
668 vif_priv->active = true;
669 vif_priv->id = vif_id;
670 vif_priv->enable_beacon = false;
671 ar->vifs++;
Christian Lamparter7f878b02012-12-16 01:41:37 +0100672 if (old_main) {
673 /* We end up in here, if the main interface is being replaced.
674 * Put the new main interface at the HEAD of the list and the
675 * previous inteface will automatically become second in line.
676 */
677 list_add_rcu(&vif_priv->list, &ar->vif_list);
678 } else {
679 /* Add new inteface. If the list is empty, it will become the
680 * main inteface, otherwise it will be slave.
681 */
682 list_add_tail_rcu(&vif_priv->list, &ar->vif_list);
683 }
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200684 rcu_assign_pointer(ar->vif_priv[vif_id].vif, vif);
685
686init:
Christian Lamparter7f878b02012-12-16 01:41:37 +0100687 main_vif = carl9170_get_main_vif(ar);
688
689 if (main_vif == vif) {
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200690 rcu_assign_pointer(ar->beacon_iter, vif_priv);
691 rcu_read_unlock();
692
Christian Lamparter7f878b02012-12-16 01:41:37 +0100693 if (old_main) {
694 struct carl9170_vif_info *old_main_priv =
695 (void *) old_main->drv_priv;
696 /* downgrade old main intf to slave intf.
697 * NOTE: We are no longer under rcu_read_lock.
698 * But we are still holding ar->mutex, so the
699 * vif data [id, addr] is safe.
700 */
701 err = carl9170_mod_virtual_mac(ar, old_main_priv->id,
702 old_main->addr);
703 if (err)
704 goto unlock;
705 }
706
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200707 err = carl9170_init_interface(ar, vif);
708 if (err)
709 goto unlock;
710 } else {
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200711 rcu_read_unlock();
Christian Lamparterdafeac32010-10-23 15:02:02 +0200712 err = carl9170_mod_virtual_mac(ar, vif_id, vif->addr);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200713
714 if (err)
715 goto unlock;
716 }
717
Christian Lamparteraa324522011-01-23 00:18:28 +0100718 if (ar->fw.tx_seq_table) {
719 err = carl9170_write_reg(ar, ar->fw.tx_seq_table + vif_id * 4,
720 0);
721 if (err)
722 goto unlock;
723 }
724
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200725unlock:
Christian Lamparterb3974922010-11-20 13:15:27 +0100726 if (err && (vif_id >= 0)) {
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200727 vif_priv->active = false;
728 bitmap_release_region(&ar->vif_bitmap, vif_id, 0);
729 ar->vifs--;
Eric Dumazet2cfa5a02011-11-23 07:09:32 +0000730 RCU_INIT_POINTER(ar->vif_priv[vif_id].vif, NULL);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200731 list_del_rcu(&vif_priv->list);
732 mutex_unlock(&ar->mutex);
733 synchronize_rcu();
734 } else {
735 if (ar->vifs > 1)
736 ar->ps.off_override |= PS_OFF_VIF;
737
738 mutex_unlock(&ar->mutex);
739 }
740
741 return err;
742}
743
744static void carl9170_op_remove_interface(struct ieee80211_hw *hw,
745 struct ieee80211_vif *vif)
746{
747 struct carl9170_vif_info *vif_priv = (void *) vif->drv_priv;
748 struct ieee80211_vif *main_vif;
749 struct ar9170 *ar = hw->priv;
750 unsigned int id;
751
752 mutex_lock(&ar->mutex);
753
754 if (WARN_ON_ONCE(!vif_priv->active))
755 goto unlock;
756
757 ar->vifs--;
758
759 rcu_read_lock();
760 main_vif = carl9170_get_main_vif(ar);
761
762 id = vif_priv->id;
763
764 vif_priv->active = false;
765 WARN_ON(vif_priv->enable_beacon);
766 vif_priv->enable_beacon = false;
767 list_del_rcu(&vif_priv->list);
Eric Dumazet2cfa5a02011-11-23 07:09:32 +0000768 RCU_INIT_POINTER(ar->vif_priv[id].vif, NULL);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200769
770 if (vif == main_vif) {
771 rcu_read_unlock();
772
773 if (ar->vifs) {
774 WARN_ON(carl9170_init_interface(ar,
775 carl9170_get_main_vif(ar)));
776 } else {
777 carl9170_set_operating_mode(ar);
778 }
779 } else {
780 rcu_read_unlock();
781
782 WARN_ON(carl9170_mod_virtual_mac(ar, id, NULL));
783 }
784
785 carl9170_update_beacon(ar, false);
786 carl9170_flush_cab(ar, id);
787
788 spin_lock_bh(&ar->beacon_lock);
789 dev_kfree_skb_any(vif_priv->beacon);
790 vif_priv->beacon = NULL;
791 spin_unlock_bh(&ar->beacon_lock);
792
793 bitmap_release_region(&ar->vif_bitmap, id, 0);
794
795 carl9170_set_beacon_timers(ar);
796
797 if (ar->vifs == 1)
798 ar->ps.off_override &= ~PS_OFF_VIF;
799
800unlock:
801 mutex_unlock(&ar->mutex);
802
803 synchronize_rcu();
804}
805
806void carl9170_ps_check(struct ar9170 *ar)
807{
808 ieee80211_queue_work(ar->hw, &ar->ps_work);
809}
810
811/* caller must hold ar->mutex */
812static int carl9170_ps_update(struct ar9170 *ar)
813{
814 bool ps = false;
815 int err = 0;
816
817 if (!ar->ps.off_override)
818 ps = (ar->hw->conf.flags & IEEE80211_CONF_PS);
819
820 if (ps != ar->ps.state) {
821 err = carl9170_powersave(ar, ps);
822 if (err)
823 return err;
824
825 if (ar->ps.state && !ps) {
826 ar->ps.sleep_ms = jiffies_to_msecs(jiffies -
827 ar->ps.last_action);
828 }
829
830 if (ps)
831 ar->ps.last_slept = jiffies;
832
833 ar->ps.last_action = jiffies;
834 ar->ps.state = ps;
835 }
836
837 return 0;
838}
839
840static void carl9170_ps_work(struct work_struct *work)
841{
842 struct ar9170 *ar = container_of(work, struct ar9170,
843 ps_work);
844 mutex_lock(&ar->mutex);
845 if (IS_STARTED(ar))
846 WARN_ON_ONCE(carl9170_ps_update(ar) != 0);
847 mutex_unlock(&ar->mutex);
848}
849
Christian Lamparteracf17712011-08-15 19:50:48 +0200850static int carl9170_update_survey(struct ar9170 *ar, bool flush, bool noise)
851{
852 int err;
853
854 if (noise) {
855 err = carl9170_get_noisefloor(ar);
856 if (err)
857 return err;
858 }
859
860 if (ar->fw.hw_counters) {
861 err = carl9170_collect_tally(ar);
862 if (err)
863 return err;
864 }
865
866 if (flush)
867 memset(&ar->tally, 0, sizeof(ar->tally));
868
869 return 0;
870}
871
872static void carl9170_stat_work(struct work_struct *work)
873{
874 struct ar9170 *ar = container_of(work, struct ar9170, stat_work.work);
875 int err;
876
877 mutex_lock(&ar->mutex);
878 err = carl9170_update_survey(ar, false, true);
879 mutex_unlock(&ar->mutex);
880
881 if (err)
882 return;
883
884 ieee80211_queue_delayed_work(ar->hw, &ar->stat_work,
885 round_jiffies(msecs_to_jiffies(CARL9170_STAT_WORK)));
886}
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200887
888static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed)
889{
890 struct ar9170 *ar = hw->priv;
891 int err = 0;
892
893 mutex_lock(&ar->mutex);
894 if (changed & IEEE80211_CONF_CHANGE_LISTEN_INTERVAL) {
895 /* TODO */
896 err = 0;
897 }
898
899 if (changed & IEEE80211_CONF_CHANGE_PS) {
900 err = carl9170_ps_update(ar);
901 if (err)
902 goto out;
903 }
904
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200905 if (changed & IEEE80211_CONF_CHANGE_SMPS) {
906 /* TODO */
907 err = 0;
908 }
909
910 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
911 /* adjust slot time for 5 GHz */
912 err = carl9170_set_slot_time(ar);
913 if (err)
914 goto out;
915
Christian Lamparteracf17712011-08-15 19:50:48 +0200916 err = carl9170_update_survey(ar, true, false);
917 if (err)
918 goto out;
919
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200920 err = carl9170_set_channel(ar, hw->conf.channel,
921 hw->conf.channel_type, CARL9170_RFI_NONE);
922 if (err)
923 goto out;
924
Christian Lamparteracf17712011-08-15 19:50:48 +0200925 err = carl9170_update_survey(ar, false, true);
926 if (err)
927 goto out;
928
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200929 err = carl9170_set_dyn_sifs_ack(ar);
930 if (err)
931 goto out;
932
933 err = carl9170_set_rts_cts_rate(ar);
934 if (err)
935 goto out;
936 }
937
Christian Lamparter67e43de2012-01-21 16:59:10 +0100938 if (changed & IEEE80211_CONF_CHANGE_POWER) {
939 err = carl9170_set_mac_tpc(ar, ar->hw->conf.channel);
940 if (err)
941 goto out;
942 }
943
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200944out:
945 mutex_unlock(&ar->mutex);
946 return err;
947}
948
949static u64 carl9170_op_prepare_multicast(struct ieee80211_hw *hw,
950 struct netdev_hw_addr_list *mc_list)
951{
952 struct netdev_hw_addr *ha;
953 u64 mchash;
954
955 /* always get broadcast frames */
956 mchash = 1ULL << (0xff >> 2);
957
958 netdev_hw_addr_list_for_each(ha, mc_list)
959 mchash |= 1ULL << (ha->addr[5] >> 2);
960
961 return mchash;
962}
963
964static void carl9170_op_configure_filter(struct ieee80211_hw *hw,
965 unsigned int changed_flags,
966 unsigned int *new_flags,
967 u64 multicast)
968{
969 struct ar9170 *ar = hw->priv;
970
971 /* mask supported flags */
Christian Lamparter5c895692010-09-28 23:00:59 +0200972 *new_flags &= FIF_ALLMULTI | ar->rx_filter_caps;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200973
974 if (!IS_ACCEPTING_CMD(ar))
975 return;
976
977 mutex_lock(&ar->mutex);
978
979 ar->filter_state = *new_flags;
980 /*
981 * We can support more by setting the sniffer bit and
982 * then checking the error flags, later.
983 */
984
Nicolas Cavallari8f7f3b22011-05-04 15:26:52 +0200985 if (*new_flags & FIF_ALLMULTI)
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200986 multicast = ~0ULL;
987
988 if (multicast != ar->cur_mc_hash)
989 WARN_ON(carl9170_update_multicast(ar, multicast));
990
991 if (changed_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS)) {
992 ar->sniffer_enabled = !!(*new_flags &
993 (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS));
994
995 WARN_ON(carl9170_set_operating_mode(ar));
996 }
997
Christian Lamparter5c895692010-09-28 23:00:59 +0200998 if (ar->fw.rx_filter && changed_flags & ar->rx_filter_caps) {
999 u32 rx_filter = 0;
1000
Christian Lamparterc9122c02012-07-07 21:13:59 +02001001 if (!ar->fw.ba_filter)
1002 rx_filter |= CARL9170_RX_FILTER_CTL_OTHER;
1003
Christian Lamparter5c895692010-09-28 23:00:59 +02001004 if (!(*new_flags & (FIF_FCSFAIL | FIF_PLCPFAIL)))
1005 rx_filter |= CARL9170_RX_FILTER_BAD;
1006
1007 if (!(*new_flags & FIF_CONTROL))
1008 rx_filter |= CARL9170_RX_FILTER_CTL_OTHER;
1009
1010 if (!(*new_flags & FIF_PSPOLL))
1011 rx_filter |= CARL9170_RX_FILTER_CTL_PSPOLL;
1012
1013 if (!(*new_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS))) {
1014 rx_filter |= CARL9170_RX_FILTER_OTHER_RA;
1015 rx_filter |= CARL9170_RX_FILTER_DECRY_FAIL;
1016 }
1017
1018 WARN_ON(carl9170_rx_filter(ar, rx_filter));
1019 }
1020
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001021 mutex_unlock(&ar->mutex);
1022}
1023
1024
1025static void carl9170_op_bss_info_changed(struct ieee80211_hw *hw,
1026 struct ieee80211_vif *vif,
1027 struct ieee80211_bss_conf *bss_conf,
1028 u32 changed)
1029{
1030 struct ar9170 *ar = hw->priv;
1031 struct ath_common *common = &ar->common;
1032 int err = 0;
1033 struct carl9170_vif_info *vif_priv;
1034 struct ieee80211_vif *main_vif;
1035
1036 mutex_lock(&ar->mutex);
1037 vif_priv = (void *) vif->drv_priv;
1038 main_vif = carl9170_get_main_vif(ar);
1039 if (WARN_ON(!main_vif))
1040 goto out;
1041
1042 if (changed & BSS_CHANGED_BEACON_ENABLED) {
1043 struct carl9170_vif_info *iter;
1044 int i = 0;
1045
1046 vif_priv->enable_beacon = bss_conf->enable_beacon;
1047 rcu_read_lock();
1048 list_for_each_entry_rcu(iter, &ar->vif_list, list) {
1049 if (iter->active && iter->enable_beacon)
1050 i++;
1051
1052 }
1053 rcu_read_unlock();
1054
1055 ar->beacon_enabled = i;
1056 }
1057
1058 if (changed & BSS_CHANGED_BEACON) {
1059 err = carl9170_update_beacon(ar, false);
1060 if (err)
1061 goto out;
1062 }
1063
1064 if (changed & (BSS_CHANGED_BEACON_ENABLED | BSS_CHANGED_BEACON |
1065 BSS_CHANGED_BEACON_INT)) {
1066
1067 if (main_vif != vif) {
1068 bss_conf->beacon_int = main_vif->bss_conf.beacon_int;
1069 bss_conf->dtim_period = main_vif->bss_conf.dtim_period;
1070 }
1071
1072 /*
1073 * Therefore a hard limit for the broadcast traffic should
1074 * prevent false alarms.
1075 */
1076 if (vif->type != NL80211_IFTYPE_STATION &&
1077 (bss_conf->beacon_int * bss_conf->dtim_period >=
1078 (CARL9170_QUEUE_STUCK_TIMEOUT / 2))) {
1079 err = -EINVAL;
1080 goto out;
1081 }
1082
1083 err = carl9170_set_beacon_timers(ar);
1084 if (err)
1085 goto out;
1086 }
1087
1088 if (changed & BSS_CHANGED_HT) {
1089 /* TODO */
1090 err = 0;
1091 if (err)
1092 goto out;
1093 }
1094
1095 if (main_vif != vif)
1096 goto out;
1097
1098 /*
1099 * The following settings can only be changed by the
1100 * master interface.
1101 */
1102
1103 if (changed & BSS_CHANGED_BSSID) {
1104 memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
1105 err = carl9170_set_operating_mode(ar);
1106 if (err)
1107 goto out;
1108 }
1109
1110 if (changed & BSS_CHANGED_ASSOC) {
1111 ar->common.curaid = bss_conf->aid;
1112 err = carl9170_set_beacon_timers(ar);
1113 if (err)
1114 goto out;
1115 }
1116
1117 if (changed & BSS_CHANGED_ERP_SLOT) {
1118 err = carl9170_set_slot_time(ar);
1119 if (err)
1120 goto out;
1121 }
1122
1123 if (changed & BSS_CHANGED_BASIC_RATES) {
1124 err = carl9170_set_mac_rates(ar);
1125 if (err)
1126 goto out;
1127 }
1128
1129out:
1130 WARN_ON_ONCE(err && IS_STARTED(ar));
1131 mutex_unlock(&ar->mutex);
1132}
1133
Eliad Peller37a41b42011-09-21 14:06:11 +03001134static u64 carl9170_op_get_tsf(struct ieee80211_hw *hw,
1135 struct ieee80211_vif *vif)
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001136{
1137 struct ar9170 *ar = hw->priv;
1138 struct carl9170_tsf_rsp tsf;
1139 int err;
1140
1141 mutex_lock(&ar->mutex);
1142 err = carl9170_exec_cmd(ar, CARL9170_CMD_READ_TSF,
1143 0, NULL, sizeof(tsf), &tsf);
1144 mutex_unlock(&ar->mutex);
1145 if (WARN_ON(err))
1146 return 0;
1147
1148 return le64_to_cpu(tsf.tsf_64);
1149}
1150
1151static int carl9170_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1152 struct ieee80211_vif *vif,
1153 struct ieee80211_sta *sta,
1154 struct ieee80211_key_conf *key)
1155{
1156 struct ar9170 *ar = hw->priv;
1157 int err = 0, i;
1158 u8 ktype;
1159
1160 if (ar->disable_offload || !vif)
1161 return -EOPNOTSUPP;
1162
1163 /*
1164 * We have to fall back to software encryption, whenever
1165 * the user choose to participates in an IBSS or is connected
1166 * to more than one network.
1167 *
1168 * This is very unfortunate, because some machines cannot handle
1169 * the high througput speed in 802.11n networks.
1170 */
1171
Alexey Khoroshilov66cb54b2011-08-24 00:44:32 +04001172 if (!is_main_vif(ar, vif)) {
1173 mutex_lock(&ar->mutex);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001174 goto err_softw;
Alexey Khoroshilov66cb54b2011-08-24 00:44:32 +04001175 }
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001176
1177 /*
1178 * While the hardware supports *catch-all* key, for offloading
1179 * group-key en-/de-cryption. The way of how the hardware
1180 * decides which keyId maps to which key, remains a mystery...
1181 */
1182 if ((vif->type != NL80211_IFTYPE_STATION &&
1183 vif->type != NL80211_IFTYPE_ADHOC) &&
1184 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
1185 return -EOPNOTSUPP;
1186
1187 switch (key->cipher) {
1188 case WLAN_CIPHER_SUITE_WEP40:
1189 ktype = AR9170_ENC_ALG_WEP64;
1190 break;
1191 case WLAN_CIPHER_SUITE_WEP104:
1192 ktype = AR9170_ENC_ALG_WEP128;
1193 break;
1194 case WLAN_CIPHER_SUITE_TKIP:
1195 ktype = AR9170_ENC_ALG_TKIP;
1196 break;
1197 case WLAN_CIPHER_SUITE_CCMP:
1198 ktype = AR9170_ENC_ALG_AESCCMP;
Christian Lampartere37b6742012-09-02 14:25:50 +02001199 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001200 break;
1201 default:
1202 return -EOPNOTSUPP;
1203 }
1204
1205 mutex_lock(&ar->mutex);
1206 if (cmd == SET_KEY) {
1207 if (!IS_STARTED(ar)) {
1208 err = -EOPNOTSUPP;
1209 goto out;
1210 }
1211
1212 if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
1213 sta = NULL;
1214
1215 i = 64 + key->keyidx;
1216 } else {
1217 for (i = 0; i < 64; i++)
1218 if (!(ar->usedkeys & BIT(i)))
1219 break;
1220 if (i == 64)
1221 goto err_softw;
1222 }
1223
1224 key->hw_key_idx = i;
1225
1226 err = carl9170_upload_key(ar, i, sta ? sta->addr : NULL,
1227 ktype, 0, key->key,
1228 min_t(u8, 16, key->keylen));
1229 if (err)
1230 goto out;
1231
1232 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
1233 err = carl9170_upload_key(ar, i, sta ? sta->addr :
1234 NULL, ktype, 1,
1235 key->key + 16, 16);
1236 if (err)
1237 goto out;
1238
1239 /*
1240 * hardware is not capable generating MMIC
1241 * of fragmented frames!
1242 */
1243 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1244 }
1245
1246 if (i < 64)
1247 ar->usedkeys |= BIT(i);
1248
1249 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1250 } else {
1251 if (!IS_STARTED(ar)) {
1252 /* The device is gone... together with the key ;-) */
1253 err = 0;
1254 goto out;
1255 }
1256
1257 if (key->hw_key_idx < 64) {
1258 ar->usedkeys &= ~BIT(key->hw_key_idx);
1259 } else {
1260 err = carl9170_upload_key(ar, key->hw_key_idx, NULL,
1261 AR9170_ENC_ALG_NONE, 0,
1262 NULL, 0);
1263 if (err)
1264 goto out;
1265
1266 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
1267 err = carl9170_upload_key(ar, key->hw_key_idx,
1268 NULL,
1269 AR9170_ENC_ALG_NONE,
1270 1, NULL, 0);
1271 if (err)
1272 goto out;
1273 }
1274
1275 }
1276
1277 err = carl9170_disable_key(ar, key->hw_key_idx);
1278 if (err)
1279 goto out;
1280 }
1281
1282out:
1283 mutex_unlock(&ar->mutex);
1284 return err;
1285
1286err_softw:
1287 if (!ar->rx_software_decryption) {
1288 ar->rx_software_decryption = true;
1289 carl9170_set_operating_mode(ar);
1290 }
1291 mutex_unlock(&ar->mutex);
1292 return -ENOSPC;
1293}
1294
1295static int carl9170_op_sta_add(struct ieee80211_hw *hw,
1296 struct ieee80211_vif *vif,
1297 struct ieee80211_sta *sta)
1298{
1299 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
1300 unsigned int i;
1301
Christian Lampartercaf1eae2011-04-24 17:44:19 +02001302 atomic_set(&sta_info->pending_frames, 0);
1303
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001304 if (sta->ht_cap.ht_supported) {
1305 if (sta->ht_cap.ampdu_density > 6) {
1306 /*
1307 * HW does support 16us AMPDU density.
1308 * No HT-Xmit for station.
1309 */
1310
1311 return 0;
1312 }
1313
1314 for (i = 0; i < CARL9170_NUM_TID; i++)
Eric Dumazet2cfa5a02011-11-23 07:09:32 +00001315 RCU_INIT_POINTER(sta_info->agg[i], NULL);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001316
1317 sta_info->ampdu_max_len = 1 << (3 + sta->ht_cap.ampdu_factor);
1318 sta_info->ht_sta = true;
1319 }
1320
1321 return 0;
1322}
1323
1324static int carl9170_op_sta_remove(struct ieee80211_hw *hw,
1325 struct ieee80211_vif *vif,
1326 struct ieee80211_sta *sta)
1327{
1328 struct ar9170 *ar = hw->priv;
1329 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
1330 unsigned int i;
1331 bool cleanup = false;
1332
1333 if (sta->ht_cap.ht_supported) {
1334
1335 sta_info->ht_sta = false;
1336
1337 rcu_read_lock();
1338 for (i = 0; i < CARL9170_NUM_TID; i++) {
1339 struct carl9170_sta_tid *tid_info;
1340
1341 tid_info = rcu_dereference(sta_info->agg[i]);
Eric Dumazet2cfa5a02011-11-23 07:09:32 +00001342 RCU_INIT_POINTER(sta_info->agg[i], NULL);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001343
1344 if (!tid_info)
1345 continue;
1346
1347 spin_lock_bh(&ar->tx_ampdu_list_lock);
1348 if (tid_info->state > CARL9170_TID_STATE_SHUTDOWN)
1349 tid_info->state = CARL9170_TID_STATE_SHUTDOWN;
1350 spin_unlock_bh(&ar->tx_ampdu_list_lock);
1351 cleanup = true;
1352 }
1353 rcu_read_unlock();
1354
1355 if (cleanup)
1356 carl9170_ampdu_gc(ar);
1357 }
1358
1359 return 0;
1360}
1361
Eliad Peller8a3a3c82011-10-02 10:15:52 +02001362static int carl9170_op_conf_tx(struct ieee80211_hw *hw,
1363 struct ieee80211_vif *vif, u16 queue,
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001364 const struct ieee80211_tx_queue_params *param)
1365{
1366 struct ar9170 *ar = hw->priv;
1367 int ret;
1368
1369 mutex_lock(&ar->mutex);
1370 if (queue < ar->hw->queues) {
1371 memcpy(&ar->edcf[ar9170_qmap[queue]], param, sizeof(*param));
1372 ret = carl9170_set_qos(ar);
1373 } else {
1374 ret = -EINVAL;
1375 }
1376
1377 mutex_unlock(&ar->mutex);
1378 return ret;
1379}
1380
1381static void carl9170_ampdu_work(struct work_struct *work)
1382{
1383 struct ar9170 *ar = container_of(work, struct ar9170,
1384 ampdu_work);
1385
1386 if (!IS_STARTED(ar))
1387 return;
1388
1389 mutex_lock(&ar->mutex);
1390 carl9170_ampdu_gc(ar);
1391 mutex_unlock(&ar->mutex);
1392}
1393
1394static int carl9170_op_ampdu_action(struct ieee80211_hw *hw,
1395 struct ieee80211_vif *vif,
1396 enum ieee80211_ampdu_mlme_action action,
1397 struct ieee80211_sta *sta,
Johannes Berg0b01f032011-01-18 13:51:05 +01001398 u16 tid, u16 *ssn, u8 buf_size)
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001399{
1400 struct ar9170 *ar = hw->priv;
1401 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
1402 struct carl9170_sta_tid *tid_info;
1403
1404 if (modparam_noht)
1405 return -EOPNOTSUPP;
1406
1407 switch (action) {
1408 case IEEE80211_AMPDU_TX_START:
Christian Lamparter9c655c82010-09-26 23:06:56 +02001409 if (!sta_info->ht_sta)
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001410 return -EOPNOTSUPP;
1411
1412 rcu_read_lock();
1413 if (rcu_dereference(sta_info->agg[tid])) {
1414 rcu_read_unlock();
1415 return -EBUSY;
1416 }
1417
1418 tid_info = kzalloc(sizeof(struct carl9170_sta_tid),
1419 GFP_ATOMIC);
1420 if (!tid_info) {
1421 rcu_read_unlock();
1422 return -ENOMEM;
1423 }
1424
1425 tid_info->hsn = tid_info->bsn = tid_info->snx = (*ssn);
1426 tid_info->state = CARL9170_TID_STATE_PROGRESS;
1427 tid_info->tid = tid;
1428 tid_info->max = sta_info->ampdu_max_len;
1429
1430 INIT_LIST_HEAD(&tid_info->list);
1431 INIT_LIST_HEAD(&tid_info->tmp_list);
1432 skb_queue_head_init(&tid_info->queue);
1433 spin_lock_init(&tid_info->lock);
1434
1435 spin_lock_bh(&ar->tx_ampdu_list_lock);
1436 ar->tx_ampdu_list_len++;
1437 list_add_tail_rcu(&tid_info->list, &ar->tx_ampdu_list);
1438 rcu_assign_pointer(sta_info->agg[tid], tid_info);
1439 spin_unlock_bh(&ar->tx_ampdu_list_lock);
1440 rcu_read_unlock();
1441
1442 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1443 break;
1444
Johannes Berg18b559d2012-07-18 13:51:25 +02001445 case IEEE80211_AMPDU_TX_STOP_CONT:
1446 case IEEE80211_AMPDU_TX_STOP_FLUSH:
1447 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001448 rcu_read_lock();
1449 tid_info = rcu_dereference(sta_info->agg[tid]);
1450 if (tid_info) {
1451 spin_lock_bh(&ar->tx_ampdu_list_lock);
1452 if (tid_info->state > CARL9170_TID_STATE_SHUTDOWN)
1453 tid_info->state = CARL9170_TID_STATE_SHUTDOWN;
1454 spin_unlock_bh(&ar->tx_ampdu_list_lock);
1455 }
1456
Eric Dumazet2cfa5a02011-11-23 07:09:32 +00001457 RCU_INIT_POINTER(sta_info->agg[tid], NULL);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001458 rcu_read_unlock();
1459
1460 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1461 ieee80211_queue_work(ar->hw, &ar->ampdu_work);
1462 break;
1463
1464 case IEEE80211_AMPDU_TX_OPERATIONAL:
1465 rcu_read_lock();
1466 tid_info = rcu_dereference(sta_info->agg[tid]);
1467
1468 sta_info->stats[tid].clear = true;
Christian Lamparter24047e22011-03-29 13:43:14 +02001469 sta_info->stats[tid].req = false;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001470
1471 if (tid_info) {
1472 bitmap_zero(tid_info->bitmap, CARL9170_BAW_SIZE);
1473 tid_info->state = CARL9170_TID_STATE_IDLE;
1474 }
1475 rcu_read_unlock();
1476
1477 if (WARN_ON_ONCE(!tid_info))
1478 return -EFAULT;
1479
1480 break;
1481
1482 case IEEE80211_AMPDU_RX_START:
1483 case IEEE80211_AMPDU_RX_STOP:
1484 /* Handled by hardware */
1485 break;
1486
1487 default:
1488 return -EOPNOTSUPP;
1489 }
1490
1491 return 0;
1492}
1493
1494#ifdef CONFIG_CARL9170_WPC
1495static int carl9170_register_wps_button(struct ar9170 *ar)
1496{
1497 struct input_dev *input;
1498 int err;
1499
1500 if (!(ar->features & CARL9170_WPS_BUTTON))
1501 return 0;
1502
1503 input = input_allocate_device();
1504 if (!input)
1505 return -ENOMEM;
1506
1507 snprintf(ar->wps.name, sizeof(ar->wps.name), "%s WPS Button",
1508 wiphy_name(ar->hw->wiphy));
1509
1510 snprintf(ar->wps.phys, sizeof(ar->wps.phys),
1511 "ieee80211/%s/input0", wiphy_name(ar->hw->wiphy));
1512
1513 input->name = ar->wps.name;
1514 input->phys = ar->wps.phys;
1515 input->id.bustype = BUS_USB;
1516 input->dev.parent = &ar->hw->wiphy->dev;
1517
1518 input_set_capability(input, EV_KEY, KEY_WPS_BUTTON);
1519
1520 err = input_register_device(input);
1521 if (err) {
1522 input_free_device(input);
1523 return err;
1524 }
1525
1526 ar->wps.pbc = input;
1527 return 0;
1528}
1529#endif /* CONFIG_CARL9170_WPC */
1530
Christian Lamparter00044f12011-08-15 20:09:54 +02001531#ifdef CONFIG_CARL9170_HWRNG
1532static int carl9170_rng_get(struct ar9170 *ar)
1533{
1534
1535#define RW (CARL9170_MAX_CMD_PAYLOAD_LEN / sizeof(u32))
1536#define RB (CARL9170_MAX_CMD_PAYLOAD_LEN)
1537
1538 static const __le32 rng_load[RW] = {
1539 [0 ... (RW - 1)] = cpu_to_le32(AR9170_RAND_REG_NUM)};
1540
1541 u32 buf[RW];
1542
1543 unsigned int i, off = 0, transfer, count;
1544 int err;
1545
1546 BUILD_BUG_ON(RB > CARL9170_MAX_CMD_PAYLOAD_LEN);
1547
1548 if (!IS_ACCEPTING_CMD(ar) || !ar->rng.initialized)
1549 return -EAGAIN;
1550
1551 count = ARRAY_SIZE(ar->rng.cache);
1552 while (count) {
1553 err = carl9170_exec_cmd(ar, CARL9170_CMD_RREG,
1554 RB, (u8 *) rng_load,
1555 RB, (u8 *) buf);
1556 if (err)
1557 return err;
1558
1559 transfer = min_t(unsigned int, count, RW);
1560 for (i = 0; i < transfer; i++)
1561 ar->rng.cache[off + i] = buf[i];
1562
1563 off += transfer;
1564 count -= transfer;
1565 }
1566
1567 ar->rng.cache_idx = 0;
1568
1569#undef RW
1570#undef RB
1571 return 0;
1572}
1573
1574static int carl9170_rng_read(struct hwrng *rng, u32 *data)
1575{
1576 struct ar9170 *ar = (struct ar9170 *)rng->priv;
1577 int ret = -EIO;
1578
1579 mutex_lock(&ar->mutex);
1580 if (ar->rng.cache_idx >= ARRAY_SIZE(ar->rng.cache)) {
1581 ret = carl9170_rng_get(ar);
1582 if (ret) {
1583 mutex_unlock(&ar->mutex);
1584 return ret;
1585 }
1586 }
1587
1588 *data = ar->rng.cache[ar->rng.cache_idx++];
1589 mutex_unlock(&ar->mutex);
1590
1591 return sizeof(u16);
1592}
1593
1594static void carl9170_unregister_hwrng(struct ar9170 *ar)
1595{
1596 if (ar->rng.initialized) {
1597 hwrng_unregister(&ar->rng.rng);
1598 ar->rng.initialized = false;
1599 }
1600}
1601
1602static int carl9170_register_hwrng(struct ar9170 *ar)
1603{
1604 int err;
1605
1606 snprintf(ar->rng.name, ARRAY_SIZE(ar->rng.name),
1607 "%s_%s", KBUILD_MODNAME, wiphy_name(ar->hw->wiphy));
1608 ar->rng.rng.name = ar->rng.name;
1609 ar->rng.rng.data_read = carl9170_rng_read;
1610 ar->rng.rng.priv = (unsigned long)ar;
1611
1612 if (WARN_ON(ar->rng.initialized))
1613 return -EALREADY;
1614
1615 err = hwrng_register(&ar->rng.rng);
1616 if (err) {
1617 dev_err(&ar->udev->dev, "Failed to register the random "
1618 "number generator (%d)\n", err);
1619 return err;
1620 }
1621
1622 ar->rng.initialized = true;
1623
1624 err = carl9170_rng_get(ar);
1625 if (err) {
1626 carl9170_unregister_hwrng(ar);
1627 return err;
1628 }
1629
1630 return 0;
1631}
1632#endif /* CONFIG_CARL9170_HWRNG */
1633
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001634static int carl9170_op_get_survey(struct ieee80211_hw *hw, int idx,
1635 struct survey_info *survey)
1636{
1637 struct ar9170 *ar = hw->priv;
Christian Lamparteracf17712011-08-15 19:50:48 +02001638 struct ieee80211_channel *chan;
1639 struct ieee80211_supported_band *band;
1640 int err, b, i;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001641
Christian Lamparteracf17712011-08-15 19:50:48 +02001642 chan = ar->channel;
1643 if (!chan)
1644 return -ENODEV;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001645
Christian Lamparteracf17712011-08-15 19:50:48 +02001646 if (idx == chan->hw_value) {
1647 mutex_lock(&ar->mutex);
1648 err = carl9170_update_survey(ar, false, true);
1649 mutex_unlock(&ar->mutex);
1650 if (err)
1651 return err;
1652 }
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001653
Christian Lamparteracf17712011-08-15 19:50:48 +02001654 for (b = 0; b < IEEE80211_NUM_BANDS; b++) {
1655 band = ar->hw->wiphy->bands[b];
1656
1657 if (!band)
1658 continue;
1659
1660 for (i = 0; i < band->n_channels; i++) {
1661 if (band->channels[i].hw_value == idx) {
1662 chan = &band->channels[i];
1663 goto found;
1664 }
1665 }
1666 }
1667 return -ENOENT;
1668
1669found:
1670 memcpy(survey, &ar->survey[idx], sizeof(*survey));
1671
1672 survey->channel = chan;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001673 survey->filled = SURVEY_INFO_NOISE_DBM;
Christian Lamparteracf17712011-08-15 19:50:48 +02001674
1675 if (ar->channel == chan)
1676 survey->filled |= SURVEY_INFO_IN_USE;
1677
1678 if (ar->fw.hw_counters) {
1679 survey->filled |= SURVEY_INFO_CHANNEL_TIME |
1680 SURVEY_INFO_CHANNEL_TIME_BUSY |
1681 SURVEY_INFO_CHANNEL_TIME_TX;
1682 }
1683
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001684 return 0;
1685}
1686
1687static void carl9170_op_flush(struct ieee80211_hw *hw, bool drop)
1688{
1689 struct ar9170 *ar = hw->priv;
1690 unsigned int vid;
1691
1692 mutex_lock(&ar->mutex);
1693 for_each_set_bit(vid, &ar->vif_bitmap, ar->fw.vif_num)
1694 carl9170_flush_cab(ar, vid);
1695
1696 carl9170_flush(ar, drop);
1697 mutex_unlock(&ar->mutex);
1698}
1699
1700static int carl9170_op_get_stats(struct ieee80211_hw *hw,
1701 struct ieee80211_low_level_stats *stats)
1702{
1703 struct ar9170 *ar = hw->priv;
1704
1705 memset(stats, 0, sizeof(*stats));
1706 stats->dot11ACKFailureCount = ar->tx_ack_failures;
1707 stats->dot11FCSErrorCount = ar->tx_fcs_errors;
1708 return 0;
1709}
1710
1711static void carl9170_op_sta_notify(struct ieee80211_hw *hw,
1712 struct ieee80211_vif *vif,
1713 enum sta_notify_cmd cmd,
1714 struct ieee80211_sta *sta)
1715{
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001716 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001717
1718 switch (cmd) {
1719 case STA_NOTIFY_SLEEP:
Christian Lampartercaf1eae2011-04-24 17:44:19 +02001720 sta_info->sleeping = true;
1721 if (atomic_read(&sta_info->pending_frames))
1722 ieee80211_sta_block_awake(hw, sta, true);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001723 break;
1724
1725 case STA_NOTIFY_AWAKE:
Christian Lampartercaf1eae2011-04-24 17:44:19 +02001726 sta_info->sleeping = false;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001727 break;
1728 }
1729}
1730
Christian Lamparter69f72352011-07-07 23:01:25 +02001731static bool carl9170_tx_frames_pending(struct ieee80211_hw *hw)
1732{
1733 struct ar9170 *ar = hw->priv;
1734
1735 return !!atomic_read(&ar->tx_total_queued);
1736}
1737
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001738static const struct ieee80211_ops carl9170_ops = {
1739 .start = carl9170_op_start,
1740 .stop = carl9170_op_stop,
1741 .tx = carl9170_op_tx,
1742 .flush = carl9170_op_flush,
1743 .add_interface = carl9170_op_add_interface,
1744 .remove_interface = carl9170_op_remove_interface,
1745 .config = carl9170_op_config,
1746 .prepare_multicast = carl9170_op_prepare_multicast,
1747 .configure_filter = carl9170_op_configure_filter,
1748 .conf_tx = carl9170_op_conf_tx,
1749 .bss_info_changed = carl9170_op_bss_info_changed,
1750 .get_tsf = carl9170_op_get_tsf,
1751 .set_key = carl9170_op_set_key,
1752 .sta_add = carl9170_op_sta_add,
1753 .sta_remove = carl9170_op_sta_remove,
1754 .sta_notify = carl9170_op_sta_notify,
1755 .get_survey = carl9170_op_get_survey,
1756 .get_stats = carl9170_op_get_stats,
1757 .ampdu_action = carl9170_op_ampdu_action,
Christian Lamparter69f72352011-07-07 23:01:25 +02001758 .tx_frames_pending = carl9170_tx_frames_pending,
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001759};
1760
1761void *carl9170_alloc(size_t priv_size)
1762{
1763 struct ieee80211_hw *hw;
1764 struct ar9170 *ar;
1765 struct sk_buff *skb;
1766 int i;
1767
1768 /*
1769 * this buffer is used for rx stream reconstruction.
1770 * Under heavy load this device (or the transport layer?)
1771 * tends to split the streams into separate rx descriptors.
1772 */
1773
1774 skb = __dev_alloc_skb(AR9170_RX_STREAM_MAX_SIZE, GFP_KERNEL);
1775 if (!skb)
1776 goto err_nomem;
1777
1778 hw = ieee80211_alloc_hw(priv_size, &carl9170_ops);
1779 if (!hw)
1780 goto err_nomem;
1781
1782 ar = hw->priv;
1783 ar->hw = hw;
1784 ar->rx_failover = skb;
1785
1786 memset(&ar->rx_plcp, 0, sizeof(struct ar9170_rx_head));
1787 ar->rx_has_plcp = false;
1788
1789 /*
1790 * Here's a hidden pitfall!
1791 *
1792 * All 4 AC queues work perfectly well under _legacy_ operation.
1793 * However as soon as aggregation is enabled, the traffic flow
1794 * gets very bumpy. Therefore we have to _switch_ to a
1795 * software AC with a single HW queue.
1796 */
1797 hw->queues = __AR9170_NUM_TXQ;
1798
1799 mutex_init(&ar->mutex);
1800 spin_lock_init(&ar->beacon_lock);
1801 spin_lock_init(&ar->cmd_lock);
1802 spin_lock_init(&ar->tx_stats_lock);
1803 spin_lock_init(&ar->tx_ampdu_list_lock);
1804 spin_lock_init(&ar->mem_lock);
1805 spin_lock_init(&ar->state_lock);
1806 atomic_set(&ar->pending_restarts, 0);
1807 ar->vifs = 0;
1808 for (i = 0; i < ar->hw->queues; i++) {
1809 skb_queue_head_init(&ar->tx_status[i]);
1810 skb_queue_head_init(&ar->tx_pending[i]);
Christian Lamparterc9122c02012-07-07 21:13:59 +02001811
1812 INIT_LIST_HEAD(&ar->bar_list[i]);
1813 spin_lock_init(&ar->bar_list_lock[i]);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001814 }
1815 INIT_WORK(&ar->ps_work, carl9170_ps_work);
Christian Lampartere4a668c2010-10-29 23:26:13 +02001816 INIT_WORK(&ar->ping_work, carl9170_ping_work);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001817 INIT_WORK(&ar->restart_work, carl9170_restart_work);
1818 INIT_WORK(&ar->ampdu_work, carl9170_ampdu_work);
Christian Lamparteracf17712011-08-15 19:50:48 +02001819 INIT_DELAYED_WORK(&ar->stat_work, carl9170_stat_work);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001820 INIT_DELAYED_WORK(&ar->tx_janitor, carl9170_tx_janitor);
1821 INIT_LIST_HEAD(&ar->tx_ampdu_list);
1822 rcu_assign_pointer(ar->tx_ampdu_iter,
1823 (struct carl9170_sta_tid *) &ar->tx_ampdu_list);
1824
1825 bitmap_zero(&ar->vif_bitmap, ar->fw.vif_num);
1826 INIT_LIST_HEAD(&ar->vif_list);
1827 init_completion(&ar->tx_flush);
1828
Christian Lamparterdf649622011-05-14 02:42:38 +02001829 /* firmware decides which modes we support */
1830 hw->wiphy->interface_modes = 0;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001831
1832 hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS |
Christian Lampartere37b6742012-09-02 14:25:50 +02001833 IEEE80211_HW_MFP_CAPABLE |
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001834 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
1835 IEEE80211_HW_SUPPORTS_PS |
1836 IEEE80211_HW_PS_NULLFUNC_STACK |
Christian Lamparterf3716fd2011-06-30 20:31:34 +02001837 IEEE80211_HW_NEED_DTIM_PERIOD |
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001838 IEEE80211_HW_SIGNAL_DBM;
1839
1840 if (!modparam_noht) {
1841 /*
1842 * see the comment above, why we allow the user
1843 * to disable HT by a module parameter.
1844 */
1845 hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
1846 }
1847
1848 hw->extra_tx_headroom = sizeof(struct _carl9170_tx_superframe);
1849 hw->sta_data_size = sizeof(struct carl9170_sta_info);
1850 hw->vif_data_size = sizeof(struct carl9170_vif_info);
1851
1852 hw->max_rates = CARL9170_TX_MAX_RATES;
1853 hw->max_rate_tries = CARL9170_TX_USER_RATE_TRIES;
1854
1855 for (i = 0; i < ARRAY_SIZE(ar->noise); i++)
1856 ar->noise[i] = -95; /* ATH_DEFAULT_NOISE_FLOOR */
1857
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001858 return ar;
1859
1860err_nomem:
1861 kfree_skb(skb);
1862 return ERR_PTR(-ENOMEM);
1863}
1864
1865static int carl9170_read_eeprom(struct ar9170 *ar)
1866{
1867#define RW 8 /* number of words to read at once */
1868#define RB (sizeof(u32) * RW)
1869 u8 *eeprom = (void *)&ar->eeprom;
1870 __le32 offsets[RW];
1871 int i, j, err;
1872
1873 BUILD_BUG_ON(sizeof(ar->eeprom) & 3);
1874
1875 BUILD_BUG_ON(RB > CARL9170_MAX_CMD_LEN - 4);
1876#ifndef __CHECKER__
1877 /* don't want to handle trailing remains */
1878 BUILD_BUG_ON(sizeof(ar->eeprom) % RB);
1879#endif
1880
Pavel Roskin3f29c522011-07-13 21:38:18 -04001881 for (i = 0; i < sizeof(ar->eeprom) / RB; i++) {
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001882 for (j = 0; j < RW; j++)
1883 offsets[j] = cpu_to_le32(AR9170_EEPROM_START +
1884 RB * i + 4 * j);
1885
1886 err = carl9170_exec_cmd(ar, CARL9170_CMD_RREG,
1887 RB, (u8 *) &offsets,
1888 RB, eeprom + RB * i);
1889 if (err)
1890 return err;
1891 }
1892
1893#undef RW
1894#undef RB
1895 return 0;
1896}
1897
1898static int carl9170_parse_eeprom(struct ar9170 *ar)
1899{
1900 struct ath_regulatory *regulatory = &ar->common.regulatory;
1901 unsigned int rx_streams, tx_streams, tx_params = 0;
1902 int bands = 0;
Christian Lamparteracf17712011-08-15 19:50:48 +02001903 int chans = 0;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001904
1905 if (ar->eeprom.length == cpu_to_le16(0xffff))
1906 return -ENODATA;
1907
1908 rx_streams = hweight8(ar->eeprom.rx_mask);
1909 tx_streams = hweight8(ar->eeprom.tx_mask);
1910
1911 if (rx_streams != tx_streams) {
1912 tx_params = IEEE80211_HT_MCS_TX_RX_DIFF;
1913
1914 WARN_ON(!(tx_streams >= 1 && tx_streams <=
1915 IEEE80211_HT_MCS_TX_MAX_STREAMS));
1916
1917 tx_params = (tx_streams - 1) <<
1918 IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT;
1919
1920 carl9170_band_2GHz.ht_cap.mcs.tx_params |= tx_params;
1921 carl9170_band_5GHz.ht_cap.mcs.tx_params |= tx_params;
1922 }
1923
1924 if (ar->eeprom.operating_flags & AR9170_OPFLAG_2GHZ) {
1925 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
1926 &carl9170_band_2GHz;
Christian Lamparteracf17712011-08-15 19:50:48 +02001927 chans += carl9170_band_2GHz.n_channels;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001928 bands++;
1929 }
1930 if (ar->eeprom.operating_flags & AR9170_OPFLAG_5GHZ) {
1931 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
1932 &carl9170_band_5GHz;
Christian Lamparteracf17712011-08-15 19:50:48 +02001933 chans += carl9170_band_5GHz.n_channels;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001934 bands++;
1935 }
1936
Christian Lamparteracf17712011-08-15 19:50:48 +02001937 if (!bands)
1938 return -EINVAL;
1939
1940 ar->survey = kzalloc(sizeof(struct survey_info) * chans, GFP_KERNEL);
1941 if (!ar->survey)
1942 return -ENOMEM;
1943 ar->num_channels = chans;
1944
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001945 /*
1946 * I measured this, a bandswitch takes roughly
1947 * 135 ms and a frequency switch about 80.
1948 *
1949 * FIXME: measure these values again once EEPROM settings
1950 * are used, that will influence them!
1951 */
1952 if (bands == 2)
1953 ar->hw->channel_change_time = 135 * 1000;
1954 else
1955 ar->hw->channel_change_time = 80 * 1000;
1956
1957 regulatory->current_rd = le16_to_cpu(ar->eeprom.reg_domain[0]);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001958
1959 /* second part of wiphy init */
1960 SET_IEEE80211_PERM_ADDR(ar->hw, ar->eeprom.mac_address);
1961
Christian Lamparteracf17712011-08-15 19:50:48 +02001962 return 0;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001963}
1964
1965static int carl9170_reg_notifier(struct wiphy *wiphy,
1966 struct regulatory_request *request)
1967{
1968 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1969 struct ar9170 *ar = hw->priv;
1970
1971 return ath_reg_notifier_apply(wiphy, request, &ar->common.regulatory);
1972}
1973
1974int carl9170_register(struct ar9170 *ar)
1975{
1976 struct ath_regulatory *regulatory = &ar->common.regulatory;
1977 int err = 0, i;
1978
1979 if (WARN_ON(ar->mem_bitmap))
1980 return -EINVAL;
1981
1982 ar->mem_bitmap = kzalloc(roundup(ar->fw.mem_blocks, BITS_PER_LONG) *
1983 sizeof(unsigned long), GFP_KERNEL);
1984
1985 if (!ar->mem_bitmap)
1986 return -ENOMEM;
1987
1988 /* try to read EEPROM, init MAC addr */
1989 err = carl9170_read_eeprom(ar);
1990 if (err)
1991 return err;
1992
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001993 err = carl9170_parse_eeprom(ar);
1994 if (err)
1995 return err;
1996
1997 err = ath_regd_init(regulatory, ar->hw->wiphy,
1998 carl9170_reg_notifier);
1999 if (err)
2000 return err;
2001
2002 if (modparam_noht) {
2003 carl9170_band_2GHz.ht_cap.ht_supported = false;
2004 carl9170_band_5GHz.ht_cap.ht_supported = false;
2005 }
2006
2007 for (i = 0; i < ar->fw.vif_num; i++) {
2008 ar->vif_priv[i].id = i;
2009 ar->vif_priv[i].vif = NULL;
2010 }
2011
2012 err = ieee80211_register_hw(ar->hw);
2013 if (err)
2014 return err;
2015
2016 /* mac80211 interface is now registered */
2017 ar->registered = true;
2018
2019 if (!ath_is_world_regd(regulatory))
2020 regulatory_hint(ar->hw->wiphy, regulatory->alpha2);
2021
2022#ifdef CONFIG_CARL9170_DEBUGFS
2023 carl9170_debugfs_register(ar);
2024#endif /* CONFIG_CARL9170_DEBUGFS */
2025
2026 err = carl9170_led_init(ar);
2027 if (err)
2028 goto err_unreg;
2029
2030#ifdef CONFIG_CARL9170_LEDS
2031 err = carl9170_led_register(ar);
2032 if (err)
2033 goto err_unreg;
Hauke Mehrtens8e7ce892010-10-23 19:51:32 +02002034#endif /* CONFIG_CARL9170_LEDS */
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02002035
2036#ifdef CONFIG_CARL9170_WPC
2037 err = carl9170_register_wps_button(ar);
2038 if (err)
2039 goto err_unreg;
2040#endif /* CONFIG_CARL9170_WPC */
2041
Christian Lamparter00044f12011-08-15 20:09:54 +02002042#ifdef CONFIG_CARL9170_HWRNG
2043 err = carl9170_register_hwrng(ar);
2044 if (err)
2045 goto err_unreg;
2046#endif /* CONFIG_CARL9170_HWRNG */
2047
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02002048 dev_info(&ar->udev->dev, "Atheros AR9170 is registered as '%s'\n",
2049 wiphy_name(ar->hw->wiphy));
2050
2051 return 0;
2052
2053err_unreg:
2054 carl9170_unregister(ar);
2055 return err;
2056}
2057
2058void carl9170_unregister(struct ar9170 *ar)
2059{
2060 if (!ar->registered)
2061 return;
2062
2063 ar->registered = false;
2064
2065#ifdef CONFIG_CARL9170_LEDS
2066 carl9170_led_unregister(ar);
2067#endif /* CONFIG_CARL9170_LEDS */
2068
2069#ifdef CONFIG_CARL9170_DEBUGFS
2070 carl9170_debugfs_unregister(ar);
2071#endif /* CONFIG_CARL9170_DEBUGFS */
2072
2073#ifdef CONFIG_CARL9170_WPC
2074 if (ar->wps.pbc) {
2075 input_unregister_device(ar->wps.pbc);
2076 ar->wps.pbc = NULL;
2077 }
2078#endif /* CONFIG_CARL9170_WPC */
2079
Christian Lamparter00044f12011-08-15 20:09:54 +02002080#ifdef CONFIG_CARL9170_HWRNG
2081 carl9170_unregister_hwrng(ar);
2082#endif /* CONFIG_CARL9170_HWRNG */
2083
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02002084 carl9170_cancel_worker(ar);
2085 cancel_work_sync(&ar->restart_work);
2086
2087 ieee80211_unregister_hw(ar->hw);
2088}
2089
2090void carl9170_free(struct ar9170 *ar)
2091{
2092 WARN_ON(ar->registered);
2093 WARN_ON(IS_INITIALIZED(ar));
2094
2095 kfree_skb(ar->rx_failover);
2096 ar->rx_failover = NULL;
2097
2098 kfree(ar->mem_bitmap);
2099 ar->mem_bitmap = NULL;
2100
Christian Lamparteracf17712011-08-15 19:50:48 +02002101 kfree(ar->survey);
2102 ar->survey = NULL;
2103
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02002104 mutex_destroy(&ar->mutex);
2105
2106 ieee80211_free_hw(ar->hw);
2107}