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