blob: 858e58dfc4dc67176f7d9693d7babb598ea6980e [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);
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--;
Eric Dumazet2cfa5a02011-11-23 07:09:32 +0000681 RCU_INIT_POINTER(ar->vif_priv[vif_id].vif, NULL);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200682 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);
Eric Dumazet2cfa5a02011-11-23 07:09:32 +0000719 RCU_INIT_POINTER(ar->vif_priv[id].vif, NULL);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200720
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
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200856 if (changed & IEEE80211_CONF_CHANGE_SMPS) {
857 /* TODO */
858 err = 0;
859 }
860
861 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
862 /* adjust slot time for 5 GHz */
863 err = carl9170_set_slot_time(ar);
864 if (err)
865 goto out;
866
Christian Lamparteracf17712011-08-15 19:50:48 +0200867 err = carl9170_update_survey(ar, true, false);
868 if (err)
869 goto out;
870
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200871 err = carl9170_set_channel(ar, hw->conf.channel,
872 hw->conf.channel_type, CARL9170_RFI_NONE);
873 if (err)
874 goto out;
875
Christian Lamparteracf17712011-08-15 19:50:48 +0200876 err = carl9170_update_survey(ar, false, true);
877 if (err)
878 goto out;
879
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200880 err = carl9170_set_dyn_sifs_ack(ar);
881 if (err)
882 goto out;
883
884 err = carl9170_set_rts_cts_rate(ar);
885 if (err)
886 goto out;
887 }
888
Christian Lamparter67e43de2012-01-21 16:59:10 +0100889 if (changed & IEEE80211_CONF_CHANGE_POWER) {
890 err = carl9170_set_mac_tpc(ar, ar->hw->conf.channel);
891 if (err)
892 goto out;
893 }
894
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200895out:
896 mutex_unlock(&ar->mutex);
897 return err;
898}
899
900static u64 carl9170_op_prepare_multicast(struct ieee80211_hw *hw,
901 struct netdev_hw_addr_list *mc_list)
902{
903 struct netdev_hw_addr *ha;
904 u64 mchash;
905
906 /* always get broadcast frames */
907 mchash = 1ULL << (0xff >> 2);
908
909 netdev_hw_addr_list_for_each(ha, mc_list)
910 mchash |= 1ULL << (ha->addr[5] >> 2);
911
912 return mchash;
913}
914
915static void carl9170_op_configure_filter(struct ieee80211_hw *hw,
916 unsigned int changed_flags,
917 unsigned int *new_flags,
918 u64 multicast)
919{
920 struct ar9170 *ar = hw->priv;
921
922 /* mask supported flags */
Christian Lamparter5c895692010-09-28 23:00:59 +0200923 *new_flags &= FIF_ALLMULTI | ar->rx_filter_caps;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200924
925 if (!IS_ACCEPTING_CMD(ar))
926 return;
927
928 mutex_lock(&ar->mutex);
929
930 ar->filter_state = *new_flags;
931 /*
932 * We can support more by setting the sniffer bit and
933 * then checking the error flags, later.
934 */
935
Nicolas Cavallari8f7f3b22011-05-04 15:26:52 +0200936 if (*new_flags & FIF_ALLMULTI)
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200937 multicast = ~0ULL;
938
939 if (multicast != ar->cur_mc_hash)
940 WARN_ON(carl9170_update_multicast(ar, multicast));
941
942 if (changed_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS)) {
943 ar->sniffer_enabled = !!(*new_flags &
944 (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS));
945
946 WARN_ON(carl9170_set_operating_mode(ar));
947 }
948
Christian Lamparter5c895692010-09-28 23:00:59 +0200949 if (ar->fw.rx_filter && changed_flags & ar->rx_filter_caps) {
950 u32 rx_filter = 0;
951
Christian Lamparterc9122c02012-07-07 21:13:59 +0200952 if (!ar->fw.ba_filter)
953 rx_filter |= CARL9170_RX_FILTER_CTL_OTHER;
954
Christian Lamparter5c895692010-09-28 23:00:59 +0200955 if (!(*new_flags & (FIF_FCSFAIL | FIF_PLCPFAIL)))
956 rx_filter |= CARL9170_RX_FILTER_BAD;
957
958 if (!(*new_flags & FIF_CONTROL))
959 rx_filter |= CARL9170_RX_FILTER_CTL_OTHER;
960
961 if (!(*new_flags & FIF_PSPOLL))
962 rx_filter |= CARL9170_RX_FILTER_CTL_PSPOLL;
963
964 if (!(*new_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS))) {
965 rx_filter |= CARL9170_RX_FILTER_OTHER_RA;
966 rx_filter |= CARL9170_RX_FILTER_DECRY_FAIL;
967 }
968
969 WARN_ON(carl9170_rx_filter(ar, rx_filter));
970 }
971
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +0200972 mutex_unlock(&ar->mutex);
973}
974
975
976static void carl9170_op_bss_info_changed(struct ieee80211_hw *hw,
977 struct ieee80211_vif *vif,
978 struct ieee80211_bss_conf *bss_conf,
979 u32 changed)
980{
981 struct ar9170 *ar = hw->priv;
982 struct ath_common *common = &ar->common;
983 int err = 0;
984 struct carl9170_vif_info *vif_priv;
985 struct ieee80211_vif *main_vif;
986
987 mutex_lock(&ar->mutex);
988 vif_priv = (void *) vif->drv_priv;
989 main_vif = carl9170_get_main_vif(ar);
990 if (WARN_ON(!main_vif))
991 goto out;
992
993 if (changed & BSS_CHANGED_BEACON_ENABLED) {
994 struct carl9170_vif_info *iter;
995 int i = 0;
996
997 vif_priv->enable_beacon = bss_conf->enable_beacon;
998 rcu_read_lock();
999 list_for_each_entry_rcu(iter, &ar->vif_list, list) {
1000 if (iter->active && iter->enable_beacon)
1001 i++;
1002
1003 }
1004 rcu_read_unlock();
1005
1006 ar->beacon_enabled = i;
1007 }
1008
1009 if (changed & BSS_CHANGED_BEACON) {
1010 err = carl9170_update_beacon(ar, false);
1011 if (err)
1012 goto out;
1013 }
1014
1015 if (changed & (BSS_CHANGED_BEACON_ENABLED | BSS_CHANGED_BEACON |
1016 BSS_CHANGED_BEACON_INT)) {
1017
1018 if (main_vif != vif) {
1019 bss_conf->beacon_int = main_vif->bss_conf.beacon_int;
1020 bss_conf->dtim_period = main_vif->bss_conf.dtim_period;
1021 }
1022
1023 /*
1024 * Therefore a hard limit for the broadcast traffic should
1025 * prevent false alarms.
1026 */
1027 if (vif->type != NL80211_IFTYPE_STATION &&
1028 (bss_conf->beacon_int * bss_conf->dtim_period >=
1029 (CARL9170_QUEUE_STUCK_TIMEOUT / 2))) {
1030 err = -EINVAL;
1031 goto out;
1032 }
1033
1034 err = carl9170_set_beacon_timers(ar);
1035 if (err)
1036 goto out;
1037 }
1038
1039 if (changed & BSS_CHANGED_HT) {
1040 /* TODO */
1041 err = 0;
1042 if (err)
1043 goto out;
1044 }
1045
1046 if (main_vif != vif)
1047 goto out;
1048
1049 /*
1050 * The following settings can only be changed by the
1051 * master interface.
1052 */
1053
1054 if (changed & BSS_CHANGED_BSSID) {
1055 memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
1056 err = carl9170_set_operating_mode(ar);
1057 if (err)
1058 goto out;
1059 }
1060
1061 if (changed & BSS_CHANGED_ASSOC) {
1062 ar->common.curaid = bss_conf->aid;
1063 err = carl9170_set_beacon_timers(ar);
1064 if (err)
1065 goto out;
1066 }
1067
1068 if (changed & BSS_CHANGED_ERP_SLOT) {
1069 err = carl9170_set_slot_time(ar);
1070 if (err)
1071 goto out;
1072 }
1073
1074 if (changed & BSS_CHANGED_BASIC_RATES) {
1075 err = carl9170_set_mac_rates(ar);
1076 if (err)
1077 goto out;
1078 }
1079
1080out:
1081 WARN_ON_ONCE(err && IS_STARTED(ar));
1082 mutex_unlock(&ar->mutex);
1083}
1084
Eliad Peller37a41b42011-09-21 14:06:11 +03001085static u64 carl9170_op_get_tsf(struct ieee80211_hw *hw,
1086 struct ieee80211_vif *vif)
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001087{
1088 struct ar9170 *ar = hw->priv;
1089 struct carl9170_tsf_rsp tsf;
1090 int err;
1091
1092 mutex_lock(&ar->mutex);
1093 err = carl9170_exec_cmd(ar, CARL9170_CMD_READ_TSF,
1094 0, NULL, sizeof(tsf), &tsf);
1095 mutex_unlock(&ar->mutex);
1096 if (WARN_ON(err))
1097 return 0;
1098
1099 return le64_to_cpu(tsf.tsf_64);
1100}
1101
1102static int carl9170_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1103 struct ieee80211_vif *vif,
1104 struct ieee80211_sta *sta,
1105 struct ieee80211_key_conf *key)
1106{
1107 struct ar9170 *ar = hw->priv;
1108 int err = 0, i;
1109 u8 ktype;
1110
1111 if (ar->disable_offload || !vif)
1112 return -EOPNOTSUPP;
1113
1114 /*
1115 * We have to fall back to software encryption, whenever
1116 * the user choose to participates in an IBSS or is connected
1117 * to more than one network.
1118 *
1119 * This is very unfortunate, because some machines cannot handle
1120 * the high througput speed in 802.11n networks.
1121 */
1122
Alexey Khoroshilov66cb54b2011-08-24 00:44:32 +04001123 if (!is_main_vif(ar, vif)) {
1124 mutex_lock(&ar->mutex);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001125 goto err_softw;
Alexey Khoroshilov66cb54b2011-08-24 00:44:32 +04001126 }
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001127
1128 /*
1129 * While the hardware supports *catch-all* key, for offloading
1130 * group-key en-/de-cryption. The way of how the hardware
1131 * decides which keyId maps to which key, remains a mystery...
1132 */
1133 if ((vif->type != NL80211_IFTYPE_STATION &&
1134 vif->type != NL80211_IFTYPE_ADHOC) &&
1135 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
1136 return -EOPNOTSUPP;
1137
1138 switch (key->cipher) {
1139 case WLAN_CIPHER_SUITE_WEP40:
1140 ktype = AR9170_ENC_ALG_WEP64;
1141 break;
1142 case WLAN_CIPHER_SUITE_WEP104:
1143 ktype = AR9170_ENC_ALG_WEP128;
1144 break;
1145 case WLAN_CIPHER_SUITE_TKIP:
1146 ktype = AR9170_ENC_ALG_TKIP;
1147 break;
1148 case WLAN_CIPHER_SUITE_CCMP:
1149 ktype = AR9170_ENC_ALG_AESCCMP;
1150 break;
1151 default:
1152 return -EOPNOTSUPP;
1153 }
1154
1155 mutex_lock(&ar->mutex);
1156 if (cmd == SET_KEY) {
1157 if (!IS_STARTED(ar)) {
1158 err = -EOPNOTSUPP;
1159 goto out;
1160 }
1161
1162 if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
1163 sta = NULL;
1164
1165 i = 64 + key->keyidx;
1166 } else {
1167 for (i = 0; i < 64; i++)
1168 if (!(ar->usedkeys & BIT(i)))
1169 break;
1170 if (i == 64)
1171 goto err_softw;
1172 }
1173
1174 key->hw_key_idx = i;
1175
1176 err = carl9170_upload_key(ar, i, sta ? sta->addr : NULL,
1177 ktype, 0, key->key,
1178 min_t(u8, 16, key->keylen));
1179 if (err)
1180 goto out;
1181
1182 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
1183 err = carl9170_upload_key(ar, i, sta ? sta->addr :
1184 NULL, ktype, 1,
1185 key->key + 16, 16);
1186 if (err)
1187 goto out;
1188
1189 /*
1190 * hardware is not capable generating MMIC
1191 * of fragmented frames!
1192 */
1193 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1194 }
1195
1196 if (i < 64)
1197 ar->usedkeys |= BIT(i);
1198
1199 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1200 } else {
1201 if (!IS_STARTED(ar)) {
1202 /* The device is gone... together with the key ;-) */
1203 err = 0;
1204 goto out;
1205 }
1206
1207 if (key->hw_key_idx < 64) {
1208 ar->usedkeys &= ~BIT(key->hw_key_idx);
1209 } else {
1210 err = carl9170_upload_key(ar, key->hw_key_idx, NULL,
1211 AR9170_ENC_ALG_NONE, 0,
1212 NULL, 0);
1213 if (err)
1214 goto out;
1215
1216 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
1217 err = carl9170_upload_key(ar, key->hw_key_idx,
1218 NULL,
1219 AR9170_ENC_ALG_NONE,
1220 1, NULL, 0);
1221 if (err)
1222 goto out;
1223 }
1224
1225 }
1226
1227 err = carl9170_disable_key(ar, key->hw_key_idx);
1228 if (err)
1229 goto out;
1230 }
1231
1232out:
1233 mutex_unlock(&ar->mutex);
1234 return err;
1235
1236err_softw:
1237 if (!ar->rx_software_decryption) {
1238 ar->rx_software_decryption = true;
1239 carl9170_set_operating_mode(ar);
1240 }
1241 mutex_unlock(&ar->mutex);
1242 return -ENOSPC;
1243}
1244
1245static int carl9170_op_sta_add(struct ieee80211_hw *hw,
1246 struct ieee80211_vif *vif,
1247 struct ieee80211_sta *sta)
1248{
1249 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
1250 unsigned int i;
1251
Christian Lampartercaf1eae2011-04-24 17:44:19 +02001252 atomic_set(&sta_info->pending_frames, 0);
1253
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001254 if (sta->ht_cap.ht_supported) {
1255 if (sta->ht_cap.ampdu_density > 6) {
1256 /*
1257 * HW does support 16us AMPDU density.
1258 * No HT-Xmit for station.
1259 */
1260
1261 return 0;
1262 }
1263
1264 for (i = 0; i < CARL9170_NUM_TID; i++)
Eric Dumazet2cfa5a02011-11-23 07:09:32 +00001265 RCU_INIT_POINTER(sta_info->agg[i], NULL);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001266
1267 sta_info->ampdu_max_len = 1 << (3 + sta->ht_cap.ampdu_factor);
1268 sta_info->ht_sta = true;
1269 }
1270
1271 return 0;
1272}
1273
1274static int carl9170_op_sta_remove(struct ieee80211_hw *hw,
1275 struct ieee80211_vif *vif,
1276 struct ieee80211_sta *sta)
1277{
1278 struct ar9170 *ar = hw->priv;
1279 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
1280 unsigned int i;
1281 bool cleanup = false;
1282
1283 if (sta->ht_cap.ht_supported) {
1284
1285 sta_info->ht_sta = false;
1286
1287 rcu_read_lock();
1288 for (i = 0; i < CARL9170_NUM_TID; i++) {
1289 struct carl9170_sta_tid *tid_info;
1290
1291 tid_info = rcu_dereference(sta_info->agg[i]);
Eric Dumazet2cfa5a02011-11-23 07:09:32 +00001292 RCU_INIT_POINTER(sta_info->agg[i], NULL);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001293
1294 if (!tid_info)
1295 continue;
1296
1297 spin_lock_bh(&ar->tx_ampdu_list_lock);
1298 if (tid_info->state > CARL9170_TID_STATE_SHUTDOWN)
1299 tid_info->state = CARL9170_TID_STATE_SHUTDOWN;
1300 spin_unlock_bh(&ar->tx_ampdu_list_lock);
1301 cleanup = true;
1302 }
1303 rcu_read_unlock();
1304
1305 if (cleanup)
1306 carl9170_ampdu_gc(ar);
1307 }
1308
1309 return 0;
1310}
1311
Eliad Peller8a3a3c82011-10-02 10:15:52 +02001312static int carl9170_op_conf_tx(struct ieee80211_hw *hw,
1313 struct ieee80211_vif *vif, u16 queue,
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001314 const struct ieee80211_tx_queue_params *param)
1315{
1316 struct ar9170 *ar = hw->priv;
1317 int ret;
1318
1319 mutex_lock(&ar->mutex);
1320 if (queue < ar->hw->queues) {
1321 memcpy(&ar->edcf[ar9170_qmap[queue]], param, sizeof(*param));
1322 ret = carl9170_set_qos(ar);
1323 } else {
1324 ret = -EINVAL;
1325 }
1326
1327 mutex_unlock(&ar->mutex);
1328 return ret;
1329}
1330
1331static void carl9170_ampdu_work(struct work_struct *work)
1332{
1333 struct ar9170 *ar = container_of(work, struct ar9170,
1334 ampdu_work);
1335
1336 if (!IS_STARTED(ar))
1337 return;
1338
1339 mutex_lock(&ar->mutex);
1340 carl9170_ampdu_gc(ar);
1341 mutex_unlock(&ar->mutex);
1342}
1343
1344static int carl9170_op_ampdu_action(struct ieee80211_hw *hw,
1345 struct ieee80211_vif *vif,
1346 enum ieee80211_ampdu_mlme_action action,
1347 struct ieee80211_sta *sta,
Johannes Berg0b01f032011-01-18 13:51:05 +01001348 u16 tid, u16 *ssn, u8 buf_size)
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001349{
1350 struct ar9170 *ar = hw->priv;
1351 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
1352 struct carl9170_sta_tid *tid_info;
1353
1354 if (modparam_noht)
1355 return -EOPNOTSUPP;
1356
1357 switch (action) {
1358 case IEEE80211_AMPDU_TX_START:
Christian Lamparter9c655c82010-09-26 23:06:56 +02001359 if (!sta_info->ht_sta)
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001360 return -EOPNOTSUPP;
1361
1362 rcu_read_lock();
1363 if (rcu_dereference(sta_info->agg[tid])) {
1364 rcu_read_unlock();
1365 return -EBUSY;
1366 }
1367
1368 tid_info = kzalloc(sizeof(struct carl9170_sta_tid),
1369 GFP_ATOMIC);
1370 if (!tid_info) {
1371 rcu_read_unlock();
1372 return -ENOMEM;
1373 }
1374
1375 tid_info->hsn = tid_info->bsn = tid_info->snx = (*ssn);
1376 tid_info->state = CARL9170_TID_STATE_PROGRESS;
1377 tid_info->tid = tid;
1378 tid_info->max = sta_info->ampdu_max_len;
1379
1380 INIT_LIST_HEAD(&tid_info->list);
1381 INIT_LIST_HEAD(&tid_info->tmp_list);
1382 skb_queue_head_init(&tid_info->queue);
1383 spin_lock_init(&tid_info->lock);
1384
1385 spin_lock_bh(&ar->tx_ampdu_list_lock);
1386 ar->tx_ampdu_list_len++;
1387 list_add_tail_rcu(&tid_info->list, &ar->tx_ampdu_list);
1388 rcu_assign_pointer(sta_info->agg[tid], tid_info);
1389 spin_unlock_bh(&ar->tx_ampdu_list_lock);
1390 rcu_read_unlock();
1391
1392 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1393 break;
1394
1395 case IEEE80211_AMPDU_TX_STOP:
1396 rcu_read_lock();
1397 tid_info = rcu_dereference(sta_info->agg[tid]);
1398 if (tid_info) {
1399 spin_lock_bh(&ar->tx_ampdu_list_lock);
1400 if (tid_info->state > CARL9170_TID_STATE_SHUTDOWN)
1401 tid_info->state = CARL9170_TID_STATE_SHUTDOWN;
1402 spin_unlock_bh(&ar->tx_ampdu_list_lock);
1403 }
1404
Eric Dumazet2cfa5a02011-11-23 07:09:32 +00001405 RCU_INIT_POINTER(sta_info->agg[tid], NULL);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001406 rcu_read_unlock();
1407
1408 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1409 ieee80211_queue_work(ar->hw, &ar->ampdu_work);
1410 break;
1411
1412 case IEEE80211_AMPDU_TX_OPERATIONAL:
1413 rcu_read_lock();
1414 tid_info = rcu_dereference(sta_info->agg[tid]);
1415
1416 sta_info->stats[tid].clear = true;
Christian Lamparter24047e22011-03-29 13:43:14 +02001417 sta_info->stats[tid].req = false;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001418
1419 if (tid_info) {
1420 bitmap_zero(tid_info->bitmap, CARL9170_BAW_SIZE);
1421 tid_info->state = CARL9170_TID_STATE_IDLE;
1422 }
1423 rcu_read_unlock();
1424
1425 if (WARN_ON_ONCE(!tid_info))
1426 return -EFAULT;
1427
1428 break;
1429
1430 case IEEE80211_AMPDU_RX_START:
1431 case IEEE80211_AMPDU_RX_STOP:
1432 /* Handled by hardware */
1433 break;
1434
1435 default:
1436 return -EOPNOTSUPP;
1437 }
1438
1439 return 0;
1440}
1441
1442#ifdef CONFIG_CARL9170_WPC
1443static int carl9170_register_wps_button(struct ar9170 *ar)
1444{
1445 struct input_dev *input;
1446 int err;
1447
1448 if (!(ar->features & CARL9170_WPS_BUTTON))
1449 return 0;
1450
1451 input = input_allocate_device();
1452 if (!input)
1453 return -ENOMEM;
1454
1455 snprintf(ar->wps.name, sizeof(ar->wps.name), "%s WPS Button",
1456 wiphy_name(ar->hw->wiphy));
1457
1458 snprintf(ar->wps.phys, sizeof(ar->wps.phys),
1459 "ieee80211/%s/input0", wiphy_name(ar->hw->wiphy));
1460
1461 input->name = ar->wps.name;
1462 input->phys = ar->wps.phys;
1463 input->id.bustype = BUS_USB;
1464 input->dev.parent = &ar->hw->wiphy->dev;
1465
1466 input_set_capability(input, EV_KEY, KEY_WPS_BUTTON);
1467
1468 err = input_register_device(input);
1469 if (err) {
1470 input_free_device(input);
1471 return err;
1472 }
1473
1474 ar->wps.pbc = input;
1475 return 0;
1476}
1477#endif /* CONFIG_CARL9170_WPC */
1478
Christian Lamparter00044f12011-08-15 20:09:54 +02001479#ifdef CONFIG_CARL9170_HWRNG
1480static int carl9170_rng_get(struct ar9170 *ar)
1481{
1482
1483#define RW (CARL9170_MAX_CMD_PAYLOAD_LEN / sizeof(u32))
1484#define RB (CARL9170_MAX_CMD_PAYLOAD_LEN)
1485
1486 static const __le32 rng_load[RW] = {
1487 [0 ... (RW - 1)] = cpu_to_le32(AR9170_RAND_REG_NUM)};
1488
1489 u32 buf[RW];
1490
1491 unsigned int i, off = 0, transfer, count;
1492 int err;
1493
1494 BUILD_BUG_ON(RB > CARL9170_MAX_CMD_PAYLOAD_LEN);
1495
1496 if (!IS_ACCEPTING_CMD(ar) || !ar->rng.initialized)
1497 return -EAGAIN;
1498
1499 count = ARRAY_SIZE(ar->rng.cache);
1500 while (count) {
1501 err = carl9170_exec_cmd(ar, CARL9170_CMD_RREG,
1502 RB, (u8 *) rng_load,
1503 RB, (u8 *) buf);
1504 if (err)
1505 return err;
1506
1507 transfer = min_t(unsigned int, count, RW);
1508 for (i = 0; i < transfer; i++)
1509 ar->rng.cache[off + i] = buf[i];
1510
1511 off += transfer;
1512 count -= transfer;
1513 }
1514
1515 ar->rng.cache_idx = 0;
1516
1517#undef RW
1518#undef RB
1519 return 0;
1520}
1521
1522static int carl9170_rng_read(struct hwrng *rng, u32 *data)
1523{
1524 struct ar9170 *ar = (struct ar9170 *)rng->priv;
1525 int ret = -EIO;
1526
1527 mutex_lock(&ar->mutex);
1528 if (ar->rng.cache_idx >= ARRAY_SIZE(ar->rng.cache)) {
1529 ret = carl9170_rng_get(ar);
1530 if (ret) {
1531 mutex_unlock(&ar->mutex);
1532 return ret;
1533 }
1534 }
1535
1536 *data = ar->rng.cache[ar->rng.cache_idx++];
1537 mutex_unlock(&ar->mutex);
1538
1539 return sizeof(u16);
1540}
1541
1542static void carl9170_unregister_hwrng(struct ar9170 *ar)
1543{
1544 if (ar->rng.initialized) {
1545 hwrng_unregister(&ar->rng.rng);
1546 ar->rng.initialized = false;
1547 }
1548}
1549
1550static int carl9170_register_hwrng(struct ar9170 *ar)
1551{
1552 int err;
1553
1554 snprintf(ar->rng.name, ARRAY_SIZE(ar->rng.name),
1555 "%s_%s", KBUILD_MODNAME, wiphy_name(ar->hw->wiphy));
1556 ar->rng.rng.name = ar->rng.name;
1557 ar->rng.rng.data_read = carl9170_rng_read;
1558 ar->rng.rng.priv = (unsigned long)ar;
1559
1560 if (WARN_ON(ar->rng.initialized))
1561 return -EALREADY;
1562
1563 err = hwrng_register(&ar->rng.rng);
1564 if (err) {
1565 dev_err(&ar->udev->dev, "Failed to register the random "
1566 "number generator (%d)\n", err);
1567 return err;
1568 }
1569
1570 ar->rng.initialized = true;
1571
1572 err = carl9170_rng_get(ar);
1573 if (err) {
1574 carl9170_unregister_hwrng(ar);
1575 return err;
1576 }
1577
1578 return 0;
1579}
1580#endif /* CONFIG_CARL9170_HWRNG */
1581
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001582static int carl9170_op_get_survey(struct ieee80211_hw *hw, int idx,
1583 struct survey_info *survey)
1584{
1585 struct ar9170 *ar = hw->priv;
Christian Lamparteracf17712011-08-15 19:50:48 +02001586 struct ieee80211_channel *chan;
1587 struct ieee80211_supported_band *band;
1588 int err, b, i;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001589
Christian Lamparteracf17712011-08-15 19:50:48 +02001590 chan = ar->channel;
1591 if (!chan)
1592 return -ENODEV;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001593
Christian Lamparteracf17712011-08-15 19:50:48 +02001594 if (idx == chan->hw_value) {
1595 mutex_lock(&ar->mutex);
1596 err = carl9170_update_survey(ar, false, true);
1597 mutex_unlock(&ar->mutex);
1598 if (err)
1599 return err;
1600 }
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001601
Christian Lamparteracf17712011-08-15 19:50:48 +02001602 for (b = 0; b < IEEE80211_NUM_BANDS; b++) {
1603 band = ar->hw->wiphy->bands[b];
1604
1605 if (!band)
1606 continue;
1607
1608 for (i = 0; i < band->n_channels; i++) {
1609 if (band->channels[i].hw_value == idx) {
1610 chan = &band->channels[i];
1611 goto found;
1612 }
1613 }
1614 }
1615 return -ENOENT;
1616
1617found:
1618 memcpy(survey, &ar->survey[idx], sizeof(*survey));
1619
1620 survey->channel = chan;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001621 survey->filled = SURVEY_INFO_NOISE_DBM;
Christian Lamparteracf17712011-08-15 19:50:48 +02001622
1623 if (ar->channel == chan)
1624 survey->filled |= SURVEY_INFO_IN_USE;
1625
1626 if (ar->fw.hw_counters) {
1627 survey->filled |= SURVEY_INFO_CHANNEL_TIME |
1628 SURVEY_INFO_CHANNEL_TIME_BUSY |
1629 SURVEY_INFO_CHANNEL_TIME_TX;
1630 }
1631
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001632 return 0;
1633}
1634
1635static void carl9170_op_flush(struct ieee80211_hw *hw, bool drop)
1636{
1637 struct ar9170 *ar = hw->priv;
1638 unsigned int vid;
1639
1640 mutex_lock(&ar->mutex);
1641 for_each_set_bit(vid, &ar->vif_bitmap, ar->fw.vif_num)
1642 carl9170_flush_cab(ar, vid);
1643
1644 carl9170_flush(ar, drop);
1645 mutex_unlock(&ar->mutex);
1646}
1647
1648static int carl9170_op_get_stats(struct ieee80211_hw *hw,
1649 struct ieee80211_low_level_stats *stats)
1650{
1651 struct ar9170 *ar = hw->priv;
1652
1653 memset(stats, 0, sizeof(*stats));
1654 stats->dot11ACKFailureCount = ar->tx_ack_failures;
1655 stats->dot11FCSErrorCount = ar->tx_fcs_errors;
1656 return 0;
1657}
1658
1659static void carl9170_op_sta_notify(struct ieee80211_hw *hw,
1660 struct ieee80211_vif *vif,
1661 enum sta_notify_cmd cmd,
1662 struct ieee80211_sta *sta)
1663{
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001664 struct carl9170_sta_info *sta_info = (void *) sta->drv_priv;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001665
1666 switch (cmd) {
1667 case STA_NOTIFY_SLEEP:
Christian Lampartercaf1eae2011-04-24 17:44:19 +02001668 sta_info->sleeping = true;
1669 if (atomic_read(&sta_info->pending_frames))
1670 ieee80211_sta_block_awake(hw, sta, true);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001671 break;
1672
1673 case STA_NOTIFY_AWAKE:
Christian Lampartercaf1eae2011-04-24 17:44:19 +02001674 sta_info->sleeping = false;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001675 break;
1676 }
1677}
1678
Christian Lamparter69f72352011-07-07 23:01:25 +02001679static bool carl9170_tx_frames_pending(struct ieee80211_hw *hw)
1680{
1681 struct ar9170 *ar = hw->priv;
1682
1683 return !!atomic_read(&ar->tx_total_queued);
1684}
1685
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001686static const struct ieee80211_ops carl9170_ops = {
1687 .start = carl9170_op_start,
1688 .stop = carl9170_op_stop,
1689 .tx = carl9170_op_tx,
1690 .flush = carl9170_op_flush,
1691 .add_interface = carl9170_op_add_interface,
1692 .remove_interface = carl9170_op_remove_interface,
1693 .config = carl9170_op_config,
1694 .prepare_multicast = carl9170_op_prepare_multicast,
1695 .configure_filter = carl9170_op_configure_filter,
1696 .conf_tx = carl9170_op_conf_tx,
1697 .bss_info_changed = carl9170_op_bss_info_changed,
1698 .get_tsf = carl9170_op_get_tsf,
1699 .set_key = carl9170_op_set_key,
1700 .sta_add = carl9170_op_sta_add,
1701 .sta_remove = carl9170_op_sta_remove,
1702 .sta_notify = carl9170_op_sta_notify,
1703 .get_survey = carl9170_op_get_survey,
1704 .get_stats = carl9170_op_get_stats,
1705 .ampdu_action = carl9170_op_ampdu_action,
Christian Lamparter69f72352011-07-07 23:01:25 +02001706 .tx_frames_pending = carl9170_tx_frames_pending,
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001707};
1708
1709void *carl9170_alloc(size_t priv_size)
1710{
1711 struct ieee80211_hw *hw;
1712 struct ar9170 *ar;
1713 struct sk_buff *skb;
1714 int i;
1715
1716 /*
1717 * this buffer is used for rx stream reconstruction.
1718 * Under heavy load this device (or the transport layer?)
1719 * tends to split the streams into separate rx descriptors.
1720 */
1721
1722 skb = __dev_alloc_skb(AR9170_RX_STREAM_MAX_SIZE, GFP_KERNEL);
1723 if (!skb)
1724 goto err_nomem;
1725
1726 hw = ieee80211_alloc_hw(priv_size, &carl9170_ops);
1727 if (!hw)
1728 goto err_nomem;
1729
1730 ar = hw->priv;
1731 ar->hw = hw;
1732 ar->rx_failover = skb;
1733
1734 memset(&ar->rx_plcp, 0, sizeof(struct ar9170_rx_head));
1735 ar->rx_has_plcp = false;
1736
1737 /*
1738 * Here's a hidden pitfall!
1739 *
1740 * All 4 AC queues work perfectly well under _legacy_ operation.
1741 * However as soon as aggregation is enabled, the traffic flow
1742 * gets very bumpy. Therefore we have to _switch_ to a
1743 * software AC with a single HW queue.
1744 */
1745 hw->queues = __AR9170_NUM_TXQ;
1746
1747 mutex_init(&ar->mutex);
1748 spin_lock_init(&ar->beacon_lock);
1749 spin_lock_init(&ar->cmd_lock);
1750 spin_lock_init(&ar->tx_stats_lock);
1751 spin_lock_init(&ar->tx_ampdu_list_lock);
1752 spin_lock_init(&ar->mem_lock);
1753 spin_lock_init(&ar->state_lock);
1754 atomic_set(&ar->pending_restarts, 0);
1755 ar->vifs = 0;
1756 for (i = 0; i < ar->hw->queues; i++) {
1757 skb_queue_head_init(&ar->tx_status[i]);
1758 skb_queue_head_init(&ar->tx_pending[i]);
Christian Lamparterc9122c02012-07-07 21:13:59 +02001759
1760 INIT_LIST_HEAD(&ar->bar_list[i]);
1761 spin_lock_init(&ar->bar_list_lock[i]);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001762 }
1763 INIT_WORK(&ar->ps_work, carl9170_ps_work);
Christian Lampartere4a668c2010-10-29 23:26:13 +02001764 INIT_WORK(&ar->ping_work, carl9170_ping_work);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001765 INIT_WORK(&ar->restart_work, carl9170_restart_work);
1766 INIT_WORK(&ar->ampdu_work, carl9170_ampdu_work);
Christian Lamparteracf17712011-08-15 19:50:48 +02001767 INIT_DELAYED_WORK(&ar->stat_work, carl9170_stat_work);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001768 INIT_DELAYED_WORK(&ar->tx_janitor, carl9170_tx_janitor);
1769 INIT_LIST_HEAD(&ar->tx_ampdu_list);
1770 rcu_assign_pointer(ar->tx_ampdu_iter,
1771 (struct carl9170_sta_tid *) &ar->tx_ampdu_list);
1772
1773 bitmap_zero(&ar->vif_bitmap, ar->fw.vif_num);
1774 INIT_LIST_HEAD(&ar->vif_list);
1775 init_completion(&ar->tx_flush);
1776
Christian Lamparterdf649622011-05-14 02:42:38 +02001777 /* firmware decides which modes we support */
1778 hw->wiphy->interface_modes = 0;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001779
1780 hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS |
1781 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
1782 IEEE80211_HW_SUPPORTS_PS |
1783 IEEE80211_HW_PS_NULLFUNC_STACK |
Christian Lamparterf3716fd2011-06-30 20:31:34 +02001784 IEEE80211_HW_NEED_DTIM_PERIOD |
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001785 IEEE80211_HW_SIGNAL_DBM;
1786
1787 if (!modparam_noht) {
1788 /*
1789 * see the comment above, why we allow the user
1790 * to disable HT by a module parameter.
1791 */
1792 hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
1793 }
1794
1795 hw->extra_tx_headroom = sizeof(struct _carl9170_tx_superframe);
1796 hw->sta_data_size = sizeof(struct carl9170_sta_info);
1797 hw->vif_data_size = sizeof(struct carl9170_vif_info);
1798
1799 hw->max_rates = CARL9170_TX_MAX_RATES;
1800 hw->max_rate_tries = CARL9170_TX_USER_RATE_TRIES;
1801
1802 for (i = 0; i < ARRAY_SIZE(ar->noise); i++)
1803 ar->noise[i] = -95; /* ATH_DEFAULT_NOISE_FLOOR */
1804
1805 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
Nicolas Cavallarie2d75c12012-01-11 16:44:50 +01001806
1807 /* As IBSS Encryption is software-based, IBSS RSN is supported. */
1808 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001809 return ar;
1810
1811err_nomem:
1812 kfree_skb(skb);
1813 return ERR_PTR(-ENOMEM);
1814}
1815
1816static int carl9170_read_eeprom(struct ar9170 *ar)
1817{
1818#define RW 8 /* number of words to read at once */
1819#define RB (sizeof(u32) * RW)
1820 u8 *eeprom = (void *)&ar->eeprom;
1821 __le32 offsets[RW];
1822 int i, j, err;
1823
1824 BUILD_BUG_ON(sizeof(ar->eeprom) & 3);
1825
1826 BUILD_BUG_ON(RB > CARL9170_MAX_CMD_LEN - 4);
1827#ifndef __CHECKER__
1828 /* don't want to handle trailing remains */
1829 BUILD_BUG_ON(sizeof(ar->eeprom) % RB);
1830#endif
1831
Pavel Roskin3f29c522011-07-13 21:38:18 -04001832 for (i = 0; i < sizeof(ar->eeprom) / RB; i++) {
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001833 for (j = 0; j < RW; j++)
1834 offsets[j] = cpu_to_le32(AR9170_EEPROM_START +
1835 RB * i + 4 * j);
1836
1837 err = carl9170_exec_cmd(ar, CARL9170_CMD_RREG,
1838 RB, (u8 *) &offsets,
1839 RB, eeprom + RB * i);
1840 if (err)
1841 return err;
1842 }
1843
1844#undef RW
1845#undef RB
1846 return 0;
1847}
1848
1849static int carl9170_parse_eeprom(struct ar9170 *ar)
1850{
1851 struct ath_regulatory *regulatory = &ar->common.regulatory;
1852 unsigned int rx_streams, tx_streams, tx_params = 0;
1853 int bands = 0;
Christian Lamparteracf17712011-08-15 19:50:48 +02001854 int chans = 0;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001855
1856 if (ar->eeprom.length == cpu_to_le16(0xffff))
1857 return -ENODATA;
1858
1859 rx_streams = hweight8(ar->eeprom.rx_mask);
1860 tx_streams = hweight8(ar->eeprom.tx_mask);
1861
1862 if (rx_streams != tx_streams) {
1863 tx_params = IEEE80211_HT_MCS_TX_RX_DIFF;
1864
1865 WARN_ON(!(tx_streams >= 1 && tx_streams <=
1866 IEEE80211_HT_MCS_TX_MAX_STREAMS));
1867
1868 tx_params = (tx_streams - 1) <<
1869 IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT;
1870
1871 carl9170_band_2GHz.ht_cap.mcs.tx_params |= tx_params;
1872 carl9170_band_5GHz.ht_cap.mcs.tx_params |= tx_params;
1873 }
1874
1875 if (ar->eeprom.operating_flags & AR9170_OPFLAG_2GHZ) {
1876 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
1877 &carl9170_band_2GHz;
Christian Lamparteracf17712011-08-15 19:50:48 +02001878 chans += carl9170_band_2GHz.n_channels;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001879 bands++;
1880 }
1881 if (ar->eeprom.operating_flags & AR9170_OPFLAG_5GHZ) {
1882 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
1883 &carl9170_band_5GHz;
Christian Lamparteracf17712011-08-15 19:50:48 +02001884 chans += carl9170_band_5GHz.n_channels;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001885 bands++;
1886 }
1887
Christian Lamparteracf17712011-08-15 19:50:48 +02001888 if (!bands)
1889 return -EINVAL;
1890
1891 ar->survey = kzalloc(sizeof(struct survey_info) * chans, GFP_KERNEL);
1892 if (!ar->survey)
1893 return -ENOMEM;
1894 ar->num_channels = chans;
1895
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001896 /*
1897 * I measured this, a bandswitch takes roughly
1898 * 135 ms and a frequency switch about 80.
1899 *
1900 * FIXME: measure these values again once EEPROM settings
1901 * are used, that will influence them!
1902 */
1903 if (bands == 2)
1904 ar->hw->channel_change_time = 135 * 1000;
1905 else
1906 ar->hw->channel_change_time = 80 * 1000;
1907
1908 regulatory->current_rd = le16_to_cpu(ar->eeprom.reg_domain[0]);
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001909
1910 /* second part of wiphy init */
1911 SET_IEEE80211_PERM_ADDR(ar->hw, ar->eeprom.mac_address);
1912
Christian Lamparteracf17712011-08-15 19:50:48 +02001913 return 0;
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001914}
1915
1916static int carl9170_reg_notifier(struct wiphy *wiphy,
1917 struct regulatory_request *request)
1918{
1919 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1920 struct ar9170 *ar = hw->priv;
1921
1922 return ath_reg_notifier_apply(wiphy, request, &ar->common.regulatory);
1923}
1924
1925int carl9170_register(struct ar9170 *ar)
1926{
1927 struct ath_regulatory *regulatory = &ar->common.regulatory;
1928 int err = 0, i;
1929
1930 if (WARN_ON(ar->mem_bitmap))
1931 return -EINVAL;
1932
1933 ar->mem_bitmap = kzalloc(roundup(ar->fw.mem_blocks, BITS_PER_LONG) *
1934 sizeof(unsigned long), GFP_KERNEL);
1935
1936 if (!ar->mem_bitmap)
1937 return -ENOMEM;
1938
1939 /* try to read EEPROM, init MAC addr */
1940 err = carl9170_read_eeprom(ar);
1941 if (err)
1942 return err;
1943
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001944 err = carl9170_parse_eeprom(ar);
1945 if (err)
1946 return err;
1947
1948 err = ath_regd_init(regulatory, ar->hw->wiphy,
1949 carl9170_reg_notifier);
1950 if (err)
1951 return err;
1952
1953 if (modparam_noht) {
1954 carl9170_band_2GHz.ht_cap.ht_supported = false;
1955 carl9170_band_5GHz.ht_cap.ht_supported = false;
1956 }
1957
1958 for (i = 0; i < ar->fw.vif_num; i++) {
1959 ar->vif_priv[i].id = i;
1960 ar->vif_priv[i].vif = NULL;
1961 }
1962
1963 err = ieee80211_register_hw(ar->hw);
1964 if (err)
1965 return err;
1966
1967 /* mac80211 interface is now registered */
1968 ar->registered = true;
1969
1970 if (!ath_is_world_regd(regulatory))
1971 regulatory_hint(ar->hw->wiphy, regulatory->alpha2);
1972
1973#ifdef CONFIG_CARL9170_DEBUGFS
1974 carl9170_debugfs_register(ar);
1975#endif /* CONFIG_CARL9170_DEBUGFS */
1976
1977 err = carl9170_led_init(ar);
1978 if (err)
1979 goto err_unreg;
1980
1981#ifdef CONFIG_CARL9170_LEDS
1982 err = carl9170_led_register(ar);
1983 if (err)
1984 goto err_unreg;
Hauke Mehrtens8e7ce892010-10-23 19:51:32 +02001985#endif /* CONFIG_CARL9170_LEDS */
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001986
1987#ifdef CONFIG_CARL9170_WPC
1988 err = carl9170_register_wps_button(ar);
1989 if (err)
1990 goto err_unreg;
1991#endif /* CONFIG_CARL9170_WPC */
1992
Christian Lamparter00044f12011-08-15 20:09:54 +02001993#ifdef CONFIG_CARL9170_HWRNG
1994 err = carl9170_register_hwrng(ar);
1995 if (err)
1996 goto err_unreg;
1997#endif /* CONFIG_CARL9170_HWRNG */
1998
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02001999 dev_info(&ar->udev->dev, "Atheros AR9170 is registered as '%s'\n",
2000 wiphy_name(ar->hw->wiphy));
2001
2002 return 0;
2003
2004err_unreg:
2005 carl9170_unregister(ar);
2006 return err;
2007}
2008
2009void carl9170_unregister(struct ar9170 *ar)
2010{
2011 if (!ar->registered)
2012 return;
2013
2014 ar->registered = false;
2015
2016#ifdef CONFIG_CARL9170_LEDS
2017 carl9170_led_unregister(ar);
2018#endif /* CONFIG_CARL9170_LEDS */
2019
2020#ifdef CONFIG_CARL9170_DEBUGFS
2021 carl9170_debugfs_unregister(ar);
2022#endif /* CONFIG_CARL9170_DEBUGFS */
2023
2024#ifdef CONFIG_CARL9170_WPC
2025 if (ar->wps.pbc) {
2026 input_unregister_device(ar->wps.pbc);
2027 ar->wps.pbc = NULL;
2028 }
2029#endif /* CONFIG_CARL9170_WPC */
2030
Christian Lamparter00044f12011-08-15 20:09:54 +02002031#ifdef CONFIG_CARL9170_HWRNG
2032 carl9170_unregister_hwrng(ar);
2033#endif /* CONFIG_CARL9170_HWRNG */
2034
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02002035 carl9170_cancel_worker(ar);
2036 cancel_work_sync(&ar->restart_work);
2037
2038 ieee80211_unregister_hw(ar->hw);
2039}
2040
2041void carl9170_free(struct ar9170 *ar)
2042{
2043 WARN_ON(ar->registered);
2044 WARN_ON(IS_INITIALIZED(ar));
2045
2046 kfree_skb(ar->rx_failover);
2047 ar->rx_failover = NULL;
2048
2049 kfree(ar->mem_bitmap);
2050 ar->mem_bitmap = NULL;
2051
Christian Lamparteracf17712011-08-15 19:50:48 +02002052 kfree(ar->survey);
2053 ar->survey = NULL;
2054
Christian Lamparterfe8ee9a2010-09-06 00:48:55 +02002055 mutex_destroy(&ar->mutex);
2056
2057 ieee80211_free_hw(ar->hw);
2058}