blob: 85cb1bdebaaaa11c3d372ddcfe95440f916a6cd3 [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
51static int modparam_nohwcrypt;
52module_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)) {
449 rcu_assign_pointer(ar->beacon_iter, NULL);
450
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);
468 int err;
469
470 ar->usedkeys = 0;
471 ar->filter_state = 0;
472 carl9170_cancel_worker(ar);
473
474 mutex_lock(&ar->mutex);
475 err = carl9170_usb_restart(ar);
476 if (net_ratelimit()) {
477 if (err) {
478 dev_err(&ar->udev->dev, "Failed to restart device "
479 " (%d).\n", err);
480 } else {
481 dev_info(&ar->udev->dev, "device restarted "
482 "successfully.\n");
483 }
484 }
485
486 carl9170_zap_queues(ar);
487 mutex_unlock(&ar->mutex);
488 if (!err) {
489 ar->restart_counter++;
490 atomic_set(&ar->pending_restarts, 0);
491
492 ieee80211_restart_hw(ar->hw);
493 } else {
494 /*
495 * The reset was unsuccessful and the device seems to
496 * be dead. But there's still one option: a low-level
497 * usb subsystem reset...
498 */
499
500 carl9170_usb_reset(ar);
501 }
502}
503
504void carl9170_restart(struct ar9170 *ar, const enum carl9170_restart_reasons r)
505{
506 carl9170_set_state_when(ar, CARL9170_STARTED, CARL9170_IDLE);
507
508 /*
509 * Sometimes, an error can trigger several different reset events.
510 * By ignoring these *surplus* reset events, the device won't be
511 * killed again, right after it has recovered.
512 */
513 if (atomic_inc_return(&ar->pending_restarts) > 1) {
514 dev_dbg(&ar->udev->dev, "ignoring restart (%d)\n", r);
515 return;
516 }
517
518 ieee80211_stop_queues(ar->hw);
519
520 dev_err(&ar->udev->dev, "restart device (%d)\n", r);
521
522 if (!WARN_ON(r == CARL9170_RR_NO_REASON) ||
523 !WARN_ON(r >= __CARL9170_RR_LAST))
524 ar->last_reason = r;
525
526 if (!ar->registered)
527 return;
528
529 if (IS_ACCEPTING_CMD(ar) && !ar->needs_full_reset)
530 ieee80211_queue_work(ar->hw, &ar->restart_work);
531 else
532 carl9170_usb_reset(ar);
533
534 /*
535 * At this point, the device instance might have vanished/disabled.
536 * So, don't put any code which access the ar9170 struct
537 * without proper protection.
538 */
539}
540
Christian Lampartere4a668c2010-10-29 23:26:13 +0200541static void carl9170_ping_work(struct work_struct *work)
542{
543 struct ar9170 *ar = container_of(work, struct ar9170, ping_work);
544 int err;
545
546 if (!IS_STARTED(ar))
547 return;
548
549 mutex_lock(&ar->mutex);
550 err = carl9170_echo_test(ar, 0xdeadbeef);
551 if (err)
552 carl9170_restart(ar, CARL9170_RR_UNRESPONSIVE_DEVICE);
553 mutex_unlock(&ar->mutex);
554}
555
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200556static int carl9170_init_interface(struct ar9170 *ar,
557 struct ieee80211_vif *vif)
558{
559 struct ath_common *common = &ar->common;
560 int err;
561
562 if (!vif) {
563 WARN_ON_ONCE(IS_STARTED(ar));
564 return 0;
565 }
566
567 memcpy(common->macaddr, vif->addr, ETH_ALEN);
568
569 if (modparam_nohwcrypt ||
570 ((vif->type != NL80211_IFTYPE_STATION) &&
571 (vif->type != NL80211_IFTYPE_AP))) {
572 ar->rx_software_decryption = true;
573 ar->disable_offload = true;
574 }
575
576 err = carl9170_set_operating_mode(ar);
577 return err;
578}
579
580static int carl9170_op_add_interface(struct ieee80211_hw *hw,
581 struct ieee80211_vif *vif)
582{
583 struct carl9170_vif_info *vif_priv = (void *) vif->drv_priv;
584 struct ieee80211_vif *main_vif;
585 struct ar9170 *ar = hw->priv;
586 int vif_id = -1, err = 0;
587
588 mutex_lock(&ar->mutex);
589 rcu_read_lock();
590 if (vif_priv->active) {
591 /*
592 * Skip the interface structure initialization,
593 * if the vif survived the _restart call.
594 */
595 vif_id = vif_priv->id;
596 vif_priv->enable_beacon = false;
597
598 spin_lock_bh(&ar->beacon_lock);
599 dev_kfree_skb_any(vif_priv->beacon);
600 vif_priv->beacon = NULL;
601 spin_unlock_bh(&ar->beacon_lock);
602
603 goto init;
604 }
605
606 main_vif = carl9170_get_main_vif(ar);
607
608 if (main_vif) {
609 switch (main_vif->type) {
610 case NL80211_IFTYPE_STATION:
611 if (vif->type == NL80211_IFTYPE_STATION)
612 break;
613
614 err = -EBUSY;
615 rcu_read_unlock();
616
617 goto unlock;
618
619 case NL80211_IFTYPE_AP:
620 if ((vif->type == NL80211_IFTYPE_STATION) ||
621 (vif->type == NL80211_IFTYPE_WDS) ||
622 (vif->type == NL80211_IFTYPE_AP))
623 break;
624
625 err = -EBUSY;
626 rcu_read_unlock();
627 goto unlock;
628
629 default:
630 rcu_read_unlock();
631 goto unlock;
632 }
633 }
634
635 vif_id = bitmap_find_free_region(&ar->vif_bitmap, ar->fw.vif_num, 0);
636
637 if (vif_id < 0) {
638 rcu_read_unlock();
639
640 err = -ENOSPC;
641 goto unlock;
642 }
643
644 BUG_ON(ar->vif_priv[vif_id].id != vif_id);
645
646 vif_priv->active = true;
647 vif_priv->id = vif_id;
648 vif_priv->enable_beacon = false;
649 ar->vifs++;
650 list_add_tail_rcu(&vif_priv->list, &ar->vif_list);
651 rcu_assign_pointer(ar->vif_priv[vif_id].vif, vif);
652
653init:
654 if (carl9170_get_main_vif(ar) == vif) {
655 rcu_assign_pointer(ar->beacon_iter, vif_priv);
656 rcu_read_unlock();
657
658 err = carl9170_init_interface(ar, vif);
659 if (err)
660 goto unlock;
661 } else {
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200662 rcu_read_unlock();
Christian Lamparterdafeac32010-10-23 15:02:02 +0200663 err = carl9170_mod_virtual_mac(ar, vif_id, vif->addr);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200664
665 if (err)
666 goto unlock;
667 }
668
Christian Lamparteraa324522011-01-23 00:18:28 +0100669 if (ar->fw.tx_seq_table) {
670 err = carl9170_write_reg(ar, ar->fw.tx_seq_table + vif_id * 4,
671 0);
672 if (err)
673 goto unlock;
674 }
675
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200676unlock:
Christian Lamparterb3974922010-11-20 13:15:27 +0100677 if (err && (vif_id >= 0)) {
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200678 vif_priv->active = false;
679 bitmap_release_region(&ar->vif_bitmap, vif_id, 0);
680 ar->vifs--;
681 rcu_assign_pointer(ar->vif_priv[vif_id].vif, NULL);
682 list_del_rcu(&vif_priv->list);
683 mutex_unlock(&ar->mutex);
684 synchronize_rcu();
685 } else {
686 if (ar->vifs > 1)
687 ar->ps.off_override |= PS_OFF_VIF;
688
689 mutex_unlock(&ar->mutex);
690 }
691
692 return err;
693}
694
695static void carl9170_op_remove_interface(struct ieee80211_hw *hw,
696 struct ieee80211_vif *vif)
697{
698 struct carl9170_vif_info *vif_priv = (void *) vif->drv_priv;
699 struct ieee80211_vif *main_vif;
700 struct ar9170 *ar = hw->priv;
701 unsigned int id;
702
703 mutex_lock(&ar->mutex);
704
705 if (WARN_ON_ONCE(!vif_priv->active))
706 goto unlock;
707
708 ar->vifs--;
709
710 rcu_read_lock();
711 main_vif = carl9170_get_main_vif(ar);
712
713 id = vif_priv->id;
714
715 vif_priv->active = false;
716 WARN_ON(vif_priv->enable_beacon);
717 vif_priv->enable_beacon = false;
718 list_del_rcu(&vif_priv->list);
719 rcu_assign_pointer(ar->vif_priv[id].vif, NULL);
720
721 if (vif == main_vif) {
722 rcu_read_unlock();
723
724 if (ar->vifs) {
725 WARN_ON(carl9170_init_interface(ar,
726 carl9170_get_main_vif(ar)));
727 } else {
728 carl9170_set_operating_mode(ar);
729 }
730 } else {
731 rcu_read_unlock();
732
733 WARN_ON(carl9170_mod_virtual_mac(ar, id, NULL));
734 }
735
736 carl9170_update_beacon(ar, false);
737 carl9170_flush_cab(ar, id);
738
739 spin_lock_bh(&ar->beacon_lock);
740 dev_kfree_skb_any(vif_priv->beacon);
741 vif_priv->beacon = NULL;
742 spin_unlock_bh(&ar->beacon_lock);
743
744 bitmap_release_region(&ar->vif_bitmap, id, 0);
745
746 carl9170_set_beacon_timers(ar);
747
748 if (ar->vifs == 1)
749 ar->ps.off_override &= ~PS_OFF_VIF;
750
751unlock:
752 mutex_unlock(&ar->mutex);
753
754 synchronize_rcu();
755}
756
757void carl9170_ps_check(struct ar9170 *ar)
758{
759 ieee80211_queue_work(ar->hw, &ar->ps_work);
760}
761
762/* caller must hold ar->mutex */
763static int carl9170_ps_update(struct ar9170 *ar)
764{
765 bool ps = false;
766 int err = 0;
767
768 if (!ar->ps.off_override)
769 ps = (ar->hw->conf.flags & IEEE80211_CONF_PS);
770
771 if (ps != ar->ps.state) {
772 err = carl9170_powersave(ar, ps);
773 if (err)
774 return err;
775
776 if (ar->ps.state && !ps) {
777 ar->ps.sleep_ms = jiffies_to_msecs(jiffies -
778 ar->ps.last_action);
779 }
780
781 if (ps)
782 ar->ps.last_slept = jiffies;
783
784 ar->ps.last_action = jiffies;
785 ar->ps.state = ps;
786 }
787
788 return 0;
789}
790
791static void carl9170_ps_work(struct work_struct *work)
792{
793 struct ar9170 *ar = container_of(work, struct ar9170,
794 ps_work);
795 mutex_lock(&ar->mutex);
796 if (IS_STARTED(ar))
797 WARN_ON_ONCE(carl9170_ps_update(ar) != 0);
798 mutex_unlock(&ar->mutex);
799}
800
Christian Lamparteracf17712011-08-15 19:50:48 +0200801static int carl9170_update_survey(struct ar9170 *ar, bool flush, bool noise)
802{
803 int err;
804
805 if (noise) {
806 err = carl9170_get_noisefloor(ar);
807 if (err)
808 return err;
809 }
810
811 if (ar->fw.hw_counters) {
812 err = carl9170_collect_tally(ar);
813 if (err)
814 return err;
815 }
816
817 if (flush)
818 memset(&ar->tally, 0, sizeof(ar->tally));
819
820 return 0;
821}
822
823static void carl9170_stat_work(struct work_struct *work)
824{
825 struct ar9170 *ar = container_of(work, struct ar9170, stat_work.work);
826 int err;
827
828 mutex_lock(&ar->mutex);
829 err = carl9170_update_survey(ar, false, true);
830 mutex_unlock(&ar->mutex);
831
832 if (err)
833 return;
834
835 ieee80211_queue_delayed_work(ar->hw, &ar->stat_work,
836 round_jiffies(msecs_to_jiffies(CARL9170_STAT_WORK)));
837}
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200838
839static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed)
840{
841 struct ar9170 *ar = hw->priv;
842 int err = 0;
843
844 mutex_lock(&ar->mutex);
845 if (changed & IEEE80211_CONF_CHANGE_LISTEN_INTERVAL) {
846 /* TODO */
847 err = 0;
848 }
849
850 if (changed & IEEE80211_CONF_CHANGE_PS) {
851 err = carl9170_ps_update(ar);
852 if (err)
853 goto out;
854 }
855
856 if (changed & IEEE80211_CONF_CHANGE_POWER) {
857 /* TODO */
858 err = 0;
859 }
860
861 if (changed & IEEE80211_CONF_CHANGE_SMPS) {
862 /* TODO */
863 err = 0;
864 }
865
866 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
867 /* adjust slot time for 5 GHz */
868 err = carl9170_set_slot_time(ar);
869 if (err)
870 goto out;
871
Christian Lamparteracf17712011-08-15 19:50:48 +0200872 err = carl9170_update_survey(ar, true, false);
873 if (err)
874 goto out;
875
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200876 err = carl9170_set_channel(ar, hw->conf.channel,
877 hw->conf.channel_type, CARL9170_RFI_NONE);
878 if (err)
879 goto out;
880
Christian Lamparteracf17712011-08-15 19:50:48 +0200881 err = carl9170_update_survey(ar, false, true);
882 if (err)
883 goto out;
884
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200885 err = carl9170_set_dyn_sifs_ack(ar);
886 if (err)
887 goto out;
888
889 err = carl9170_set_rts_cts_rate(ar);
890 if (err)
891 goto out;
892 }
893
894out:
895 mutex_unlock(&ar->mutex);
896 return err;
897}
898
899static u64 carl9170_op_prepare_multicast(struct ieee80211_hw *hw,
900 struct netdev_hw_addr_list *mc_list)
901{
902 struct netdev_hw_addr *ha;
903 u64 mchash;
904
905 /* always get broadcast frames */
906 mchash = 1ULL << (0xff >> 2);
907
908 netdev_hw_addr_list_for_each(ha, mc_list)
909 mchash |= 1ULL << (ha->addr[5] >> 2);
910
911 return mchash;
912}
913
914static void carl9170_op_configure_filter(struct ieee80211_hw *hw,
915 unsigned int changed_flags,
916 unsigned int *new_flags,
917 u64 multicast)
918{
919 struct ar9170 *ar = hw->priv;
920
921 /* mask supported flags */
Christian Lamparter5c895692010-09-28 23:00:59 +0200922 *new_flags &= FIF_ALLMULTI | ar->rx_filter_caps;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200923
924 if (!IS_ACCEPTING_CMD(ar))
925 return;
926
927 mutex_lock(&ar->mutex);
928
929 ar->filter_state = *new_flags;
930 /*
931 * We can support more by setting the sniffer bit and
932 * then checking the error flags, later.
933 */
934
Nicolas Cavallari8f7f3b22011-05-04 15:26:52 +0200935 if (*new_flags & FIF_ALLMULTI)
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200936 multicast = ~0ULL;
937
938 if (multicast != ar->cur_mc_hash)
939 WARN_ON(carl9170_update_multicast(ar, multicast));
940
941 if (changed_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS)) {
942 ar->sniffer_enabled = !!(*new_flags &
943 (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS));
944
945 WARN_ON(carl9170_set_operating_mode(ar));
946 }
947
Christian Lamparter5c895692010-09-28 23:00:59 +0200948 if (ar->fw.rx_filter && changed_flags & ar->rx_filter_caps) {
949 u32 rx_filter = 0;
950
951 if (!(*new_flags & (FIF_FCSFAIL | FIF_PLCPFAIL)))
952 rx_filter |= CARL9170_RX_FILTER_BAD;
953
954 if (!(*new_flags & FIF_CONTROL))
955 rx_filter |= CARL9170_RX_FILTER_CTL_OTHER;
956
957 if (!(*new_flags & FIF_PSPOLL))
958 rx_filter |= CARL9170_RX_FILTER_CTL_PSPOLL;
959
960 if (!(*new_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS))) {
961 rx_filter |= CARL9170_RX_FILTER_OTHER_RA;
962 rx_filter |= CARL9170_RX_FILTER_DECRY_FAIL;
963 }
964
965 WARN_ON(carl9170_rx_filter(ar, rx_filter));
966 }
967
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200968 mutex_unlock(&ar->mutex);
969}
970
971
972static void carl9170_op_bss_info_changed(struct ieee80211_hw *hw,
973 struct ieee80211_vif *vif,
974 struct ieee80211_bss_conf *bss_conf,
975 u32 changed)
976{
977 struct ar9170 *ar = hw->priv;
978 struct ath_common *common = &ar->common;
979 int err = 0;
980 struct carl9170_vif_info *vif_priv;
981 struct ieee80211_vif *main_vif;
982
983 mutex_lock(&ar->mutex);
984 vif_priv = (void *) vif->drv_priv;
985 main_vif = carl9170_get_main_vif(ar);
986 if (WARN_ON(!main_vif))
987 goto out;
988
989 if (changed & BSS_CHANGED_BEACON_ENABLED) {
990 struct carl9170_vif_info *iter;
991 int i = 0;
992
993 vif_priv->enable_beacon = bss_conf->enable_beacon;
994 rcu_read_lock();
995 list_for_each_entry_rcu(iter, &ar->vif_list, list) {
996 if (iter->active && iter->enable_beacon)
997 i++;
998
999 }
1000 rcu_read_unlock();
1001
1002 ar->beacon_enabled = i;
1003 }
1004
1005 if (changed & BSS_CHANGED_BEACON) {
1006 err = carl9170_update_beacon(ar, false);
1007 if (err)
1008 goto out;
1009 }
1010
1011 if (changed & (BSS_CHANGED_BEACON_ENABLED | BSS_CHANGED_BEACON |
1012 BSS_CHANGED_BEACON_INT)) {
1013
1014 if (main_vif != vif) {
1015 bss_conf->beacon_int = main_vif->bss_conf.beacon_int;
1016 bss_conf->dtim_period = main_vif->bss_conf.dtim_period;
1017 }
1018
1019 /*
1020 * Therefore a hard limit for the broadcast traffic should
1021 * prevent false alarms.
1022 */
1023 if (vif->type != NL80211_IFTYPE_STATION &&
1024 (bss_conf->beacon_int * bss_conf->dtim_period >=
1025 (CARL9170_QUEUE_STUCK_TIMEOUT / 2))) {
1026 err = -EINVAL;
1027 goto out;
1028 }
1029
1030 err = carl9170_set_beacon_timers(ar);
1031 if (err)
1032 goto out;
1033 }
1034
1035 if (changed & BSS_CHANGED_HT) {
1036 /* TODO */
1037 err = 0;
1038 if (err)
1039 goto out;
1040 }
1041
1042 if (main_vif != vif)
1043 goto out;
1044
1045 /*
1046 * The following settings can only be changed by the
1047 * master interface.
1048 */
1049
1050 if (changed & BSS_CHANGED_BSSID) {
1051 memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
1052 err = carl9170_set_operating_mode(ar);
1053 if (err)
1054 goto out;
1055 }
1056
1057 if (changed & BSS_CHANGED_ASSOC) {
1058 ar->common.curaid = bss_conf->aid;
1059 err = carl9170_set_beacon_timers(ar);
1060 if (err)
1061 goto out;
1062 }
1063
1064 if (changed & BSS_CHANGED_ERP_SLOT) {
1065 err = carl9170_set_slot_time(ar);
1066 if (err)
1067 goto out;
1068 }
1069
1070 if (changed & BSS_CHANGED_BASIC_RATES) {
1071 err = carl9170_set_mac_rates(ar);
1072 if (err)
1073 goto out;
1074 }
1075
1076out:
1077 WARN_ON_ONCE(err && IS_STARTED(ar));
1078 mutex_unlock(&ar->mutex);
1079}
1080
1081static u64 carl9170_op_get_tsf(struct ieee80211_hw *hw)
1082{
1083 struct ar9170 *ar = hw->priv;
1084 struct carl9170_tsf_rsp tsf;
1085 int err;
1086
1087 mutex_lock(&ar->mutex);
1088 err = carl9170_exec_cmd(ar, CARL9170_CMD_READ_TSF,
1089 0, NULL, sizeof(tsf), &tsf);
1090 mutex_unlock(&ar->mutex);
1091 if (WARN_ON(err))
1092 return 0;
1093
1094 return le64_to_cpu(tsf.tsf_64);
1095}
1096
1097static int carl9170_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1098 struct ieee80211_vif *vif,
1099 struct ieee80211_sta *sta,
1100 struct ieee80211_key_conf *key)
1101{
1102 struct ar9170 *ar = hw->priv;
1103 int err = 0, i;
1104 u8 ktype;
1105
1106 if (ar->disable_offload || !vif)
1107 return -EOPNOTSUPP;
1108
1109 /*
1110 * We have to fall back to software encryption, whenever
1111 * the user choose to participates in an IBSS or is connected
1112 * to more than one network.
1113 *
1114 * This is very unfortunate, because some machines cannot handle
1115 * the high througput speed in 802.11n networks.
1116 */
1117
1118 if (!is_main_vif(ar, vif))
1119 goto err_softw;
1120
1121 /*
1122 * While the hardware supports *catch-all* key, for offloading
1123 * group-key en-/de-cryption. The way of how the hardware
1124 * decides which keyId maps to which key, remains a mystery...
1125 */
1126 if ((vif->type != NL80211_IFTYPE_STATION &&
1127 vif->type != NL80211_IFTYPE_ADHOC) &&
1128 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
1129 return -EOPNOTSUPP;
1130
1131 switch (key->cipher) {
1132 case WLAN_CIPHER_SUITE_WEP40:
1133 ktype = AR9170_ENC_ALG_WEP64;
1134 break;
1135 case WLAN_CIPHER_SUITE_WEP104:
1136 ktype = AR9170_ENC_ALG_WEP128;
1137 break;
1138 case WLAN_CIPHER_SUITE_TKIP:
1139 ktype = AR9170_ENC_ALG_TKIP;
1140 break;
1141 case WLAN_CIPHER_SUITE_CCMP:
1142 ktype = AR9170_ENC_ALG_AESCCMP;
1143 break;
1144 default:
1145 return -EOPNOTSUPP;
1146 }
1147
1148 mutex_lock(&ar->mutex);
1149 if (cmd == SET_KEY) {
1150 if (!IS_STARTED(ar)) {
1151 err = -EOPNOTSUPP;
1152 goto out;
1153 }
1154
1155 if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
1156 sta = NULL;
1157
1158 i = 64 + key->keyidx;
1159 } else {
1160 for (i = 0; i < 64; i++)
1161 if (!(ar->usedkeys & BIT(i)))
1162 break;
1163 if (i == 64)
1164 goto err_softw;
1165 }
1166
1167 key->hw_key_idx = i;
1168
1169 err = carl9170_upload_key(ar, i, sta ? sta->addr : NULL,
1170 ktype, 0, key->key,
1171 min_t(u8, 16, key->keylen));
1172 if (err)
1173 goto out;
1174
1175 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
1176 err = carl9170_upload_key(ar, i, sta ? sta->addr :
1177 NULL, ktype, 1,
1178 key->key + 16, 16);
1179 if (err)
1180 goto out;
1181
1182 /*
1183 * hardware is not capable generating MMIC
1184 * of fragmented frames!
1185 */
1186 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1187 }
1188
1189 if (i < 64)
1190 ar->usedkeys |= BIT(i);
1191
1192 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1193 } else {
1194 if (!IS_STARTED(ar)) {
1195 /* The device is gone... together with the key ;-) */
1196 err = 0;
1197 goto out;
1198 }
1199
1200 if (key->hw_key_idx < 64) {
1201 ar->usedkeys &= ~BIT(key->hw_key_idx);
1202 } else {
1203 err = carl9170_upload_key(ar, key->hw_key_idx, NULL,
1204 AR9170_ENC_ALG_NONE, 0,
1205 NULL, 0);
1206 if (err)
1207 goto out;
1208
1209 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
1210 err = carl9170_upload_key(ar, key->hw_key_idx,
1211 NULL,
1212 AR9170_ENC_ALG_NONE,
1213 1, NULL, 0);
1214 if (err)
1215 goto out;
1216 }
1217
1218 }
1219
1220 err = carl9170_disable_key(ar, key->hw_key_idx);
1221 if (err)
1222 goto out;
1223 }
1224
1225out:
1226 mutex_unlock(&ar->mutex);
1227 return err;
1228
1229err_softw:
1230 if (!ar->rx_software_decryption) {
1231 ar->rx_software_decryption = true;
1232 carl9170_set_operating_mode(ar);
1233 }
1234 mutex_unlock(&ar->mutex);
1235 return -ENOSPC;
1236}
1237
1238static int carl9170_op_sta_add(struct ieee80211_hw *hw,
1239 struct ieee80211_vif *vif,
1240 struct ieee80211_sta *sta)
1241{
1242 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
1243 unsigned int i;
1244
Christian Lampartercaf1eae2011-04-24 17:44:19 +02001245 atomic_set(&sta_info->pending_frames, 0);
1246
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001247 if (sta->ht_cap.ht_supported) {
1248 if (sta->ht_cap.ampdu_density > 6) {
1249 /*
1250 * HW does support 16us AMPDU density.
1251 * No HT-Xmit for station.
1252 */
1253
1254 return 0;
1255 }
1256
1257 for (i = 0; i < CARL9170_NUM_TID; i++)
1258 rcu_assign_pointer(sta_info->agg[i], NULL);
1259
1260 sta_info->ampdu_max_len = 1 << (3 + sta->ht_cap.ampdu_factor);
1261 sta_info->ht_sta = true;
1262 }
1263
1264 return 0;
1265}
1266
1267static int carl9170_op_sta_remove(struct ieee80211_hw *hw,
1268 struct ieee80211_vif *vif,
1269 struct ieee80211_sta *sta)
1270{
1271 struct ar9170 *ar = hw->priv;
1272 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
1273 unsigned int i;
1274 bool cleanup = false;
1275
1276 if (sta->ht_cap.ht_supported) {
1277
1278 sta_info->ht_sta = false;
1279
1280 rcu_read_lock();
1281 for (i = 0; i < CARL9170_NUM_TID; i++) {
1282 struct carl9170_sta_tid *tid_info;
1283
1284 tid_info = rcu_dereference(sta_info->agg[i]);
1285 rcu_assign_pointer(sta_info->agg[i], NULL);
1286
1287 if (!tid_info)
1288 continue;
1289
1290 spin_lock_bh(&ar->tx_ampdu_list_lock);
1291 if (tid_info->state > CARL9170_TID_STATE_SHUTDOWN)
1292 tid_info->state = CARL9170_TID_STATE_SHUTDOWN;
1293 spin_unlock_bh(&ar->tx_ampdu_list_lock);
1294 cleanup = true;
1295 }
1296 rcu_read_unlock();
1297
1298 if (cleanup)
1299 carl9170_ampdu_gc(ar);
1300 }
1301
1302 return 0;
1303}
1304
1305static int carl9170_op_conf_tx(struct ieee80211_hw *hw, u16 queue,
1306 const struct ieee80211_tx_queue_params *param)
1307{
1308 struct ar9170 *ar = hw->priv;
1309 int ret;
1310
1311 mutex_lock(&ar->mutex);
1312 if (queue < ar->hw->queues) {
1313 memcpy(&ar->edcf[ar9170_qmap[queue]], param, sizeof(*param));
1314 ret = carl9170_set_qos(ar);
1315 } else {
1316 ret = -EINVAL;
1317 }
1318
1319 mutex_unlock(&ar->mutex);
1320 return ret;
1321}
1322
1323static void carl9170_ampdu_work(struct work_struct *work)
1324{
1325 struct ar9170 *ar = container_of(work, struct ar9170,
1326 ampdu_work);
1327
1328 if (!IS_STARTED(ar))
1329 return;
1330
1331 mutex_lock(&ar->mutex);
1332 carl9170_ampdu_gc(ar);
1333 mutex_unlock(&ar->mutex);
1334}
1335
1336static int carl9170_op_ampdu_action(struct ieee80211_hw *hw,
1337 struct ieee80211_vif *vif,
1338 enum ieee80211_ampdu_mlme_action action,
1339 struct ieee80211_sta *sta,
Johannes Berg0b01f032011-01-18 13:51:05 +01001340 u16 tid, u16 *ssn, u8 buf_size)
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001341{
1342 struct ar9170 *ar = hw->priv;
1343 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
1344 struct carl9170_sta_tid *tid_info;
1345
1346 if (modparam_noht)
1347 return -EOPNOTSUPP;
1348
1349 switch (action) {
1350 case IEEE80211_AMPDU_TX_START:
Christian Lamparter9c655c82010-09-26 23:06:56 +02001351 if (!sta_info->ht_sta)
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001352 return -EOPNOTSUPP;
1353
1354 rcu_read_lock();
1355 if (rcu_dereference(sta_info->agg[tid])) {
1356 rcu_read_unlock();
1357 return -EBUSY;
1358 }
1359
1360 tid_info = kzalloc(sizeof(struct carl9170_sta_tid),
1361 GFP_ATOMIC);
1362 if (!tid_info) {
1363 rcu_read_unlock();
1364 return -ENOMEM;
1365 }
1366
1367 tid_info->hsn = tid_info->bsn = tid_info->snx = (*ssn);
1368 tid_info->state = CARL9170_TID_STATE_PROGRESS;
1369 tid_info->tid = tid;
1370 tid_info->max = sta_info->ampdu_max_len;
1371
1372 INIT_LIST_HEAD(&tid_info->list);
1373 INIT_LIST_HEAD(&tid_info->tmp_list);
1374 skb_queue_head_init(&tid_info->queue);
1375 spin_lock_init(&tid_info->lock);
1376
1377 spin_lock_bh(&ar->tx_ampdu_list_lock);
1378 ar->tx_ampdu_list_len++;
1379 list_add_tail_rcu(&tid_info->list, &ar->tx_ampdu_list);
1380 rcu_assign_pointer(sta_info->agg[tid], tid_info);
1381 spin_unlock_bh(&ar->tx_ampdu_list_lock);
1382 rcu_read_unlock();
1383
1384 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1385 break;
1386
1387 case IEEE80211_AMPDU_TX_STOP:
1388 rcu_read_lock();
1389 tid_info = rcu_dereference(sta_info->agg[tid]);
1390 if (tid_info) {
1391 spin_lock_bh(&ar->tx_ampdu_list_lock);
1392 if (tid_info->state > CARL9170_TID_STATE_SHUTDOWN)
1393 tid_info->state = CARL9170_TID_STATE_SHUTDOWN;
1394 spin_unlock_bh(&ar->tx_ampdu_list_lock);
1395 }
1396
1397 rcu_assign_pointer(sta_info->agg[tid], NULL);
1398 rcu_read_unlock();
1399
1400 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1401 ieee80211_queue_work(ar->hw, &ar->ampdu_work);
1402 break;
1403
1404 case IEEE80211_AMPDU_TX_OPERATIONAL:
1405 rcu_read_lock();
1406 tid_info = rcu_dereference(sta_info->agg[tid]);
1407
1408 sta_info->stats[tid].clear = true;
Christian Lamparter24047e22011-03-29 13:43:14 +02001409 sta_info->stats[tid].req = false;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001410
1411 if (tid_info) {
1412 bitmap_zero(tid_info->bitmap, CARL9170_BAW_SIZE);
1413 tid_info->state = CARL9170_TID_STATE_IDLE;
1414 }
1415 rcu_read_unlock();
1416
1417 if (WARN_ON_ONCE(!tid_info))
1418 return -EFAULT;
1419
1420 break;
1421
1422 case IEEE80211_AMPDU_RX_START:
1423 case IEEE80211_AMPDU_RX_STOP:
1424 /* Handled by hardware */
1425 break;
1426
1427 default:
1428 return -EOPNOTSUPP;
1429 }
1430
1431 return 0;
1432}
1433
1434#ifdef CONFIG_CARL9170_WPC
1435static int carl9170_register_wps_button(struct ar9170 *ar)
1436{
1437 struct input_dev *input;
1438 int err;
1439
1440 if (!(ar->features & CARL9170_WPS_BUTTON))
1441 return 0;
1442
1443 input = input_allocate_device();
1444 if (!input)
1445 return -ENOMEM;
1446
1447 snprintf(ar->wps.name, sizeof(ar->wps.name), "%s WPS Button",
1448 wiphy_name(ar->hw->wiphy));
1449
1450 snprintf(ar->wps.phys, sizeof(ar->wps.phys),
1451 "ieee80211/%s/input0", wiphy_name(ar->hw->wiphy));
1452
1453 input->name = ar->wps.name;
1454 input->phys = ar->wps.phys;
1455 input->id.bustype = BUS_USB;
1456 input->dev.parent = &ar->hw->wiphy->dev;
1457
1458 input_set_capability(input, EV_KEY, KEY_WPS_BUTTON);
1459
1460 err = input_register_device(input);
1461 if (err) {
1462 input_free_device(input);
1463 return err;
1464 }
1465
1466 ar->wps.pbc = input;
1467 return 0;
1468}
1469#endif /* CONFIG_CARL9170_WPC */
1470
1471static int carl9170_op_get_survey(struct ieee80211_hw *hw, int idx,
1472 struct survey_info *survey)
1473{
1474 struct ar9170 *ar = hw->priv;
Christian Lamparteracf17712011-08-15 19:50:48 +02001475 struct ieee80211_channel *chan;
1476 struct ieee80211_supported_band *band;
1477 int err, b, i;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001478
Christian Lamparteracf17712011-08-15 19:50:48 +02001479 chan = ar->channel;
1480 if (!chan)
1481 return -ENODEV;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001482
Christian Lamparteracf17712011-08-15 19:50:48 +02001483 if (idx == chan->hw_value) {
1484 mutex_lock(&ar->mutex);
1485 err = carl9170_update_survey(ar, false, true);
1486 mutex_unlock(&ar->mutex);
1487 if (err)
1488 return err;
1489 }
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001490
Christian Lamparteracf17712011-08-15 19:50:48 +02001491 for (b = 0; b < IEEE80211_NUM_BANDS; b++) {
1492 band = ar->hw->wiphy->bands[b];
1493
1494 if (!band)
1495 continue;
1496
1497 for (i = 0; i < band->n_channels; i++) {
1498 if (band->channels[i].hw_value == idx) {
1499 chan = &band->channels[i];
1500 goto found;
1501 }
1502 }
1503 }
1504 return -ENOENT;
1505
1506found:
1507 memcpy(survey, &ar->survey[idx], sizeof(*survey));
1508
1509 survey->channel = chan;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001510 survey->filled = SURVEY_INFO_NOISE_DBM;
Christian Lamparteracf17712011-08-15 19:50:48 +02001511
1512 if (ar->channel == chan)
1513 survey->filled |= SURVEY_INFO_IN_USE;
1514
1515 if (ar->fw.hw_counters) {
1516 survey->filled |= SURVEY_INFO_CHANNEL_TIME |
1517 SURVEY_INFO_CHANNEL_TIME_BUSY |
1518 SURVEY_INFO_CHANNEL_TIME_TX;
1519 }
1520
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001521 return 0;
1522}
1523
1524static void carl9170_op_flush(struct ieee80211_hw *hw, bool drop)
1525{
1526 struct ar9170 *ar = hw->priv;
1527 unsigned int vid;
1528
1529 mutex_lock(&ar->mutex);
1530 for_each_set_bit(vid, &ar->vif_bitmap, ar->fw.vif_num)
1531 carl9170_flush_cab(ar, vid);
1532
1533 carl9170_flush(ar, drop);
1534 mutex_unlock(&ar->mutex);
1535}
1536
1537static int carl9170_op_get_stats(struct ieee80211_hw *hw,
1538 struct ieee80211_low_level_stats *stats)
1539{
1540 struct ar9170 *ar = hw->priv;
1541
1542 memset(stats, 0, sizeof(*stats));
1543 stats->dot11ACKFailureCount = ar->tx_ack_failures;
1544 stats->dot11FCSErrorCount = ar->tx_fcs_errors;
1545 return 0;
1546}
1547
1548static void carl9170_op_sta_notify(struct ieee80211_hw *hw,
1549 struct ieee80211_vif *vif,
1550 enum sta_notify_cmd cmd,
1551 struct ieee80211_sta *sta)
1552{
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001553 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001554
1555 switch (cmd) {
1556 case STA_NOTIFY_SLEEP:
Christian Lampartercaf1eae2011-04-24 17:44:19 +02001557 sta_info->sleeping = true;
1558 if (atomic_read(&sta_info->pending_frames))
1559 ieee80211_sta_block_awake(hw, sta, true);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001560 break;
1561
1562 case STA_NOTIFY_AWAKE:
Christian Lampartercaf1eae2011-04-24 17:44:19 +02001563 sta_info->sleeping = false;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001564 break;
1565 }
1566}
1567
Christian Lamparter69f72352011-07-07 23:01:25 +02001568static bool carl9170_tx_frames_pending(struct ieee80211_hw *hw)
1569{
1570 struct ar9170 *ar = hw->priv;
1571
1572 return !!atomic_read(&ar->tx_total_queued);
1573}
1574
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001575static const struct ieee80211_ops carl9170_ops = {
1576 .start = carl9170_op_start,
1577 .stop = carl9170_op_stop,
1578 .tx = carl9170_op_tx,
1579 .flush = carl9170_op_flush,
1580 .add_interface = carl9170_op_add_interface,
1581 .remove_interface = carl9170_op_remove_interface,
1582 .config = carl9170_op_config,
1583 .prepare_multicast = carl9170_op_prepare_multicast,
1584 .configure_filter = carl9170_op_configure_filter,
1585 .conf_tx = carl9170_op_conf_tx,
1586 .bss_info_changed = carl9170_op_bss_info_changed,
1587 .get_tsf = carl9170_op_get_tsf,
1588 .set_key = carl9170_op_set_key,
1589 .sta_add = carl9170_op_sta_add,
1590 .sta_remove = carl9170_op_sta_remove,
1591 .sta_notify = carl9170_op_sta_notify,
1592 .get_survey = carl9170_op_get_survey,
1593 .get_stats = carl9170_op_get_stats,
1594 .ampdu_action = carl9170_op_ampdu_action,
Christian Lamparter69f72352011-07-07 23:01:25 +02001595 .tx_frames_pending = carl9170_tx_frames_pending,
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001596};
1597
1598void *carl9170_alloc(size_t priv_size)
1599{
1600 struct ieee80211_hw *hw;
1601 struct ar9170 *ar;
1602 struct sk_buff *skb;
1603 int i;
1604
1605 /*
1606 * this buffer is used for rx stream reconstruction.
1607 * Under heavy load this device (or the transport layer?)
1608 * tends to split the streams into separate rx descriptors.
1609 */
1610
1611 skb = __dev_alloc_skb(AR9170_RX_STREAM_MAX_SIZE, GFP_KERNEL);
1612 if (!skb)
1613 goto err_nomem;
1614
1615 hw = ieee80211_alloc_hw(priv_size, &carl9170_ops);
1616 if (!hw)
1617 goto err_nomem;
1618
1619 ar = hw->priv;
1620 ar->hw = hw;
1621 ar->rx_failover = skb;
1622
1623 memset(&ar->rx_plcp, 0, sizeof(struct ar9170_rx_head));
1624 ar->rx_has_plcp = false;
1625
1626 /*
1627 * Here's a hidden pitfall!
1628 *
1629 * All 4 AC queues work perfectly well under _legacy_ operation.
1630 * However as soon as aggregation is enabled, the traffic flow
1631 * gets very bumpy. Therefore we have to _switch_ to a
1632 * software AC with a single HW queue.
1633 */
1634 hw->queues = __AR9170_NUM_TXQ;
1635
1636 mutex_init(&ar->mutex);
1637 spin_lock_init(&ar->beacon_lock);
1638 spin_lock_init(&ar->cmd_lock);
1639 spin_lock_init(&ar->tx_stats_lock);
1640 spin_lock_init(&ar->tx_ampdu_list_lock);
1641 spin_lock_init(&ar->mem_lock);
1642 spin_lock_init(&ar->state_lock);
1643 atomic_set(&ar->pending_restarts, 0);
1644 ar->vifs = 0;
1645 for (i = 0; i < ar->hw->queues; i++) {
1646 skb_queue_head_init(&ar->tx_status[i]);
1647 skb_queue_head_init(&ar->tx_pending[i]);
1648 }
1649 INIT_WORK(&ar->ps_work, carl9170_ps_work);
Christian Lampartere4a668c2010-10-29 23:26:13 +02001650 INIT_WORK(&ar->ping_work, carl9170_ping_work);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001651 INIT_WORK(&ar->restart_work, carl9170_restart_work);
1652 INIT_WORK(&ar->ampdu_work, carl9170_ampdu_work);
Christian Lamparteracf17712011-08-15 19:50:48 +02001653 INIT_DELAYED_WORK(&ar->stat_work, carl9170_stat_work);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001654 INIT_DELAYED_WORK(&ar->tx_janitor, carl9170_tx_janitor);
1655 INIT_LIST_HEAD(&ar->tx_ampdu_list);
1656 rcu_assign_pointer(ar->tx_ampdu_iter,
1657 (struct carl9170_sta_tid *) &ar->tx_ampdu_list);
1658
1659 bitmap_zero(&ar->vif_bitmap, ar->fw.vif_num);
1660 INIT_LIST_HEAD(&ar->vif_list);
1661 init_completion(&ar->tx_flush);
1662
Christian Lamparterdf649622011-05-14 02:42:38 +02001663 /* firmware decides which modes we support */
1664 hw->wiphy->interface_modes = 0;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001665
1666 hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS |
1667 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
1668 IEEE80211_HW_SUPPORTS_PS |
1669 IEEE80211_HW_PS_NULLFUNC_STACK |
Christian Lamparterf3716fd2011-06-30 20:31:34 +02001670 IEEE80211_HW_NEED_DTIM_PERIOD |
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001671 IEEE80211_HW_SIGNAL_DBM;
1672
1673 if (!modparam_noht) {
1674 /*
1675 * see the comment above, why we allow the user
1676 * to disable HT by a module parameter.
1677 */
1678 hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
1679 }
1680
1681 hw->extra_tx_headroom = sizeof(struct _carl9170_tx_superframe);
1682 hw->sta_data_size = sizeof(struct carl9170_sta_info);
1683 hw->vif_data_size = sizeof(struct carl9170_vif_info);
1684
1685 hw->max_rates = CARL9170_TX_MAX_RATES;
1686 hw->max_rate_tries = CARL9170_TX_USER_RATE_TRIES;
1687
1688 for (i = 0; i < ARRAY_SIZE(ar->noise); i++)
1689 ar->noise[i] = -95; /* ATH_DEFAULT_NOISE_FLOOR */
1690
1691 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
1692 return ar;
1693
1694err_nomem:
1695 kfree_skb(skb);
1696 return ERR_PTR(-ENOMEM);
1697}
1698
1699static int carl9170_read_eeprom(struct ar9170 *ar)
1700{
1701#define RW 8 /* number of words to read at once */
1702#define RB (sizeof(u32) * RW)
1703 u8 *eeprom = (void *)&ar->eeprom;
1704 __le32 offsets[RW];
1705 int i, j, err;
1706
1707 BUILD_BUG_ON(sizeof(ar->eeprom) & 3);
1708
1709 BUILD_BUG_ON(RB > CARL9170_MAX_CMD_LEN - 4);
1710#ifndef __CHECKER__
1711 /* don't want to handle trailing remains */
1712 BUILD_BUG_ON(sizeof(ar->eeprom) % RB);
1713#endif
1714
Pavel Roskin3f29c522011-07-13 21:38:18 -04001715 for (i = 0; i < sizeof(ar->eeprom) / RB; i++) {
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001716 for (j = 0; j < RW; j++)
1717 offsets[j] = cpu_to_le32(AR9170_EEPROM_START +
1718 RB * i + 4 * j);
1719
1720 err = carl9170_exec_cmd(ar, CARL9170_CMD_RREG,
1721 RB, (u8 *) &offsets,
1722 RB, eeprom + RB * i);
1723 if (err)
1724 return err;
1725 }
1726
1727#undef RW
1728#undef RB
1729 return 0;
1730}
1731
1732static int carl9170_parse_eeprom(struct ar9170 *ar)
1733{
1734 struct ath_regulatory *regulatory = &ar->common.regulatory;
1735 unsigned int rx_streams, tx_streams, tx_params = 0;
1736 int bands = 0;
Christian Lamparteracf17712011-08-15 19:50:48 +02001737 int chans = 0;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001738
1739 if (ar->eeprom.length == cpu_to_le16(0xffff))
1740 return -ENODATA;
1741
1742 rx_streams = hweight8(ar->eeprom.rx_mask);
1743 tx_streams = hweight8(ar->eeprom.tx_mask);
1744
1745 if (rx_streams != tx_streams) {
1746 tx_params = IEEE80211_HT_MCS_TX_RX_DIFF;
1747
1748 WARN_ON(!(tx_streams >= 1 && tx_streams <=
1749 IEEE80211_HT_MCS_TX_MAX_STREAMS));
1750
1751 tx_params = (tx_streams - 1) <<
1752 IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT;
1753
1754 carl9170_band_2GHz.ht_cap.mcs.tx_params |= tx_params;
1755 carl9170_band_5GHz.ht_cap.mcs.tx_params |= tx_params;
1756 }
1757
1758 if (ar->eeprom.operating_flags & AR9170_OPFLAG_2GHZ) {
1759 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
1760 &carl9170_band_2GHz;
Christian Lamparteracf17712011-08-15 19:50:48 +02001761 chans += carl9170_band_2GHz.n_channels;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001762 bands++;
1763 }
1764 if (ar->eeprom.operating_flags & AR9170_OPFLAG_5GHZ) {
1765 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
1766 &carl9170_band_5GHz;
Christian Lamparteracf17712011-08-15 19:50:48 +02001767 chans += carl9170_band_5GHz.n_channels;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001768 bands++;
1769 }
1770
Christian Lamparteracf17712011-08-15 19:50:48 +02001771 if (!bands)
1772 return -EINVAL;
1773
1774 ar->survey = kzalloc(sizeof(struct survey_info) * chans, GFP_KERNEL);
1775 if (!ar->survey)
1776 return -ENOMEM;
1777 ar->num_channels = chans;
1778
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001779 /*
1780 * I measured this, a bandswitch takes roughly
1781 * 135 ms and a frequency switch about 80.
1782 *
1783 * FIXME: measure these values again once EEPROM settings
1784 * are used, that will influence them!
1785 */
1786 if (bands == 2)
1787 ar->hw->channel_change_time = 135 * 1000;
1788 else
1789 ar->hw->channel_change_time = 80 * 1000;
1790
1791 regulatory->current_rd = le16_to_cpu(ar->eeprom.reg_domain[0]);
1792 regulatory->current_rd_ext = le16_to_cpu(ar->eeprom.reg_domain[1]);
1793
1794 /* second part of wiphy init */
1795 SET_IEEE80211_PERM_ADDR(ar->hw, ar->eeprom.mac_address);
1796
Christian Lamparteracf17712011-08-15 19:50:48 +02001797 return 0;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001798}
1799
1800static int carl9170_reg_notifier(struct wiphy *wiphy,
1801 struct regulatory_request *request)
1802{
1803 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1804 struct ar9170 *ar = hw->priv;
1805
1806 return ath_reg_notifier_apply(wiphy, request, &ar->common.regulatory);
1807}
1808
1809int carl9170_register(struct ar9170 *ar)
1810{
1811 struct ath_regulatory *regulatory = &ar->common.regulatory;
1812 int err = 0, i;
1813
1814 if (WARN_ON(ar->mem_bitmap))
1815 return -EINVAL;
1816
1817 ar->mem_bitmap = kzalloc(roundup(ar->fw.mem_blocks, BITS_PER_LONG) *
1818 sizeof(unsigned long), GFP_KERNEL);
1819
1820 if (!ar->mem_bitmap)
1821 return -ENOMEM;
1822
1823 /* try to read EEPROM, init MAC addr */
1824 err = carl9170_read_eeprom(ar);
1825 if (err)
1826 return err;
1827
1828 err = carl9170_fw_fix_eeprom(ar);
1829 if (err)
1830 return err;
1831
1832 err = carl9170_parse_eeprom(ar);
1833 if (err)
1834 return err;
1835
1836 err = ath_regd_init(regulatory, ar->hw->wiphy,
1837 carl9170_reg_notifier);
1838 if (err)
1839 return err;
1840
1841 if (modparam_noht) {
1842 carl9170_band_2GHz.ht_cap.ht_supported = false;
1843 carl9170_band_5GHz.ht_cap.ht_supported = false;
1844 }
1845
1846 for (i = 0; i < ar->fw.vif_num; i++) {
1847 ar->vif_priv[i].id = i;
1848 ar->vif_priv[i].vif = NULL;
1849 }
1850
1851 err = ieee80211_register_hw(ar->hw);
1852 if (err)
1853 return err;
1854
1855 /* mac80211 interface is now registered */
1856 ar->registered = true;
1857
1858 if (!ath_is_world_regd(regulatory))
1859 regulatory_hint(ar->hw->wiphy, regulatory->alpha2);
1860
1861#ifdef CONFIG_CARL9170_DEBUGFS
1862 carl9170_debugfs_register(ar);
1863#endif /* CONFIG_CARL9170_DEBUGFS */
1864
1865 err = carl9170_led_init(ar);
1866 if (err)
1867 goto err_unreg;
1868
1869#ifdef CONFIG_CARL9170_LEDS
1870 err = carl9170_led_register(ar);
1871 if (err)
1872 goto err_unreg;
Hauke Mehrtens8e7ce892010-10-23 19:51:32 +02001873#endif /* CONFIG_CARL9170_LEDS */
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001874
1875#ifdef CONFIG_CARL9170_WPC
1876 err = carl9170_register_wps_button(ar);
1877 if (err)
1878 goto err_unreg;
1879#endif /* CONFIG_CARL9170_WPC */
1880
1881 dev_info(&ar->udev->dev, "Atheros AR9170 is registered as '%s'\n",
1882 wiphy_name(ar->hw->wiphy));
1883
1884 return 0;
1885
1886err_unreg:
1887 carl9170_unregister(ar);
1888 return err;
1889}
1890
1891void carl9170_unregister(struct ar9170 *ar)
1892{
1893 if (!ar->registered)
1894 return;
1895
1896 ar->registered = false;
1897
1898#ifdef CONFIG_CARL9170_LEDS
1899 carl9170_led_unregister(ar);
1900#endif /* CONFIG_CARL9170_LEDS */
1901
1902#ifdef CONFIG_CARL9170_DEBUGFS
1903 carl9170_debugfs_unregister(ar);
1904#endif /* CONFIG_CARL9170_DEBUGFS */
1905
1906#ifdef CONFIG_CARL9170_WPC
1907 if (ar->wps.pbc) {
1908 input_unregister_device(ar->wps.pbc);
1909 ar->wps.pbc = NULL;
1910 }
1911#endif /* CONFIG_CARL9170_WPC */
1912
1913 carl9170_cancel_worker(ar);
1914 cancel_work_sync(&ar->restart_work);
1915
1916 ieee80211_unregister_hw(ar->hw);
1917}
1918
1919void carl9170_free(struct ar9170 *ar)
1920{
1921 WARN_ON(ar->registered);
1922 WARN_ON(IS_INITIALIZED(ar));
1923
1924 kfree_skb(ar->rx_failover);
1925 ar->rx_failover = NULL;
1926
1927 kfree(ar->mem_bitmap);
1928 ar->mem_bitmap = NULL;
1929
Christian Lamparteracf17712011-08-15 19:50:48 +02001930 kfree(ar->survey);
1931 ar->survey = NULL;
1932
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001933 mutex_destroy(&ar->mutex);
1934
1935 ieee80211_free_hw(ar->hw);
1936}