1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#include <linux/init.h>
41#include <linux/module.h>
42#include <linux/etherdevice.h>
43#include <net/mac80211.h>
44#include "ar9170.h"
45#include "hw.h"
46#include "cmd.h"
47
48static int modparam_nohwcrypt;
49module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
50MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
51
52static int modparam_ht;
53module_param_named(ht, modparam_ht, bool, S_IRUGO);
54MODULE_PARM_DESC(ht, "enable MPDU aggregation.");
55
56#define RATE(_bitrate, _hw_rate, _txpidx, _flags) { \
57 .bitrate = (_bitrate), \
58 .flags = (_flags), \
59 .hw_value = (_hw_rate) | (_txpidx) << 4, \
60}
61
62static struct ieee80211_rate __ar9170_ratetable[] = {
63 RATE(10, 0, 0, 0),
64 RATE(20, 1, 1, IEEE80211_RATE_SHORT_PREAMBLE),
65 RATE(55, 2, 2, IEEE80211_RATE_SHORT_PREAMBLE),
66 RATE(110, 3, 3, IEEE80211_RATE_SHORT_PREAMBLE),
67 RATE(60, 0xb, 0, 0),
68 RATE(90, 0xf, 0, 0),
69 RATE(120, 0xa, 0, 0),
70 RATE(180, 0xe, 0, 0),
71 RATE(240, 0x9, 0, 0),
72 RATE(360, 0xd, 1, 0),
73 RATE(480, 0x8, 2, 0),
74 RATE(540, 0xc, 3, 0),
75};
76#undef RATE
77
78#define ar9170_g_ratetable (__ar9170_ratetable + 0)
79#define ar9170_g_ratetable_size 12
80#define ar9170_a_ratetable (__ar9170_ratetable + 4)
81#define ar9170_a_ratetable_size 8
82
83
84
85
86
87#define CHAN(_freq, _idx) { \
88 .center_freq = (_freq), \
89 .hw_value = (_idx), \
90 .max_power = 18, \
91}
92
93static struct ieee80211_channel ar9170_2ghz_chantable[] = {
94 CHAN(2412, 0),
95 CHAN(2417, 1),
96 CHAN(2422, 2),
97 CHAN(2427, 3),
98 CHAN(2432, 4),
99 CHAN(2437, 5),
100 CHAN(2442, 6),
101 CHAN(2447, 7),
102 CHAN(2452, 8),
103 CHAN(2457, 9),
104 CHAN(2462, 10),
105 CHAN(2467, 11),
106 CHAN(2472, 12),
107 CHAN(2484, 13),
108};
109
110static struct ieee80211_channel ar9170_5ghz_chantable[] = {
111 CHAN(4920, 14),
112 CHAN(4940, 15),
113 CHAN(4960, 16),
114 CHAN(4980, 17),
115 CHAN(5040, 18),
116 CHAN(5060, 19),
117 CHAN(5080, 20),
118 CHAN(5180, 21),
119 CHAN(5200, 22),
120 CHAN(5220, 23),
121 CHAN(5240, 24),
122 CHAN(5260, 25),
123 CHAN(5280, 26),
124 CHAN(5300, 27),
125 CHAN(5320, 28),
126 CHAN(5500, 29),
127 CHAN(5520, 30),
128 CHAN(5540, 31),
129 CHAN(5560, 32),
130 CHAN(5580, 33),
131 CHAN(5600, 34),
132 CHAN(5620, 35),
133 CHAN(5640, 36),
134 CHAN(5660, 37),
135 CHAN(5680, 38),
136 CHAN(5700, 39),
137 CHAN(5745, 40),
138 CHAN(5765, 41),
139 CHAN(5785, 42),
140 CHAN(5805, 43),
141 CHAN(5825, 44),
142 CHAN(5170, 45),
143 CHAN(5190, 46),
144 CHAN(5210, 47),
145 CHAN(5230, 48),
146};
147#undef CHAN
148
149#define AR9170_HT_CAP \
150{ \
151 .ht_supported = true, \
152 .cap = IEEE80211_HT_CAP_MAX_AMSDU | \
153 IEEE80211_HT_CAP_SUP_WIDTH_20_40 | \
154 IEEE80211_HT_CAP_SGI_40 | \
155 IEEE80211_HT_CAP_GRN_FLD | \
156 IEEE80211_HT_CAP_DSSSCCK40 | \
157 IEEE80211_HT_CAP_SM_PS, \
158 .ampdu_factor = 3, \
159 .ampdu_density = 6, \
160 .mcs = { \
161 .rx_mask = { 0xff, 0xff, 0, 0, 0x1, 0, 0, 0, 0, 0, }, \
162 .rx_highest = cpu_to_le16(300), \
163 .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
164 }, \
165}
166
167static struct ieee80211_supported_band ar9170_band_2GHz = {
168 .channels = ar9170_2ghz_chantable,
169 .n_channels = ARRAY_SIZE(ar9170_2ghz_chantable),
170 .bitrates = ar9170_g_ratetable,
171 .n_bitrates = ar9170_g_ratetable_size,
172 .ht_cap = AR9170_HT_CAP,
173};
174
175static struct ieee80211_supported_band ar9170_band_5GHz = {
176 .channels = ar9170_5ghz_chantable,
177 .n_channels = ARRAY_SIZE(ar9170_5ghz_chantable),
178 .bitrates = ar9170_a_ratetable,
179 .n_bitrates = ar9170_a_ratetable_size,
180 .ht_cap = AR9170_HT_CAP,
181};
182
183static void ar9170_tx(struct ar9170 *ar);
184static bool ar9170_tx_ampdu(struct ar9170 *ar);
185
186static inline u16 ar9170_get_seq_h(struct ieee80211_hdr *hdr)
187{
188 return le16_to_cpu(hdr->seq_ctrl) >> 4;
189}
190
191static inline u16 ar9170_get_seq(struct sk_buff *skb)
192{
193 struct ar9170_tx_control *txc = (void *) skb->data;
194 return ar9170_get_seq_h((void *) txc->frame_data);
195}
196
197static inline u16 ar9170_get_tid(struct sk_buff *skb)
198{
199 struct ar9170_tx_control *txc = (void *) skb->data;
200 struct ieee80211_hdr *hdr = (void *) txc->frame_data;
201
202 return (ieee80211_get_qos_ctl(hdr))[0] & IEEE80211_QOS_CTL_TID_MASK;
203}
204
205#define GET_NEXT_SEQ(seq) ((seq + 1) & 0x0fff)
206#define GET_NEXT_SEQ_FROM_SKB(skb) (GET_NEXT_SEQ(ar9170_get_seq(skb)))
207
208#if (defined AR9170_QUEUE_DEBUG) || (defined AR9170_TXAGG_DEBUG)
209static void ar9170_print_txheader(struct ar9170 *ar, struct sk_buff *skb)
210{
211 struct ar9170_tx_control *txc = (void *) skb->data;
212 struct ieee80211_tx_info *txinfo = IEEE80211_SKB_CB(skb);
213 struct ar9170_tx_info *arinfo = (void *) txinfo->rate_driver_data;
214 struct ieee80211_hdr *hdr = (void *) txc->frame_data;
215
216 printk(KERN_DEBUG "%s: => FRAME [skb:%p, q:%d, DA:[%pM] flags:%x s:%d "
217 "mac_ctrl:%04x, phy_ctrl:%08x, timeout:[%d ms]]\n",
218 wiphy_name(ar->hw->wiphy), skb, skb_get_queue_mapping(skb),
219 ieee80211_get_DA(hdr), arinfo->flags, ar9170_get_seq_h(hdr),
220 le16_to_cpu(txc->mac_control), le32_to_cpu(txc->phy_control),
221 jiffies_to_msecs(arinfo->timeout - jiffies));
222}
223
224static void __ar9170_dump_txqueue(struct ar9170 *ar,
225 struct sk_buff_head *queue)
226{
227 struct sk_buff *skb;
228 int i = 0;
229
230 printk(KERN_DEBUG "---[ cut here ]---\n");
231 printk(KERN_DEBUG "%s: %d entries in queue.\n",
232 wiphy_name(ar->hw->wiphy), skb_queue_len(queue));
233
234 skb_queue_walk(queue, skb) {
235 printk(KERN_DEBUG "index:%d => \n", i++);
236 ar9170_print_txheader(ar, skb);
237 }
238 if (i != skb_queue_len(queue))
239 printk(KERN_DEBUG "WARNING: queue frame counter "
240 "mismatch %d != %d\n", skb_queue_len(queue), i);
241 printk(KERN_DEBUG "---[ end ]---\n");
242}
243#endif
244
245#ifdef AR9170_QUEUE_DEBUG
246static void ar9170_dump_txqueue(struct ar9170 *ar,
247 struct sk_buff_head *queue)
248{
249 unsigned long flags;
250
251 spin_lock_irqsave(&queue->lock, flags);
252 __ar9170_dump_txqueue(ar, queue);
253 spin_unlock_irqrestore(&queue->lock, flags);
254}
255#endif
256
257#ifdef AR9170_QUEUE_STOP_DEBUG
258static void __ar9170_dump_txstats(struct ar9170 *ar)
259{
260 int i;
261
262 printk(KERN_DEBUG "%s: QoS queue stats\n",
263 wiphy_name(ar->hw->wiphy));
264
265 for (i = 0; i < __AR9170_NUM_TXQ; i++)
266 printk(KERN_DEBUG "%s: queue:%d limit:%d len:%d waitack:%d "
267 " stopped:%d\n", wiphy_name(ar->hw->wiphy), i,
268 ar->tx_stats[i].limit, ar->tx_stats[i].len,
269 skb_queue_len(&ar->tx_status[i]),
270 ieee80211_queue_stopped(ar->hw, i));
271}
272#endif
273
274#ifdef AR9170_TXAGG_DEBUG
275static void ar9170_dump_tx_status_ampdu(struct ar9170 *ar)
276{
277 unsigned long flags;
278
279 spin_lock_irqsave(&ar->tx_status_ampdu.lock, flags);
280 printk(KERN_DEBUG "%s: A-MPDU tx_status queue => \n",
281 wiphy_name(ar->hw->wiphy));
282 __ar9170_dump_txqueue(ar, &ar->tx_status_ampdu);
283 spin_unlock_irqrestore(&ar->tx_status_ampdu.lock, flags);
284}
285
286#endif
287
288
289static void ar9170_recycle_expired(struct ar9170 *ar,
290 struct sk_buff_head *queue,
291 struct sk_buff_head *bin)
292{
293 struct sk_buff *skb, *old = NULL;
294 unsigned long flags;
295
296 spin_lock_irqsave(&queue->lock, flags);
297 while ((skb = skb_peek(queue))) {
298 struct ieee80211_tx_info *txinfo;
299 struct ar9170_tx_info *arinfo;
300
301 txinfo = IEEE80211_SKB_CB(skb);
302 arinfo = (void *) txinfo->rate_driver_data;
303
304 if (time_is_before_jiffies(arinfo->timeout)) {
305#ifdef AR9170_QUEUE_DEBUG
306 printk(KERN_DEBUG "%s: [%ld > %ld] frame expired => "
307 "recycle \n", wiphy_name(ar->hw->wiphy),
308 jiffies, arinfo->timeout);
309 ar9170_print_txheader(ar, skb);
310#endif
311 __skb_unlink(skb, queue);
312 __skb_queue_tail(bin, skb);
313 } else {
314 break;
315 }
316
317 if (unlikely(old == skb)) {
318
319
320 WARN_ON(1);
321 break;
322 }
323 old = skb;
324 }
325 spin_unlock_irqrestore(&queue->lock, flags);
326}
327
328static void ar9170_tx_status(struct ar9170 *ar, struct sk_buff *skb,
329 u16 tx_status)
330{
331 struct ieee80211_tx_info *txinfo;
332 unsigned int retries = 0;
333
334 txinfo = IEEE80211_SKB_CB(skb);
335 ieee80211_tx_info_clear_status(txinfo);
336
337 switch (tx_status) {
338 case AR9170_TX_STATUS_RETRY:
339 retries = 2;
340 case AR9170_TX_STATUS_COMPLETE:
341 txinfo->flags |= IEEE80211_TX_STAT_ACK;
342 break;
343
344 case AR9170_TX_STATUS_FAILED:
345 retries = ar->hw->conf.long_frame_max_tx_count;
346 break;
347
348 default:
349 printk(KERN_ERR "%s: invalid tx_status response (%x).\n",
350 wiphy_name(ar->hw->wiphy), tx_status);
351 break;
352 }
353
354 txinfo->status.rates[0].count = retries + 1;
355 skb_pull(skb, sizeof(struct ar9170_tx_control));
356 ieee80211_tx_status_irqsafe(ar->hw, skb);
357}
358
359static void ar9170_tx_fake_ampdu_status(struct ar9170 *ar)
360{
361 struct sk_buff_head success;
362 struct sk_buff *skb;
363 unsigned int i;
364 unsigned long queue_bitmap = 0;
365
366 skb_queue_head_init(&success);
367
368 while (skb_queue_len(&ar->tx_status_ampdu) > AR9170_NUM_TX_STATUS)
369 __skb_queue_tail(&success, skb_dequeue(&ar->tx_status_ampdu));
370
371 ar9170_recycle_expired(ar, &ar->tx_status_ampdu, &success);
372
373#ifdef AR9170_TXAGG_DEBUG
374 printk(KERN_DEBUG "%s: collected %d A-MPDU frames.\n",
375 wiphy_name(ar->hw->wiphy), skb_queue_len(&success));
376 __ar9170_dump_txqueue(ar, &success);
377#endif
378
379 while ((skb = __skb_dequeue(&success))) {
380 struct ieee80211_tx_info *txinfo;
381
382 queue_bitmap |= BIT(skb_get_queue_mapping(skb));
383
384 txinfo = IEEE80211_SKB_CB(skb);
385 ieee80211_tx_info_clear_status(txinfo);
386
387 txinfo->flags |= IEEE80211_TX_STAT_ACK;
388 txinfo->status.rates[0].count = 1;
389
390 skb_pull(skb, sizeof(struct ar9170_tx_control));
391 ieee80211_tx_status_irqsafe(ar->hw, skb);
392 }
393
394 for_each_bit(i, &queue_bitmap, BITS_PER_BYTE) {
395#ifdef AR9170_QUEUE_STOP_DEBUG
396 printk(KERN_DEBUG "%s: wake queue %d\n",
397 wiphy_name(ar->hw->wiphy), i);
398 __ar9170_dump_txstats(ar);
399#endif
400 ieee80211_wake_queue(ar->hw, i);
401 }
402
403 if (queue_bitmap)
404 ar9170_tx(ar);
405}
406
407static void ar9170_tx_ampdu_callback(struct ar9170 *ar, struct sk_buff *skb)
408{
409 struct ieee80211_tx_info *txinfo = IEEE80211_SKB_CB(skb);
410 struct ar9170_tx_info *arinfo = (void *) txinfo->rate_driver_data;
411
412 arinfo->timeout = jiffies +
413 msecs_to_jiffies(AR9170_BA_TIMEOUT);
414
415 skb_queue_tail(&ar->tx_status_ampdu, skb);
416 ar9170_tx_fake_ampdu_status(ar);
417 ar->tx_ampdu_pending--;
418
419 if (!list_empty(&ar->tx_ampdu_list) && !ar->tx_ampdu_pending)
420 ar9170_tx_ampdu(ar);
421}
422
423void ar9170_tx_callback(struct ar9170 *ar, struct sk_buff *skb)
424{
425 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
426 struct ar9170_tx_info *arinfo = (void *) info->rate_driver_data;
427 unsigned int queue = skb_get_queue_mapping(skb);
428 unsigned long flags;
429
430 spin_lock_irqsave(&ar->tx_stats_lock, flags);
431 ar->tx_stats[queue].len--;
432
433 if (skb_queue_empty(&ar->tx_pending[queue])) {
434#ifdef AR9170_QUEUE_STOP_DEBUG
435 printk(KERN_DEBUG "%s: wake queue %d\n",
436 wiphy_name(ar->hw->wiphy), queue);
437 __ar9170_dump_txstats(ar);
438#endif
439 ieee80211_wake_queue(ar->hw, queue);
440 }
441 spin_unlock_irqrestore(&ar->tx_stats_lock, flags);
442
443 if (arinfo->flags & AR9170_TX_FLAG_BLOCK_ACK) {
444 ar9170_tx_ampdu_callback(ar, skb);
445 } else if (arinfo->flags & AR9170_TX_FLAG_WAIT_FOR_ACK) {
446 arinfo->timeout = jiffies +
447 msecs_to_jiffies(AR9170_TX_TIMEOUT);
448
449 skb_queue_tail(&ar->tx_status[queue], skb);
450 } else if (arinfo->flags & AR9170_TX_FLAG_NO_ACK) {
451 ar9170_tx_status(ar, skb, AR9170_TX_STATUS_FAILED);
452 } else {
453#ifdef AR9170_QUEUE_DEBUG
454 printk(KERN_DEBUG "%s: unsupported frame flags!\n",
455 wiphy_name(ar->hw->wiphy));
456 ar9170_print_txheader(ar, skb);
457#endif
458 dev_kfree_skb_any(skb);
459 }
460
461 if (!ar->tx_stats[queue].len &&
462 !skb_queue_empty(&ar->tx_pending[queue])) {
463 ar9170_tx(ar);
464 }
465}
466
467static struct sk_buff *ar9170_get_queued_skb(struct ar9170 *ar,
468 const u8 *mac,
469 struct sk_buff_head *queue,
470 const u32 rate)
471{
472 unsigned long flags;
473 struct sk_buff *skb;
474
475
476
477
478
479
480
481
482
483
484 spin_lock_irqsave(&queue->lock, flags);
485 skb_queue_walk(queue, skb) {
486 struct ar9170_tx_control *txc = (void *) skb->data;
487 struct ieee80211_hdr *hdr = (void *) txc->frame_data;
488 u32 r;
489
490 if (mac && compare_ether_addr(ieee80211_get_DA(hdr), mac)) {
491#ifdef AR9170_QUEUE_DEBUG
492 printk(KERN_DEBUG "%s: skip frame => DA %pM != %pM\n",
493 wiphy_name(ar->hw->wiphy), mac,
494 ieee80211_get_DA(hdr));
495 ar9170_print_txheader(ar, skb);
496#endif
497 continue;
498 }
499
500 r = (le32_to_cpu(txc->phy_control) & AR9170_TX_PHY_MCS_MASK) >>
501 AR9170_TX_PHY_MCS_SHIFT;
502
503 if ((rate != AR9170_TX_INVALID_RATE) && (r != rate)) {
504#ifdef AR9170_QUEUE_DEBUG
505 printk(KERN_DEBUG "%s: skip frame => rate %d != %d\n",
506 wiphy_name(ar->hw->wiphy), rate, r);
507 ar9170_print_txheader(ar, skb);
508#endif
509 continue;
510 }
511
512 __skb_unlink(skb, queue);
513 spin_unlock_irqrestore(&queue->lock, flags);
514 return skb;
515 }
516
517#ifdef AR9170_QUEUE_DEBUG
518 printk(KERN_ERR "%s: ESS:[%pM] does not have any "
519 "outstanding frames in queue.\n",
520 wiphy_name(ar->hw->wiphy), mac);
521 __ar9170_dump_txqueue(ar, queue);
522#endif
523 spin_unlock_irqrestore(&queue->lock, flags);
524
525 return NULL;
526}
527
528static void ar9170_handle_block_ack(struct ar9170 *ar, u16 count, u16 r)
529{
530 struct sk_buff *skb;
531 struct ieee80211_tx_info *txinfo;
532
533 while (count) {
534 skb = ar9170_get_queued_skb(ar, NULL, &ar->tx_status_ampdu, r);
535 if (!skb)
536 break;
537
538 txinfo = IEEE80211_SKB_CB(skb);
539 ieee80211_tx_info_clear_status(txinfo);
540
541
542 txinfo->status.rates[0].count = 1;
543
544 skb_pull(skb, sizeof(struct ar9170_tx_control));
545 ieee80211_tx_status_irqsafe(ar->hw, skb);
546 count--;
547 }
548
549#ifdef AR9170_TXAGG_DEBUG
550 if (count) {
551 printk(KERN_DEBUG "%s: got %d more failed mpdus, but no more "
552 "suitable frames left in tx_status queue.\n",
553 wiphy_name(ar->hw->wiphy), count);
554
555 ar9170_dump_tx_status_ampdu(ar);
556 }
557#endif
558}
559
560
561
562
563
564
565
566static void ar9170_tx_janitor(struct work_struct *work)
567{
568 struct ar9170 *ar = container_of(work, struct ar9170,
569 tx_janitor.work);
570 struct sk_buff_head waste;
571 unsigned int i;
572 bool resched = false;
573
574 if (unlikely(!IS_STARTED(ar)))
575 return ;
576
577 skb_queue_head_init(&waste);
578
579 for (i = 0; i < __AR9170_NUM_TXQ; i++) {
580#ifdef AR9170_QUEUE_DEBUG
581 printk(KERN_DEBUG "%s: garbage collector scans queue:%d\n",
582 wiphy_name(ar->hw->wiphy), i);
583 ar9170_dump_txqueue(ar, &ar->tx_pending[i]);
584 ar9170_dump_txqueue(ar, &ar->tx_status[i]);
585#endif
586
587 ar9170_recycle_expired(ar, &ar->tx_status[i], &waste);
588 ar9170_recycle_expired(ar, &ar->tx_pending[i], &waste);
589 skb_queue_purge(&waste);
590
591 if (!skb_queue_empty(&ar->tx_status[i]) ||
592 !skb_queue_empty(&ar->tx_pending[i]))
593 resched = true;
594 }
595
596 ar9170_tx_fake_ampdu_status(ar);
597
598 if (!resched)
599 return;
600
601 ieee80211_queue_delayed_work(ar->hw,
602 &ar->tx_janitor,
603 msecs_to_jiffies(AR9170_JANITOR_DELAY));
604}
605
606void ar9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len)
607{
608 struct ar9170_cmd_response *cmd = (void *) buf;
609
610 if ((cmd->type & 0xc0) != 0xc0) {
611 ar->callback_cmd(ar, len, buf);
612 return;
613 }
614
615
616 switch (cmd->type) {
617 case 0xc1: {
618
619
620
621
622
623
624
625
626
627
628
629 struct sk_buff *skb;
630 u32 phy = le32_to_cpu(cmd->tx_status.rate);
631 u32 q = (phy & AR9170_TX_PHY_QOS_MASK) >>
632 AR9170_TX_PHY_QOS_SHIFT;
633#ifdef AR9170_QUEUE_DEBUG
634 printk(KERN_DEBUG "%s: recv tx_status for %pM, p:%08x, q:%d\n",
635 wiphy_name(ar->hw->wiphy), cmd->tx_status.dst, phy, q);
636#endif
637
638 skb = ar9170_get_queued_skb(ar, cmd->tx_status.dst,
639 &ar->tx_status[q],
640 AR9170_TX_INVALID_RATE);
641 if (unlikely(!skb))
642 return ;
643
644 ar9170_tx_status(ar, skb, le16_to_cpu(cmd->tx_status.status));
645 break;
646 }
647
648 case 0xc0:
649
650
651
652 if (ar->vif && ar->vif->type == NL80211_IFTYPE_AP)
653 ieee80211_queue_work(ar->hw, &ar->beacon_work);
654 break;
655
656 case 0xc2:
657
658
659
660
661
662
663
664
665 break;
666
667 case 0xc3:
668
669 break;
670
671 case 0xc4:
672
673 break;
674
675 case 0xc5:
676
677 ar9170_handle_block_ack(ar,
678 le16_to_cpu(cmd->ba_fail_cnt.failed),
679 le16_to_cpu(cmd->ba_fail_cnt.rate));
680 ar9170_tx_fake_ampdu_status(ar);
681 break;
682
683 case 0xc6:
684
685 break;
686
687 case 0xc9:
688
689 break;
690
691
692 case 0xca:
693 printk(KERN_DEBUG "ar9170 FW: %.*s\n", len - 4, (char *)buf + 4);
694 break;
695 case 0xcb:
696 len -= 4;
697
698 switch (len) {
699 case 1:
700 printk(KERN_DEBUG "ar9170 FW: u8: %#.2x\n",
701 *((char *)buf + 4));
702 break;
703 case 2:
704 printk(KERN_DEBUG "ar9170 FW: u8: %#.4x\n",
705 le16_to_cpup((__le16 *)((char *)buf + 4)));
706 break;
707 case 4:
708 printk(KERN_DEBUG "ar9170 FW: u8: %#.8x\n",
709 le32_to_cpup((__le32 *)((char *)buf + 4)));
710 break;
711 case 8:
712 printk(KERN_DEBUG "ar9170 FW: u8: %#.16lx\n",
713 (unsigned long)le64_to_cpup(
714 (__le64 *)((char *)buf + 4)));
715 break;
716 }
717 break;
718 case 0xcc:
719 print_hex_dump_bytes("ar9170 FW:", DUMP_PREFIX_NONE,
720 (char *)buf + 4, len - 4);
721 break;
722
723 default:
724 printk(KERN_INFO "received unhandled event %x\n", cmd->type);
725 print_hex_dump_bytes("dump:", DUMP_PREFIX_NONE, buf, len);
726 break;
727 }
728}
729
730static void ar9170_rx_reset_rx_mpdu(struct ar9170 *ar)
731{
732 memset(&ar->rx_mpdu.plcp, 0, sizeof(struct ar9170_rx_head));
733 ar->rx_mpdu.has_plcp = false;
734}
735
736int ar9170_nag_limiter(struct ar9170 *ar)
737{
738 bool print_message;
739
740
741
742
743
744 if (ar->sniffer_enabled)
745 return false;
746
747
748
749
750
751
752 if (time_before(jiffies, ar->bad_hw_nagger) && net_ratelimit())
753 print_message = true;
754 else
755 print_message = false;
756
757
758 ar->bad_hw_nagger = jiffies + HZ / 4;
759 return print_message;
760}
761
762static int ar9170_rx_mac_status(struct ar9170 *ar,
763 struct ar9170_rx_head *head,
764 struct ar9170_rx_macstatus *mac,
765 struct ieee80211_rx_status *status)
766{
767 u8 error, decrypt;
768
769 BUILD_BUG_ON(sizeof(struct ar9170_rx_head) != 12);
770 BUILD_BUG_ON(sizeof(struct ar9170_rx_macstatus) != 4);
771
772 error = mac->error;
773 if (error & AR9170_RX_ERROR_MMIC) {
774 status->flag |= RX_FLAG_MMIC_ERROR;
775 error &= ~AR9170_RX_ERROR_MMIC;
776 }
777
778 if (error & AR9170_RX_ERROR_PLCP) {
779 status->flag |= RX_FLAG_FAILED_PLCP_CRC;
780 error &= ~AR9170_RX_ERROR_PLCP;
781
782 if (!(ar->filter_state & FIF_PLCPFAIL))
783 return -EINVAL;
784 }
785
786 if (error & AR9170_RX_ERROR_FCS) {
787 status->flag |= RX_FLAG_FAILED_FCS_CRC;
788 error &= ~AR9170_RX_ERROR_FCS;
789
790 if (!(ar->filter_state & FIF_FCSFAIL))
791 return -EINVAL;
792 }
793
794 decrypt = ar9170_get_decrypt_type(mac);
795 if (!(decrypt & AR9170_RX_ENC_SOFTWARE) &&
796 decrypt != AR9170_ENC_ALG_NONE)
797 status->flag |= RX_FLAG_DECRYPTED;
798
799
800 error &= ~AR9170_RX_ERROR_WRONG_RA;
801
802 if (error & AR9170_RX_ERROR_DECRYPT) {
803 error &= ~AR9170_RX_ERROR_DECRYPT;
804
805
806
807
808
809 return -EINVAL;
810 }
811
812
813 if (unlikely(error)) {
814
815
816 if (ar9170_nag_limiter(ar))
817 printk(KERN_DEBUG "%s: received frame with "
818 "suspicious error code (%#x).\n",
819 wiphy_name(ar->hw->wiphy), error);
820
821 return -EINVAL;
822 }
823
824 status->band = ar->channel->band;
825 status->freq = ar->channel->center_freq;
826
827 switch (mac->status & AR9170_RX_STATUS_MODULATION_MASK) {
828 case AR9170_RX_STATUS_MODULATION_CCK:
829 if (mac->status & AR9170_RX_STATUS_SHORT_PREAMBLE)
830 status->flag |= RX_FLAG_SHORTPRE;
831 switch (head->plcp[0]) {
832 case 0x0a:
833 status->rate_idx = 0;
834 break;
835 case 0x14:
836 status->rate_idx = 1;
837 break;
838 case 0x37:
839 status->rate_idx = 2;
840 break;
841 case 0x6e:
842 status->rate_idx = 3;
843 break;
844 default:
845 if (ar9170_nag_limiter(ar))
846 printk(KERN_ERR "%s: invalid plcp cck rate "
847 "(%x).\n", wiphy_name(ar->hw->wiphy),
848 head->plcp[0]);
849 return -EINVAL;
850 }
851 break;
852
853 case AR9170_RX_STATUS_MODULATION_OFDM:
854 switch (head->plcp[0] & 0xf) {
855 case 0xb:
856 status->rate_idx = 0;
857 break;
858 case 0xf:
859 status->rate_idx = 1;
860 break;
861 case 0xa:
862 status->rate_idx = 2;
863 break;
864 case 0xe:
865 status->rate_idx = 3;
866 break;
867 case 0x9:
868 status->rate_idx = 4;
869 break;
870 case 0xd:
871 status->rate_idx = 5;
872 break;
873 case 0x8:
874 status->rate_idx = 6;
875 break;
876 case 0xc:
877 status->rate_idx = 7;
878 break;
879 default:
880 if (ar9170_nag_limiter(ar))
881 printk(KERN_ERR "%s: invalid plcp ofdm rate "
882 "(%x).\n", wiphy_name(ar->hw->wiphy),
883 head->plcp[0]);
884 return -EINVAL;
885 }
886 if (status->band == IEEE80211_BAND_2GHZ)
887 status->rate_idx += 4;
888 break;
889
890 case AR9170_RX_STATUS_MODULATION_HT:
891 if (head->plcp[3] & 0x80)
892 status->flag |= RX_FLAG_40MHZ;
893 if (head->plcp[6] & 0x80)
894 status->flag |= RX_FLAG_SHORT_GI;
895
896 status->rate_idx = clamp(0, 75, head->plcp[6] & 0x7f);
897 status->flag |= RX_FLAG_HT;
898 break;
899
900 case AR9170_RX_STATUS_MODULATION_DUPOFDM:
901
902 if (ar9170_nag_limiter(ar))
903 printk(KERN_ERR "%s: invalid modulation\n",
904 wiphy_name(ar->hw->wiphy));
905 return -EINVAL;
906 }
907
908 return 0;
909}
910
911static void ar9170_rx_phy_status(struct ar9170 *ar,
912 struct ar9170_rx_phystatus *phy,
913 struct ieee80211_rx_status *status)
914{
915 int i;
916
917 BUILD_BUG_ON(sizeof(struct ar9170_rx_phystatus) != 20);
918
919 for (i = 0; i < 3; i++)
920 if (phy->rssi[i] != 0x80)
921 status->antenna |= BIT(i);
922
923
924 for (i = 0; i < 7; i++)
925 if (phy->rssi[i] & 0x80)
926 phy->rssi[i] = ((phy->rssi[i] & 0x7f) + 1) & 0x7f;
927
928
929 status->signal = ar->noise[0] + phy->rssi_combined;
930 status->noise = ar->noise[0];
931}
932
933static struct sk_buff *ar9170_rx_copy_data(u8 *buf, int len)
934{
935 struct sk_buff *skb;
936 int reserved = 0;
937 struct ieee80211_hdr *hdr = (void *) buf;
938
939 if (ieee80211_is_data_qos(hdr->frame_control)) {
940 u8 *qc = ieee80211_get_qos_ctl(hdr);
941 reserved += NET_IP_ALIGN;
942
943 if (*qc & IEEE80211_QOS_CONTROL_A_MSDU_PRESENT)
944 reserved += NET_IP_ALIGN;
945 }
946
947 if (ieee80211_has_a4(hdr->frame_control))
948 reserved += NET_IP_ALIGN;
949
950 reserved = 32 + (reserved & NET_IP_ALIGN);
951
952 skb = dev_alloc_skb(len + reserved);
953 if (likely(skb)) {
954 skb_reserve(skb, reserved);
955 memcpy(skb_put(skb, len), buf, len);
956 }
957
958 return skb;
959}
960
961
962
963
964
965
966
967
968
969
970
971static void ar9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len)
972{
973 struct ar9170_rx_head *head;
974 struct ar9170_rx_macstatus *mac;
975 struct ar9170_rx_phystatus *phy = NULL;
976 struct ieee80211_rx_status status;
977 struct sk_buff *skb;
978 int mpdu_len;
979
980 if (unlikely(!IS_STARTED(ar) || len < (sizeof(*mac))))
981 return ;
982
983
984 mpdu_len = len - sizeof(*mac);
985
986 mac = (void *)(buf + mpdu_len);
987 if (unlikely(mac->error & AR9170_RX_ERROR_FATAL)) {
988
989
990 return ;
991 }
992
993 switch (mac->status & AR9170_RX_STATUS_MPDU_MASK) {
994 case AR9170_RX_STATUS_MPDU_FIRST:
995
996 if (likely(mpdu_len >= sizeof(struct ar9170_rx_head))) {
997 head = (void *) buf;
998 memcpy(&ar->rx_mpdu.plcp, (void *) buf,
999 sizeof(struct ar9170_rx_head));
1000
1001 mpdu_len -= sizeof(struct ar9170_rx_head);
1002 buf += sizeof(struct ar9170_rx_head);
1003 ar->rx_mpdu.has_plcp = true;
1004 } else {
1005 if (ar9170_nag_limiter(ar))
1006 printk(KERN_ERR "%s: plcp info is clipped.\n",
1007 wiphy_name(ar->hw->wiphy));
1008 return ;
1009 }
1010 break;
1011
1012 case AR9170_RX_STATUS_MPDU_LAST:
1013
1014
1015 if (likely(mpdu_len >= sizeof(struct ar9170_rx_phystatus))) {
1016 mpdu_len -= sizeof(struct ar9170_rx_phystatus);
1017 phy = (void *)(buf + mpdu_len);
1018 } else {
1019 if (ar9170_nag_limiter(ar))
1020 printk(KERN_ERR "%s: frame tail is clipped.\n",
1021 wiphy_name(ar->hw->wiphy));
1022 return ;
1023 }
1024
1025 case AR9170_RX_STATUS_MPDU_MIDDLE:
1026
1027 if (unlikely(!ar->rx_mpdu.has_plcp)) {
1028 if (!ar9170_nag_limiter(ar))
1029 return ;
1030
1031 printk(KERN_ERR "%s: rx stream did not start "
1032 "with a first_mpdu frame tag.\n",
1033 wiphy_name(ar->hw->wiphy));
1034
1035 return ;
1036 }
1037
1038 head = &ar->rx_mpdu.plcp;
1039 break;
1040
1041 case AR9170_RX_STATUS_MPDU_SINGLE:
1042
1043 head = (void *) buf;
1044
1045 mpdu_len -= sizeof(struct ar9170_rx_head);
1046 mpdu_len -= sizeof(struct ar9170_rx_phystatus);
1047
1048 buf += sizeof(struct ar9170_rx_head);
1049 phy = (void *)(buf + mpdu_len);
1050 break;
1051
1052 default:
1053 BUG_ON(1);
1054 break;
1055 }
1056
1057 if (unlikely(mpdu_len < FCS_LEN))
1058 return ;
1059
1060 memset(&status, 0, sizeof(status));
1061 if (unlikely(ar9170_rx_mac_status(ar, head, mac, &status)))
1062 return ;
1063
1064 if (phy)
1065 ar9170_rx_phy_status(ar, phy, &status);
1066
1067 skb = ar9170_rx_copy_data(buf, mpdu_len);
1068 if (likely(skb)) {
1069 memcpy(IEEE80211_SKB_RXCB(skb), &status, sizeof(status));
1070 ieee80211_rx_irqsafe(ar->hw, skb);
1071 }
1072}
1073
1074void ar9170_rx(struct ar9170 *ar, struct sk_buff *skb)
1075{
1076 unsigned int i, tlen, resplen, wlen = 0, clen = 0;
1077 u8 *tbuf, *respbuf;
1078
1079 tbuf = skb->data;
1080 tlen = skb->len;
1081
1082 while (tlen >= 4) {
1083 clen = tbuf[1] << 8 | tbuf[0];
1084 wlen = ALIGN(clen, 4);
1085
1086
1087 if (tbuf[2] != 0 || tbuf[3] != 0x4e) {
1088
1089
1090
1091
1092
1093
1094 if (!ar->rx_failover_missing) {
1095
1096 if (ar9170_nag_limiter(ar)) {
1097 printk(KERN_ERR "%s: missing tag!\n",
1098 wiphy_name(ar->hw->wiphy));
1099 goto err_telluser;
1100 } else
1101 goto err_silent;
1102 }
1103
1104 if (ar->rx_failover_missing > tlen) {
1105 if (ar9170_nag_limiter(ar)) {
1106 printk(KERN_ERR "%s: possible multi "
1107 "stream corruption!\n",
1108 wiphy_name(ar->hw->wiphy));
1109 goto err_telluser;
1110 } else
1111 goto err_silent;
1112 }
1113
1114 memcpy(skb_put(ar->rx_failover, tlen), tbuf, tlen);
1115 ar->rx_failover_missing -= tlen;
1116
1117 if (ar->rx_failover_missing <= 0) {
1118
1119
1120
1121
1122
1123
1124
1125 ar->rx_failover_missing = 0;
1126 ar9170_rx(ar, ar->rx_failover);
1127
1128 skb_reset_tail_pointer(ar->rx_failover);
1129 skb_trim(ar->rx_failover, 0);
1130 }
1131
1132 return ;
1133 }
1134
1135
1136 if (wlen > tlen - 4) {
1137 if (ar->rx_failover_missing) {
1138
1139 if (ar9170_nag_limiter(ar)) {
1140 printk(KERN_ERR "%s: double rx stream "
1141 "corruption!\n",
1142 wiphy_name(ar->hw->wiphy));
1143 goto err_telluser;
1144 } else
1145 goto err_silent;
1146 }
1147
1148
1149
1150
1151
1152
1153
1154 memcpy(skb_put(ar->rx_failover, tlen), tbuf, tlen);
1155 ar->rx_failover_missing = clen - tlen;
1156 return ;
1157 }
1158 resplen = clen;
1159 respbuf = tbuf + 4;
1160 tbuf += wlen + 4;
1161 tlen -= wlen + 4;
1162
1163 i = 0;
1164
1165
1166 while (resplen > 2 && i < 12 &&
1167 respbuf[0] == 0xff && respbuf[1] == 0xff) {
1168 i += 2;
1169 resplen -= 2;
1170 respbuf += 2;
1171 }
1172
1173 if (resplen < 4)
1174 continue;
1175
1176
1177 if (i == 12)
1178 ar9170_handle_command_response(ar, respbuf, resplen);
1179 else
1180 ar9170_handle_mpdu(ar, respbuf, clen);
1181 }
1182
1183 if (tlen) {
1184 if (net_ratelimit())
1185 printk(KERN_ERR "%s: %d bytes of unprocessed "
1186 "data left in rx stream!\n",
1187 wiphy_name(ar->hw->wiphy), tlen);
1188
1189 goto err_telluser;
1190 }
1191
1192 return ;
1193
1194err_telluser:
1195 printk(KERN_ERR "%s: damaged RX stream data [want:%d, "
1196 "data:%d, rx:%d, pending:%d ]\n",
1197 wiphy_name(ar->hw->wiphy), clen, wlen, tlen,
1198 ar->rx_failover_missing);
1199
1200 if (ar->rx_failover_missing)
1201 print_hex_dump_bytes("rxbuf:", DUMP_PREFIX_OFFSET,
1202 ar->rx_failover->data,
1203 ar->rx_failover->len);
1204
1205 print_hex_dump_bytes("stream:", DUMP_PREFIX_OFFSET,
1206 skb->data, skb->len);
1207
1208 printk(KERN_ERR "%s: please check your hardware and cables, if "
1209 "you see this message frequently.\n",
1210 wiphy_name(ar->hw->wiphy));
1211
1212err_silent:
1213 if (ar->rx_failover_missing) {
1214 skb_reset_tail_pointer(ar->rx_failover);
1215 skb_trim(ar->rx_failover, 0);
1216 ar->rx_failover_missing = 0;
1217 }
1218}
1219
1220#define AR9170_FILL_QUEUE(queue, ai_fs, cwmin, cwmax, _txop) \
1221do { \
1222 queue.aifs = ai_fs; \
1223 queue.cw_min = cwmin; \
1224 queue.cw_max = cwmax; \
1225 queue.txop = _txop; \
1226} while (0)
1227
1228static int ar9170_op_start(struct ieee80211_hw *hw)
1229{
1230 struct ar9170 *ar = hw->priv;
1231 int err, i;
1232
1233 mutex_lock(&ar->mutex);
1234
1235
1236 memset(&ar->tx_stats, 0, sizeof(ar->tx_stats));
1237 for (i = 0; i < __AR9170_NUM_TXQ; i++)
1238 ar->tx_stats[i].limit = AR9170_TXQ_DEPTH;
1239
1240
1241 AR9170_FILL_QUEUE(ar->edcf[0], 3, 15, 1023, 0);
1242 AR9170_FILL_QUEUE(ar->edcf[1], 7, 15, 1023, 0);
1243 AR9170_FILL_QUEUE(ar->edcf[2], 2, 7, 15, 94);
1244 AR9170_FILL_QUEUE(ar->edcf[3], 2, 3, 7, 47);
1245 AR9170_FILL_QUEUE(ar->edcf[4], 2, 3, 7, 0);
1246
1247
1248 ar->global_ampdu_density = 6;
1249 ar->global_ampdu_factor = 3;
1250
1251 ar->bad_hw_nagger = jiffies;
1252
1253 err = ar->open(ar);
1254 if (err)
1255 goto out;
1256
1257 err = ar9170_init_mac(ar);
1258 if (err)
1259 goto out;
1260
1261 err = ar9170_set_qos(ar);
1262 if (err)
1263 goto out;
1264
1265 err = ar9170_init_phy(ar, IEEE80211_BAND_2GHZ);
1266 if (err)
1267 goto out;
1268
1269 err = ar9170_init_rf(ar);
1270 if (err)
1271 goto out;
1272
1273
1274 err = ar9170_write_reg(ar, 0x1c3d30, 0x100);
1275 if (err)
1276 goto out;
1277
1278 ar->state = AR9170_STARTED;
1279
1280out:
1281 mutex_unlock(&ar->mutex);
1282 return err;
1283}
1284
1285static void ar9170_op_stop(struct ieee80211_hw *hw)
1286{
1287 struct ar9170 *ar = hw->priv;
1288 unsigned int i;
1289
1290 if (IS_STARTED(ar))
1291 ar->state = AR9170_IDLE;
1292
1293 cancel_delayed_work_sync(&ar->tx_janitor);
1294#ifdef CONFIG_AR9170_LEDS
1295 cancel_delayed_work_sync(&ar->led_work);
1296#endif
1297 cancel_work_sync(&ar->beacon_work);
1298
1299 mutex_lock(&ar->mutex);
1300
1301 if (IS_ACCEPTING_CMD(ar)) {
1302 ar9170_set_leds_state(ar, 0);
1303
1304
1305 ar9170_write_reg(ar, 0x1c3d30, 0);
1306 ar->stop(ar);
1307 }
1308
1309 for (i = 0; i < __AR9170_NUM_TXQ; i++) {
1310 skb_queue_purge(&ar->tx_pending[i]);
1311 skb_queue_purge(&ar->tx_status[i]);
1312 }
1313 skb_queue_purge(&ar->tx_status_ampdu);
1314
1315 mutex_unlock(&ar->mutex);
1316}
1317
1318static void ar9170_tx_indicate_immba(struct ar9170 *ar, struct sk_buff *skb)
1319{
1320 struct ar9170_tx_control *txc = (void *) skb->data;
1321
1322 txc->mac_control |= cpu_to_le16(AR9170_TX_MAC_IMM_AMPDU);
1323}
1324
1325static void ar9170_tx_copy_phy(struct ar9170 *ar, struct sk_buff *dst,
1326 struct sk_buff *src)
1327{
1328 struct ar9170_tx_control *dst_txc, *src_txc;
1329 struct ieee80211_tx_info *dst_info, *src_info;
1330 struct ar9170_tx_info *dst_arinfo, *src_arinfo;
1331
1332 src_txc = (void *) src->data;
1333 src_info = IEEE80211_SKB_CB(src);
1334 src_arinfo = (void *) src_info->rate_driver_data;
1335
1336 dst_txc = (void *) dst->data;
1337 dst_info = IEEE80211_SKB_CB(dst);
1338 dst_arinfo = (void *) dst_info->rate_driver_data;
1339
1340 dst_txc->phy_control = src_txc->phy_control;
1341
1342
1343 memcpy(dst_info->driver_rates, src_info->driver_rates,
1344 sizeof(dst_info->driver_rates));
1345}
1346
1347static int ar9170_tx_prepare(struct ar9170 *ar, struct sk_buff *skb)
1348{
1349 struct ieee80211_hdr *hdr;
1350 struct ar9170_tx_control *txc;
1351 struct ieee80211_tx_info *info;
1352 struct ieee80211_tx_rate *txrate;
1353 struct ar9170_tx_info *arinfo;
1354 unsigned int queue = skb_get_queue_mapping(skb);
1355 u16 keytype = 0;
1356 u16 len, icv = 0;
1357
1358 BUILD_BUG_ON(sizeof(*arinfo) > sizeof(info->rate_driver_data));
1359
1360 hdr = (void *)skb->data;
1361 info = IEEE80211_SKB_CB(skb);
1362 len = skb->len;
1363
1364 txc = (void *)skb_push(skb, sizeof(*txc));
1365
1366 if (info->control.hw_key) {
1367 icv = info->control.hw_key->icv_len;
1368
1369 switch (info->control.hw_key->alg) {
1370 case ALG_WEP:
1371 keytype = AR9170_TX_MAC_ENCR_RC4;
1372 break;
1373 case ALG_TKIP:
1374 keytype = AR9170_TX_MAC_ENCR_RC4;
1375 break;
1376 case ALG_CCMP:
1377 keytype = AR9170_TX_MAC_ENCR_AES;
1378 break;
1379 default:
1380 WARN_ON(1);
1381 goto err_out;
1382 }
1383 }
1384
1385
1386 txc->length = cpu_to_le16(len + icv + 4);
1387
1388 txc->mac_control = cpu_to_le16(AR9170_TX_MAC_HW_DURATION |
1389 AR9170_TX_MAC_BACKOFF);
1390 txc->mac_control |= cpu_to_le16(ar9170_qos_hwmap[queue] <<
1391 AR9170_TX_MAC_QOS_SHIFT);
1392 txc->mac_control |= cpu_to_le16(keytype);
1393 txc->phy_control = cpu_to_le32(0);
1394
1395 if (info->flags & IEEE80211_TX_CTL_NO_ACK)
1396 txc->mac_control |= cpu_to_le16(AR9170_TX_MAC_NO_ACK);
1397
1398 txrate = &info->control.rates[0];
1399 if (txrate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
1400 txc->mac_control |= cpu_to_le16(AR9170_TX_MAC_PROT_CTS);
1401 else if (txrate->flags & IEEE80211_TX_RC_USE_RTS_CTS)
1402 txc->mac_control |= cpu_to_le16(AR9170_TX_MAC_PROT_RTS);
1403
1404 arinfo = (void *)info->rate_driver_data;
1405 arinfo->timeout = jiffies + msecs_to_jiffies(AR9170_QUEUE_TIMEOUT);
1406
1407 if (!(info->flags & IEEE80211_TX_CTL_NO_ACK) &&
1408 (is_valid_ether_addr(ieee80211_get_DA(hdr)))) {
1409 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
1410 if (unlikely(!info->control.sta))
1411 goto err_out;
1412
1413 txc->mac_control |= cpu_to_le16(AR9170_TX_MAC_AGGR);
1414 arinfo->flags = AR9170_TX_FLAG_BLOCK_ACK;
1415
1416 goto out;
1417 }
1418
1419 txc->mac_control |= cpu_to_le16(AR9170_TX_MAC_RATE_PROBE);
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431 txc->phy_control |=
1432 cpu_to_le32(queue << AR9170_TX_PHY_QOS_SHIFT);
1433 arinfo->flags = AR9170_TX_FLAG_WAIT_FOR_ACK;
1434 } else {
1435 arinfo->flags = AR9170_TX_FLAG_NO_ACK;
1436 }
1437
1438out:
1439 return 0;
1440
1441err_out:
1442 skb_pull(skb, sizeof(*txc));
1443 return -EINVAL;
1444}
1445
1446static void ar9170_tx_prepare_phy(struct ar9170 *ar, struct sk_buff *skb)
1447{
1448 struct ar9170_tx_control *txc;
1449 struct ieee80211_tx_info *info;
1450 struct ieee80211_rate *rate = NULL;
1451 struct ieee80211_tx_rate *txrate;
1452 u32 power, chains;
1453
1454 txc = (void *) skb->data;
1455 info = IEEE80211_SKB_CB(skb);
1456 txrate = &info->control.rates[0];
1457
1458 if (txrate->flags & IEEE80211_TX_RC_GREEN_FIELD)
1459 txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_GREENFIELD);
1460
1461 if (txrate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
1462 txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_SHORT_PREAMBLE);
1463
1464 if (txrate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
1465 txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_BW_40MHZ);
1466
1467 if (txrate->flags & IEEE80211_TX_RC_DUP_DATA)
1468 txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_BW_40MHZ_DUP);
1469
1470 if (txrate->flags & IEEE80211_TX_RC_SHORT_GI)
1471 txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_SHORT_GI);
1472
1473 if (txrate->flags & IEEE80211_TX_RC_MCS) {
1474 u32 r = txrate->idx;
1475 u8 *txpower;
1476
1477
1478 txc->phy_control |= cpu_to_le32((r & 0x7) << 7);
1479
1480 r <<= AR9170_TX_PHY_MCS_SHIFT;
1481 BUG_ON(r & ~AR9170_TX_PHY_MCS_MASK);
1482
1483 txc->phy_control |= cpu_to_le32(r & AR9170_TX_PHY_MCS_MASK);
1484 txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_MOD_HT);
1485
1486 if (txrate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH) {
1487 if (info->band == IEEE80211_BAND_5GHZ)
1488 txpower = ar->power_5G_ht40;
1489 else
1490 txpower = ar->power_2G_ht40;
1491 } else {
1492 if (info->band == IEEE80211_BAND_5GHZ)
1493 txpower = ar->power_5G_ht20;
1494 else
1495 txpower = ar->power_2G_ht20;
1496 }
1497
1498 power = txpower[(txrate->idx) & 7];
1499 } else {
1500 u8 *txpower;
1501 u32 mod;
1502 u32 phyrate;
1503 u8 idx = txrate->idx;
1504
1505 if (info->band != IEEE80211_BAND_2GHZ) {
1506 idx += 4;
1507 txpower = ar->power_5G_leg;
1508 mod = AR9170_TX_PHY_MOD_OFDM;
1509 } else {
1510 if (idx < 4) {
1511 txpower = ar->power_2G_cck;
1512 mod = AR9170_TX_PHY_MOD_CCK;
1513 } else {
1514 mod = AR9170_TX_PHY_MOD_OFDM;
1515 txpower = ar->power_2G_ofdm;
1516 }
1517 }
1518
1519 rate = &__ar9170_ratetable[idx];
1520
1521 phyrate = rate->hw_value & 0xF;
1522 power = txpower[(rate->hw_value & 0x30) >> 4];
1523 phyrate <<= AR9170_TX_PHY_MCS_SHIFT;
1524
1525 txc->phy_control |= cpu_to_le32(mod);
1526 txc->phy_control |= cpu_to_le32(phyrate);
1527 }
1528
1529 power <<= AR9170_TX_PHY_TX_PWR_SHIFT;
1530 power &= AR9170_TX_PHY_TX_PWR_MASK;
1531 txc->phy_control |= cpu_to_le32(power);
1532
1533
1534 if (ar->eeprom.tx_mask == 1) {
1535 chains = AR9170_TX_PHY_TXCHAIN_1;
1536 } else {
1537 chains = AR9170_TX_PHY_TXCHAIN_2;
1538
1539
1540 if (rate && rate->bitrate >= 360)
1541 chains = AR9170_TX_PHY_TXCHAIN_1;
1542 }
1543 txc->phy_control |= cpu_to_le32(chains << AR9170_TX_PHY_TXCHAIN_SHIFT);
1544}
1545
1546static bool ar9170_tx_ampdu(struct ar9170 *ar)
1547{
1548 struct sk_buff_head agg;
1549 struct ar9170_sta_tid *tid_info = NULL, *tmp;
1550 struct sk_buff *skb, *first = NULL;
1551 unsigned long flags, f2;
1552 unsigned int i = 0;
1553 u16 seq, queue, tmpssn;
1554 bool run = false;
1555
1556 skb_queue_head_init(&agg);
1557
1558 spin_lock_irqsave(&ar->tx_ampdu_list_lock, flags);
1559 if (list_empty(&ar->tx_ampdu_list)) {
1560#ifdef AR9170_TXAGG_DEBUG
1561 printk(KERN_DEBUG "%s: aggregation list is empty.\n",
1562 wiphy_name(ar->hw->wiphy));
1563#endif
1564 goto out_unlock;
1565 }
1566
1567 list_for_each_entry_safe(tid_info, tmp, &ar->tx_ampdu_list, list) {
1568 if (tid_info->state != AR9170_TID_STATE_COMPLETE) {
1569#ifdef AR9170_TXAGG_DEBUG
1570 printk(KERN_DEBUG "%s: dangling aggregation entry!\n",
1571 wiphy_name(ar->hw->wiphy));
1572#endif
1573 continue;
1574 }
1575
1576 if (++i > 64) {
1577#ifdef AR9170_TXAGG_DEBUG
1578 printk(KERN_DEBUG "%s: enough frames aggregated.\n",
1579 wiphy_name(ar->hw->wiphy));
1580#endif
1581 break;
1582 }
1583
1584 queue = TID_TO_WME_AC(tid_info->tid);
1585
1586 if (skb_queue_len(&ar->tx_pending[queue]) >=
1587 AR9170_NUM_TX_AGG_MAX) {
1588#ifdef AR9170_TXAGG_DEBUG
1589 printk(KERN_DEBUG "%s: queue %d full.\n",
1590 wiphy_name(ar->hw->wiphy), queue);
1591#endif
1592 continue;
1593 }
1594
1595 list_del_init(&tid_info->list);
1596
1597 spin_lock_irqsave(&tid_info->queue.lock, f2);
1598 tmpssn = seq = tid_info->ssn;
1599 first = skb_peek(&tid_info->queue);
1600
1601 if (likely(first))
1602 tmpssn = ar9170_get_seq(first);
1603
1604 if (unlikely(tmpssn != seq)) {
1605#ifdef AR9170_TXAGG_DEBUG
1606 printk(KERN_DEBUG "%s: ssn mismatch [%d != %d]\n.",
1607 wiphy_name(ar->hw->wiphy), seq, tmpssn);
1608#endif
1609 tid_info->ssn = tmpssn;
1610 }
1611
1612#ifdef AR9170_TXAGG_DEBUG
1613 printk(KERN_DEBUG "%s: generate A-MPDU for tid:%d ssn:%d with "
1614 "%d queued frames.\n", wiphy_name(ar->hw->wiphy),
1615 tid_info->tid, tid_info->ssn,
1616 skb_queue_len(&tid_info->queue));
1617 __ar9170_dump_txqueue(ar, &tid_info->queue);
1618#endif
1619
1620 while ((skb = skb_peek(&tid_info->queue))) {
1621 if (unlikely(ar9170_get_seq(skb) != seq))
1622 break;
1623
1624 __skb_unlink(skb, &tid_info->queue);
1625 tid_info->ssn = seq = GET_NEXT_SEQ(seq);
1626
1627 if (unlikely(skb_get_queue_mapping(skb) != queue)) {
1628#ifdef AR9170_TXAGG_DEBUG
1629 printk(KERN_DEBUG "%s: tid:%d(q:%d) queue:%d "
1630 "!match.\n", wiphy_name(ar->hw->wiphy),
1631 tid_info->tid,
1632 TID_TO_WME_AC(tid_info->tid),
1633 skb_get_queue_mapping(skb));
1634#endif
1635 dev_kfree_skb_any(skb);
1636 continue;
1637 }
1638
1639 if (unlikely(first == skb)) {
1640 ar9170_tx_prepare_phy(ar, skb);
1641 __skb_queue_tail(&agg, skb);
1642 first = skb;
1643 } else {
1644 ar9170_tx_copy_phy(ar, skb, first);
1645 __skb_queue_tail(&agg, skb);
1646 }
1647
1648 if (unlikely(skb_queue_len(&agg) ==
1649 AR9170_NUM_TX_AGG_MAX))
1650 break;
1651 }
1652
1653 if (skb_queue_empty(&tid_info->queue))
1654 tid_info->active = false;
1655 else
1656 list_add_tail(&tid_info->list,
1657 &ar->tx_ampdu_list);
1658
1659 spin_unlock_irqrestore(&tid_info->queue.lock, f2);
1660
1661 if (unlikely(skb_queue_empty(&agg))) {
1662#ifdef AR9170_TXAGG_DEBUG
1663 printk(KERN_DEBUG "%s: queued empty list!\n",
1664 wiphy_name(ar->hw->wiphy));
1665#endif
1666 continue;
1667 }
1668
1669
1670
1671
1672
1673 if (likely(skb_peek_tail(&agg)))
1674 ar9170_tx_indicate_immba(ar, skb_peek_tail(&agg));
1675
1676#ifdef AR9170_TXAGG_DEBUG
1677 printk(KERN_DEBUG "%s: generated A-MPDU looks like this:\n",
1678 wiphy_name(ar->hw->wiphy));
1679 __ar9170_dump_txqueue(ar, &agg);
1680#endif
1681
1682 spin_unlock_irqrestore(&ar->tx_ampdu_list_lock, flags);
1683
1684 spin_lock_irqsave(&ar->tx_pending[queue].lock, flags);
1685 skb_queue_splice_tail_init(&agg, &ar->tx_pending[queue]);
1686 spin_unlock_irqrestore(&ar->tx_pending[queue].lock, flags);
1687 run = true;
1688
1689 spin_lock_irqsave(&ar->tx_ampdu_list_lock, flags);
1690 }
1691
1692out_unlock:
1693 spin_unlock_irqrestore(&ar->tx_ampdu_list_lock, flags);
1694 __skb_queue_purge(&agg);
1695
1696 return run;
1697}
1698
1699static void ar9170_tx(struct ar9170 *ar)
1700{
1701 struct sk_buff *skb;
1702 unsigned long flags;
1703 struct ieee80211_tx_info *info;
1704 struct ar9170_tx_info *arinfo;
1705 unsigned int i, frames, frames_failed, remaining_space;
1706 int err;
1707 bool schedule_garbagecollector = false;
1708
1709 BUILD_BUG_ON(sizeof(*arinfo) > sizeof(info->rate_driver_data));
1710
1711 if (unlikely(!IS_STARTED(ar)))
1712 return ;
1713
1714 remaining_space = AR9170_TX_MAX_PENDING;
1715
1716 for (i = 0; i < __AR9170_NUM_TXQ; i++) {
1717 spin_lock_irqsave(&ar->tx_stats_lock, flags);
1718 if (ar->tx_stats[i].len >= ar->tx_stats[i].limit) {
1719#ifdef AR9170_QUEUE_DEBUG
1720 printk(KERN_DEBUG "%s: queue %d full\n",
1721 wiphy_name(ar->hw->wiphy), i);
1722
1723 printk(KERN_DEBUG "%s: stuck frames: ===> \n",
1724 wiphy_name(ar->hw->wiphy));
1725 ar9170_dump_txqueue(ar, &ar->tx_pending[i]);
1726 ar9170_dump_txqueue(ar, &ar->tx_status[i]);
1727#endif
1728
1729#ifdef AR9170_QUEUE_STOP_DEBUG
1730 printk(KERN_DEBUG "%s: stop queue %d\n",
1731 wiphy_name(ar->hw->wiphy), i);
1732 __ar9170_dump_txstats(ar);
1733#endif
1734 ieee80211_stop_queue(ar->hw, i);
1735 spin_unlock_irqrestore(&ar->tx_stats_lock, flags);
1736 continue;
1737 }
1738
1739 frames = min(ar->tx_stats[i].limit - ar->tx_stats[i].len,
1740 skb_queue_len(&ar->tx_pending[i]));
1741
1742 if (remaining_space < frames) {
1743#ifdef AR9170_QUEUE_DEBUG
1744 printk(KERN_DEBUG "%s: tx quota reached queue:%d, "
1745 "remaining slots:%d, needed:%d\n",
1746 wiphy_name(ar->hw->wiphy), i, remaining_space,
1747 frames);
1748#endif
1749 frames = remaining_space;
1750 }
1751
1752 ar->tx_stats[i].len += frames;
1753 ar->tx_stats[i].count += frames;
1754 spin_unlock_irqrestore(&ar->tx_stats_lock, flags);
1755
1756 if (!frames)
1757 continue;
1758
1759 frames_failed = 0;
1760 while (frames) {
1761 skb = skb_dequeue(&ar->tx_pending[i]);
1762 if (unlikely(!skb)) {
1763 frames_failed += frames;
1764 frames = 0;
1765 break;
1766 }
1767
1768 info = IEEE80211_SKB_CB(skb);
1769 arinfo = (void *) info->rate_driver_data;
1770
1771
1772 arinfo->timeout = jiffies +
1773 msecs_to_jiffies(AR9170_TX_TIMEOUT);
1774
1775 if (arinfo->flags == AR9170_TX_FLAG_BLOCK_ACK)
1776 ar->tx_ampdu_pending++;
1777
1778#ifdef AR9170_QUEUE_DEBUG
1779 printk(KERN_DEBUG "%s: send frame q:%d =>\n",
1780 wiphy_name(ar->hw->wiphy), i);
1781 ar9170_print_txheader(ar, skb);
1782#endif
1783
1784 err = ar->tx(ar, skb);
1785 if (unlikely(err)) {
1786 if (arinfo->flags == AR9170_TX_FLAG_BLOCK_ACK)
1787 ar->tx_ampdu_pending--;
1788
1789 frames_failed++;
1790 dev_kfree_skb_any(skb);
1791 } else {
1792 remaining_space--;
1793 schedule_garbagecollector = true;
1794 }
1795
1796 frames--;
1797 }
1798
1799#ifdef AR9170_QUEUE_DEBUG
1800 printk(KERN_DEBUG "%s: ar9170_tx report for queue %d\n",
1801 wiphy_name(ar->hw->wiphy), i);
1802
1803 printk(KERN_DEBUG "%s: unprocessed pending frames left:\n",
1804 wiphy_name(ar->hw->wiphy));
1805 ar9170_dump_txqueue(ar, &ar->tx_pending[i]);
1806#endif
1807
1808 if (unlikely(frames_failed)) {
1809#ifdef AR9170_QUEUE_DEBUG
1810 printk(KERN_DEBUG "%s: frames failed %d =>\n",
1811 wiphy_name(ar->hw->wiphy), frames_failed);
1812#endif
1813
1814 spin_lock_irqsave(&ar->tx_stats_lock, flags);
1815 ar->tx_stats[i].len -= frames_failed;
1816 ar->tx_stats[i].count -= frames_failed;
1817#ifdef AR9170_QUEUE_STOP_DEBUG
1818 printk(KERN_DEBUG "%s: wake queue %d\n",
1819 wiphy_name(ar->hw->wiphy), i);
1820 __ar9170_dump_txstats(ar);
1821#endif
1822 ieee80211_wake_queue(ar->hw, i);
1823 spin_unlock_irqrestore(&ar->tx_stats_lock, flags);
1824 }
1825 }
1826
1827 if (!schedule_garbagecollector)
1828 return;
1829
1830 ieee80211_queue_delayed_work(ar->hw,
1831 &ar->tx_janitor,
1832 msecs_to_jiffies(AR9170_JANITOR_DELAY));
1833}
1834
1835static bool ar9170_tx_ampdu_queue(struct ar9170 *ar, struct sk_buff *skb)
1836{
1837 struct ieee80211_tx_info *txinfo;
1838 struct ar9170_sta_info *sta_info;
1839 struct ar9170_sta_tid *agg;
1840 struct sk_buff *iter;
1841 unsigned long flags, f2;
1842 unsigned int max;
1843 u16 tid, seq, qseq;
1844 bool run = false, queue = false;
1845
1846 tid = ar9170_get_tid(skb);
1847 seq = ar9170_get_seq(skb);
1848 txinfo = IEEE80211_SKB_CB(skb);
1849 sta_info = (void *) txinfo->control.sta->drv_priv;
1850 agg = &sta_info->agg[tid];
1851 max = sta_info->ampdu_max_len;
1852
1853 spin_lock_irqsave(&ar->tx_ampdu_list_lock, flags);
1854
1855 if (unlikely(agg->state != AR9170_TID_STATE_COMPLETE)) {
1856#ifdef AR9170_TXAGG_DEBUG
1857 printk(KERN_DEBUG "%s: BlockACK session not fully initialized "
1858 "for ESS:%pM tid:%d state:%d.\n",
1859 wiphy_name(ar->hw->wiphy), agg->addr, agg->tid,
1860 agg->state);
1861#endif
1862 goto err_unlock;
1863 }
1864
1865 if (!agg->active) {
1866 agg->active = true;
1867 agg->ssn = seq;
1868 queue = true;
1869 }
1870
1871
1872 if (unlikely(!BAW_WITHIN(agg->ssn, max, seq))) {
1873#ifdef AR9170_TXAGG_DEBUG
1874 printk(KERN_DEBUG "%s: frame with tid:%d seq:%d does not "
1875 "fit into BA window (%d - %d)\n",
1876 wiphy_name(ar->hw->wiphy), tid, seq, agg->ssn,
1877 (agg->ssn + max) & 0xfff);
1878#endif
1879 goto err_unlock;
1880 }
1881
1882 spin_lock_irqsave(&agg->queue.lock, f2);
1883
1884 skb_queue_reverse_walk(&agg->queue, iter) {
1885 qseq = ar9170_get_seq(iter);
1886
1887 if (GET_NEXT_SEQ(qseq) == seq) {
1888 __skb_queue_after(&agg->queue, iter, skb);
1889 goto queued;
1890 }
1891 }
1892
1893 __skb_queue_head(&agg->queue, skb);
1894
1895queued:
1896 spin_unlock_irqrestore(&agg->queue.lock, f2);
1897
1898#ifdef AR9170_TXAGG_DEBUG
1899 printk(KERN_DEBUG "%s: new aggregate %p queued.\n",
1900 wiphy_name(ar->hw->wiphy), skb);
1901 __ar9170_dump_txqueue(ar, &agg->queue);
1902#endif
1903
1904 if (skb_queue_len(&agg->queue) >= AR9170_NUM_TX_AGG_MAX)
1905 run = true;
1906
1907 if (queue)
1908 list_add_tail(&agg->list, &ar->tx_ampdu_list);
1909
1910 spin_unlock_irqrestore(&ar->tx_ampdu_list_lock, flags);
1911 return run;
1912
1913err_unlock:
1914 spin_unlock_irqrestore(&ar->tx_ampdu_list_lock, flags);
1915 dev_kfree_skb_irq(skb);
1916 return false;
1917}
1918
1919int ar9170_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
1920{
1921 struct ar9170 *ar = hw->priv;
1922 struct ieee80211_tx_info *info;
1923
1924 if (unlikely(!IS_STARTED(ar)))
1925 goto err_free;
1926
1927 if (unlikely(ar9170_tx_prepare(ar, skb)))
1928 goto err_free;
1929
1930 info = IEEE80211_SKB_CB(skb);
1931 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
1932 bool run = ar9170_tx_ampdu_queue(ar, skb);
1933
1934 if (run || !ar->tx_ampdu_pending)
1935 ar9170_tx_ampdu(ar);
1936 } else {
1937 unsigned int queue = skb_get_queue_mapping(skb);
1938
1939 ar9170_tx_prepare_phy(ar, skb);
1940 skb_queue_tail(&ar->tx_pending[queue], skb);
1941 }
1942
1943 ar9170_tx(ar);
1944 return NETDEV_TX_OK;
1945
1946err_free:
1947 dev_kfree_skb_any(skb);
1948 return NETDEV_TX_OK;
1949}
1950
1951static int ar9170_op_add_interface(struct ieee80211_hw *hw,
1952 struct ieee80211_if_init_conf *conf)
1953{
1954 struct ar9170 *ar = hw->priv;
1955 int err = 0;
1956
1957 mutex_lock(&ar->mutex);
1958
1959 if (ar->vif) {
1960 err = -EBUSY;
1961 goto unlock;
1962 }
1963
1964 ar->vif = conf->vif;
1965 memcpy(ar->mac_addr, conf->mac_addr, ETH_ALEN);
1966
1967 if (modparam_nohwcrypt || (ar->vif->type != NL80211_IFTYPE_STATION)) {
1968 ar->rx_software_decryption = true;
1969 ar->disable_offload = true;
1970 }
1971
1972 ar->cur_filter = 0;
1973 err = ar9170_update_frame_filter(ar, AR9170_MAC_REG_FTF_DEFAULTS);
1974 if (err)
1975 goto unlock;
1976
1977 err = ar9170_set_operating_mode(ar);
1978
1979unlock:
1980 mutex_unlock(&ar->mutex);
1981 return err;
1982}
1983
1984static void ar9170_op_remove_interface(struct ieee80211_hw *hw,
1985 struct ieee80211_if_init_conf *conf)
1986{
1987 struct ar9170 *ar = hw->priv;
1988
1989 mutex_lock(&ar->mutex);
1990 ar->vif = NULL;
1991 ar9170_update_frame_filter(ar, 0);
1992 ar9170_set_beacon_timers(ar);
1993 dev_kfree_skb(ar->beacon);
1994 ar->beacon = NULL;
1995 ar->sniffer_enabled = false;
1996 ar->rx_software_decryption = false;
1997 ar9170_set_operating_mode(ar);
1998 mutex_unlock(&ar->mutex);
1999}
2000
2001static int ar9170_op_config(struct ieee80211_hw *hw, u32 changed)
2002{
2003 struct ar9170 *ar = hw->priv;
2004 int err = 0;
2005
2006 mutex_lock(&ar->mutex);
2007
2008 if (changed & IEEE80211_CONF_CHANGE_LISTEN_INTERVAL) {
2009
2010 err = 0;
2011 }
2012
2013 if (changed & IEEE80211_CONF_CHANGE_PS) {
2014
2015 err = 0;
2016 }
2017
2018 if (changed & IEEE80211_CONF_CHANGE_POWER) {
2019
2020 err = 0;
2021 }
2022
2023 if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS) {
2024
2025
2026
2027
2028 err = ar9170_set_hwretry_limit(ar,
2029 ar->hw->conf.long_frame_max_tx_count);
2030 if (err)
2031 goto out;
2032 }
2033
2034 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
2035
2036
2037 err = ar9170_set_slot_time(ar);
2038 if (err)
2039 goto out;
2040
2041 err = ar9170_set_dyn_sifs_ack(ar);
2042 if (err)
2043 goto out;
2044
2045 err = ar9170_set_channel(ar, hw->conf.channel,
2046 AR9170_RFI_NONE,
2047 nl80211_to_ar9170(hw->conf.channel_type));
2048 if (err)
2049 goto out;
2050 }
2051
2052out:
2053 mutex_unlock(&ar->mutex);
2054 return err;
2055}
2056
2057static u64 ar9170_op_prepare_multicast(struct ieee80211_hw *hw, int mc_count,
2058 struct dev_addr_list *mclist)
2059{
2060 u64 mchash;
2061 int i;
2062
2063
2064 mchash = 1ULL << (0xff >> 2);
2065
2066 for (i = 0; i < mc_count; i++) {
2067 if (WARN_ON(!mclist))
2068 break;
2069 mchash |= 1ULL << (mclist->dmi_addr[5] >> 2);
2070 mclist = mclist->next;
2071 }
2072
2073 return mchash;
2074}
2075
2076static void ar9170_op_configure_filter(struct ieee80211_hw *hw,
2077 unsigned int changed_flags,
2078 unsigned int *new_flags,
2079 u64 multicast)
2080{
2081 struct ar9170 *ar = hw->priv;
2082
2083 if (unlikely(!IS_ACCEPTING_CMD(ar)))
2084 return ;
2085
2086 mutex_lock(&ar->mutex);
2087
2088
2089 *new_flags &= FIF_ALLMULTI | FIF_CONTROL | FIF_BCN_PRBRESP_PROMISC |
2090 FIF_PROMISC_IN_BSS | FIF_FCSFAIL | FIF_PLCPFAIL;
2091 ar->filter_state = *new_flags;
2092
2093
2094
2095
2096
2097 if (changed_flags & FIF_ALLMULTI && *new_flags & FIF_ALLMULTI)
2098 multicast = ~0ULL;
2099
2100 if (multicast != ar->cur_mc_hash)
2101 ar9170_update_multicast(ar, multicast);
2102
2103 if (changed_flags & FIF_CONTROL) {
2104 u32 filter = AR9170_MAC_REG_FTF_PSPOLL |
2105 AR9170_MAC_REG_FTF_RTS |
2106 AR9170_MAC_REG_FTF_CTS |
2107 AR9170_MAC_REG_FTF_ACK |
2108 AR9170_MAC_REG_FTF_CFE |
2109 AR9170_MAC_REG_FTF_CFE_ACK;
2110
2111 if (*new_flags & FIF_CONTROL)
2112 filter |= ar->cur_filter;
2113 else
2114 filter &= (~ar->cur_filter);
2115
2116 ar9170_update_frame_filter(ar, filter);
2117 }
2118
2119 if (changed_flags & FIF_PROMISC_IN_BSS) {
2120 ar->sniffer_enabled = ((*new_flags) & FIF_PROMISC_IN_BSS) != 0;
2121 ar9170_set_operating_mode(ar);
2122 }
2123
2124 mutex_unlock(&ar->mutex);
2125}
2126
2127
2128static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw,
2129 struct ieee80211_vif *vif,
2130 struct ieee80211_bss_conf *bss_conf,
2131 u32 changed)
2132{
2133 struct ar9170 *ar = hw->priv;
2134 int err = 0;
2135
2136 mutex_lock(&ar->mutex);
2137
2138 if (changed & BSS_CHANGED_BSSID) {
2139 memcpy(ar->bssid, bss_conf->bssid, ETH_ALEN);
2140 err = ar9170_set_operating_mode(ar);
2141 if (err)
2142 goto out;
2143 }
2144
2145 if (changed & BSS_CHANGED_BEACON_ENABLED)
2146 ar->enable_beacon = bss_conf->enable_beacon;
2147
2148 if (changed & BSS_CHANGED_BEACON) {
2149 err = ar9170_update_beacon(ar);
2150 if (err)
2151 goto out;
2152 }
2153
2154 if (changed & (BSS_CHANGED_BEACON_ENABLED | BSS_CHANGED_BEACON |
2155 BSS_CHANGED_BEACON_INT)) {
2156 err = ar9170_set_beacon_timers(ar);
2157 if (err)
2158 goto out;
2159 }
2160
2161 if (changed & BSS_CHANGED_ASSOC) {
2162#ifndef CONFIG_AR9170_LEDS
2163
2164 err = ar9170_set_leds_state(ar, bss_conf->assoc ? 2 : 0);
2165#endif
2166 }
2167
2168 if (changed & BSS_CHANGED_HT) {
2169
2170 err = 0;
2171 }
2172
2173 if (changed & BSS_CHANGED_ERP_SLOT) {
2174 err = ar9170_set_slot_time(ar);
2175 if (err)
2176 goto out;
2177 }
2178
2179 if (changed & BSS_CHANGED_BASIC_RATES) {
2180 err = ar9170_set_basic_rates(ar);
2181 if (err)
2182 goto out;
2183 }
2184
2185out:
2186 mutex_unlock(&ar->mutex);
2187}
2188
2189static u64 ar9170_op_get_tsf(struct ieee80211_hw *hw)
2190{
2191 struct ar9170 *ar = hw->priv;
2192 int err;
2193 u32 tsf_low;
2194 u32 tsf_high;
2195 u64 tsf;
2196
2197 mutex_lock(&ar->mutex);
2198 err = ar9170_read_reg(ar, AR9170_MAC_REG_TSF_L, &tsf_low);
2199 if (!err)
2200 err = ar9170_read_reg(ar, AR9170_MAC_REG_TSF_H, &tsf_high);
2201 mutex_unlock(&ar->mutex);
2202
2203 if (WARN_ON(err))
2204 return 0;
2205
2206 tsf = tsf_high;
2207 tsf = (tsf << 32) | tsf_low;
2208 return tsf;
2209}
2210
2211static int ar9170_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2212 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2213 struct ieee80211_key_conf *key)
2214{
2215 struct ar9170 *ar = hw->priv;
2216 int err = 0, i;
2217 u8 ktype;
2218
2219 if ((!ar->vif) || (ar->disable_offload))
2220 return -EOPNOTSUPP;
2221
2222 switch (key->alg) {
2223 case ALG_WEP:
2224 if (key->keylen == WLAN_KEY_LEN_WEP40)
2225 ktype = AR9170_ENC_ALG_WEP64;
2226 else
2227 ktype = AR9170_ENC_ALG_WEP128;
2228 break;
2229 case ALG_TKIP:
2230 ktype = AR9170_ENC_ALG_TKIP;
2231 break;
2232 case ALG_CCMP:
2233 ktype = AR9170_ENC_ALG_AESCCMP;
2234 break;
2235 default:
2236 return -EOPNOTSUPP;
2237 }
2238
2239 mutex_lock(&ar->mutex);
2240 if (cmd == SET_KEY) {
2241 if (unlikely(!IS_STARTED(ar))) {
2242 err = -EOPNOTSUPP;
2243 goto out;
2244 }
2245
2246
2247 if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
2248 sta = NULL;
2249
2250 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
2251 for (i = 0; i < 64; i++)
2252 if (!(ar->usedkeys & BIT(i)))
2253 break;
2254 if (i == 64) {
2255 ar->rx_software_decryption = true;
2256 ar9170_set_operating_mode(ar);
2257 err = -ENOSPC;
2258 goto out;
2259 }
2260 } else {
2261 i = 64 + key->keyidx;
2262 }
2263
2264 key->hw_key_idx = i;
2265
2266 err = ar9170_upload_key(ar, i, sta ? sta->addr : NULL, ktype, 0,
2267 key->key, min_t(u8, 16, key->keylen));
2268 if (err)
2269 goto out;
2270
2271 if (key->alg == ALG_TKIP) {
2272 err = ar9170_upload_key(ar, i, sta ? sta->addr : NULL,
2273 ktype, 1, key->key + 16, 16);
2274 if (err)
2275 goto out;
2276
2277
2278
2279
2280
2281 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
2282 }
2283
2284 if (i < 64)
2285 ar->usedkeys |= BIT(i);
2286
2287 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
2288 } else {
2289 if (unlikely(!IS_STARTED(ar))) {
2290
2291 err = 0;
2292 goto out;
2293 }
2294
2295 err = ar9170_disable_key(ar, key->hw_key_idx);
2296 if (err)
2297 goto out;
2298
2299 if (key->hw_key_idx < 64) {
2300 ar->usedkeys &= ~BIT(key->hw_key_idx);
2301 } else {
2302 err = ar9170_upload_key(ar, key->hw_key_idx, NULL,
2303 AR9170_ENC_ALG_NONE, 0,
2304 NULL, 0);
2305 if (err)
2306 goto out;
2307
2308 if (key->alg == ALG_TKIP) {
2309 err = ar9170_upload_key(ar, key->hw_key_idx,
2310 NULL,
2311 AR9170_ENC_ALG_NONE, 1,
2312 NULL, 0);
2313 if (err)
2314 goto out;
2315 }
2316
2317 }
2318 }
2319
2320 ar9170_regwrite_begin(ar);
2321 ar9170_regwrite(AR9170_MAC_REG_ROLL_CALL_TBL_L, ar->usedkeys);
2322 ar9170_regwrite(AR9170_MAC_REG_ROLL_CALL_TBL_H, ar->usedkeys >> 32);
2323 ar9170_regwrite_finish();
2324 err = ar9170_regwrite_result();
2325
2326out:
2327 mutex_unlock(&ar->mutex);
2328
2329 return err;
2330}
2331
2332static void ar9170_sta_notify(struct ieee80211_hw *hw,
2333 struct ieee80211_vif *vif,
2334 enum sta_notify_cmd cmd,
2335 struct ieee80211_sta *sta)
2336{
2337 struct ar9170 *ar = hw->priv;
2338 struct ar9170_sta_info *sta_info = (void *) sta->drv_priv;
2339 unsigned int i;
2340
2341 switch (cmd) {
2342 case STA_NOTIFY_ADD:
2343 memset(sta_info, 0, sizeof(*sta_info));
2344
2345 if (!sta->ht_cap.ht_supported)
2346 break;
2347
2348 if (sta->ht_cap.ampdu_density > ar->global_ampdu_density)
2349 ar->global_ampdu_density = sta->ht_cap.ampdu_density;
2350
2351 if (sta->ht_cap.ampdu_factor < ar->global_ampdu_factor)
2352 ar->global_ampdu_factor = sta->ht_cap.ampdu_factor;
2353
2354 for (i = 0; i < AR9170_NUM_TID; i++) {
2355 sta_info->agg[i].state = AR9170_TID_STATE_SHUTDOWN;
2356 sta_info->agg[i].active = false;
2357 sta_info->agg[i].ssn = 0;
2358 sta_info->agg[i].retry = 0;
2359 sta_info->agg[i].tid = i;
2360 INIT_LIST_HEAD(&sta_info->agg[i].list);
2361 skb_queue_head_init(&sta_info->agg[i].queue);
2362 }
2363
2364 sta_info->ampdu_max_len = 1 << (3 + sta->ht_cap.ampdu_factor);
2365 break;
2366
2367 case STA_NOTIFY_REMOVE:
2368 if (!sta->ht_cap.ht_supported)
2369 break;
2370
2371 for (i = 0; i < AR9170_NUM_TID; i++) {
2372 sta_info->agg[i].state = AR9170_TID_STATE_INVALID;
2373 skb_queue_purge(&sta_info->agg[i].queue);
2374 }
2375
2376 break;
2377
2378 default:
2379 break;
2380 }
2381}
2382
2383static int ar9170_get_stats(struct ieee80211_hw *hw,
2384 struct ieee80211_low_level_stats *stats)
2385{
2386 struct ar9170 *ar = hw->priv;
2387 u32 val;
2388 int err;
2389
2390 mutex_lock(&ar->mutex);
2391 err = ar9170_read_reg(ar, AR9170_MAC_REG_TX_RETRY, &val);
2392 ar->stats.dot11ACKFailureCount += val;
2393
2394 memcpy(stats, &ar->stats, sizeof(*stats));
2395 mutex_unlock(&ar->mutex);
2396
2397 return 0;
2398}
2399
2400static int ar9170_get_tx_stats(struct ieee80211_hw *hw,
2401 struct ieee80211_tx_queue_stats *tx_stats)
2402{
2403 struct ar9170 *ar = hw->priv;
2404
2405 spin_lock_bh(&ar->tx_stats_lock);
2406 memcpy(tx_stats, ar->tx_stats, sizeof(tx_stats[0]) * hw->queues);
2407 spin_unlock_bh(&ar->tx_stats_lock);
2408
2409 return 0;
2410}
2411
2412static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue,
2413 const struct ieee80211_tx_queue_params *param)
2414{
2415 struct ar9170 *ar = hw->priv;
2416 int ret;
2417
2418 mutex_lock(&ar->mutex);
2419 if (queue < __AR9170_NUM_TXQ) {
2420 memcpy(&ar->edcf[ar9170_qos_hwmap[queue]],
2421 param, sizeof(*param));
2422
2423 ret = ar9170_set_qos(ar);
2424 } else {
2425 ret = -EINVAL;
2426 }
2427
2428 mutex_unlock(&ar->mutex);
2429 return ret;
2430}
2431
2432static int ar9170_ampdu_action(struct ieee80211_hw *hw,
2433 enum ieee80211_ampdu_mlme_action action,
2434 struct ieee80211_sta *sta, u16 tid, u16 *ssn)
2435{
2436 struct ar9170 *ar = hw->priv;
2437 struct ar9170_sta_info *sta_info = (void *) sta->drv_priv;
2438 struct ar9170_sta_tid *tid_info = &sta_info->agg[tid];
2439 unsigned long flags;
2440
2441 if (!modparam_ht)
2442 return -EOPNOTSUPP;
2443
2444 switch (action) {
2445 case IEEE80211_AMPDU_TX_START:
2446 spin_lock_irqsave(&ar->tx_ampdu_list_lock, flags);
2447 if (tid_info->state != AR9170_TID_STATE_SHUTDOWN ||
2448 !list_empty(&tid_info->list)) {
2449 spin_unlock_irqrestore(&ar->tx_ampdu_list_lock, flags);
2450#ifdef AR9170_TXAGG_DEBUG
2451 printk(KERN_INFO "%s: A-MPDU [ESS:[%pM] tid:[%d]] "
2452 "is in a very bad state!\n",
2453 wiphy_name(hw->wiphy), sta->addr, tid);
2454#endif
2455 return -EBUSY;
2456 }
2457
2458 *ssn = tid_info->ssn;
2459 tid_info->state = AR9170_TID_STATE_PROGRESS;
2460 tid_info->active = false;
2461 spin_unlock_irqrestore(&ar->tx_ampdu_list_lock, flags);
2462 ieee80211_start_tx_ba_cb_irqsafe(hw, sta->addr, tid);
2463 break;
2464
2465 case IEEE80211_AMPDU_TX_STOP:
2466 spin_lock_irqsave(&ar->tx_ampdu_list_lock, flags);
2467 tid_info->state = AR9170_TID_STATE_SHUTDOWN;
2468 list_del_init(&tid_info->list);
2469 tid_info->active = false;
2470 skb_queue_purge(&tid_info->queue);
2471 spin_unlock_irqrestore(&ar->tx_ampdu_list_lock, flags);
2472 ieee80211_stop_tx_ba_cb_irqsafe(hw, sta->addr, tid);
2473 break;
2474
2475 case IEEE80211_AMPDU_TX_OPERATIONAL:
2476#ifdef AR9170_TXAGG_DEBUG
2477 printk(KERN_INFO "%s: A-MPDU for %pM [tid:%d] Operational.\n",
2478 wiphy_name(hw->wiphy), sta->addr, tid);
2479#endif
2480 spin_lock_irqsave(&ar->tx_ampdu_list_lock, flags);
2481 sta_info->agg[tid].state = AR9170_TID_STATE_COMPLETE;
2482 spin_unlock_irqrestore(&ar->tx_ampdu_list_lock, flags);
2483 break;
2484
2485 case IEEE80211_AMPDU_RX_START:
2486 case IEEE80211_AMPDU_RX_STOP:
2487
2488 break;
2489
2490 default:
2491 return -EOPNOTSUPP;
2492 }
2493
2494 return 0;
2495}
2496
2497static const struct ieee80211_ops ar9170_ops = {
2498 .start = ar9170_op_start,
2499 .stop = ar9170_op_stop,
2500 .tx = ar9170_op_tx,
2501 .add_interface = ar9170_op_add_interface,
2502 .remove_interface = ar9170_op_remove_interface,
2503 .config = ar9170_op_config,
2504 .prepare_multicast = ar9170_op_prepare_multicast,
2505 .configure_filter = ar9170_op_configure_filter,
2506 .conf_tx = ar9170_conf_tx,
2507 .bss_info_changed = ar9170_op_bss_info_changed,
2508 .get_tsf = ar9170_op_get_tsf,
2509 .set_key = ar9170_set_key,
2510 .sta_notify = ar9170_sta_notify,
2511 .get_stats = ar9170_get_stats,
2512 .get_tx_stats = ar9170_get_tx_stats,
2513 .ampdu_action = ar9170_ampdu_action,
2514};
2515
2516void *ar9170_alloc(size_t priv_size)
2517{
2518 struct ieee80211_hw *hw;
2519 struct ar9170 *ar;
2520 struct sk_buff *skb;
2521 int i;
2522
2523
2524
2525
2526
2527
2528
2529 skb = __dev_alloc_skb(AR9170_MAX_RX_BUFFER_SIZE, GFP_KERNEL);
2530 if (!skb)
2531 goto err_nomem;
2532
2533 hw = ieee80211_alloc_hw(priv_size, &ar9170_ops);
2534 if (!hw)
2535 goto err_nomem;
2536
2537 ar = hw->priv;
2538 ar->hw = hw;
2539 ar->rx_failover = skb;
2540
2541 mutex_init(&ar->mutex);
2542 spin_lock_init(&ar->cmdlock);
2543 spin_lock_init(&ar->tx_stats_lock);
2544 spin_lock_init(&ar->tx_ampdu_list_lock);
2545 skb_queue_head_init(&ar->tx_status_ampdu);
2546 for (i = 0; i < __AR9170_NUM_TXQ; i++) {
2547 skb_queue_head_init(&ar->tx_status[i]);
2548 skb_queue_head_init(&ar->tx_pending[i]);
2549 }
2550 ar9170_rx_reset_rx_mpdu(ar);
2551 INIT_WORK(&ar->beacon_work, ar9170_new_beacon);
2552 INIT_DELAYED_WORK(&ar->tx_janitor, ar9170_tx_janitor);
2553 INIT_LIST_HEAD(&ar->tx_ampdu_list);
2554
2555
2556 ar->channel = &ar9170_2ghz_chantable[0];
2557
2558
2559 ar->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
2560 BIT(NL80211_IFTYPE_WDS) |
2561 BIT(NL80211_IFTYPE_ADHOC);
2562 ar->hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS |
2563 IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
2564 IEEE80211_HW_SIGNAL_DBM |
2565 IEEE80211_HW_NOISE_DBM;
2566
2567 if (modparam_ht) {
2568 ar->hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
2569 } else {
2570 ar9170_band_2GHz.ht_cap.ht_supported = false;
2571 ar9170_band_5GHz.ht_cap.ht_supported = false;
2572 }
2573
2574 ar->hw->queues = __AR9170_NUM_TXQ;
2575 ar->hw->extra_tx_headroom = 8;
2576 ar->hw->sta_data_size = sizeof(struct ar9170_sta_info);
2577
2578 ar->hw->max_rates = 1;
2579 ar->hw->max_rate_tries = 3;
2580
2581 for (i = 0; i < ARRAY_SIZE(ar->noise); i++)
2582 ar->noise[i] = -95;
2583
2584 return ar;
2585
2586err_nomem:
2587 kfree_skb(skb);
2588 return ERR_PTR(-ENOMEM);
2589}
2590
2591static int ar9170_read_eeprom(struct ar9170 *ar)
2592{
2593#define RW 8
2594#define RB (sizeof(u32) * RW)
2595 struct ath_regulatory *regulatory = &ar->common.regulatory;
2596 u8 *eeprom = (void *)&ar->eeprom;
2597 u8 *addr = ar->eeprom.mac_address;
2598 __le32 offsets[RW];
2599 unsigned int rx_streams, tx_streams, tx_params = 0;
2600 int i, j, err, bands = 0;
2601
2602 BUILD_BUG_ON(sizeof(ar->eeprom) & 3);
2603
2604 BUILD_BUG_ON(RB > AR9170_MAX_CMD_LEN - 4);
2605#ifndef __CHECKER__
2606
2607 BUILD_BUG_ON(sizeof(ar->eeprom) % RB);
2608#endif
2609
2610 for (i = 0; i < sizeof(ar->eeprom)/RB; i++) {
2611 for (j = 0; j < RW; j++)
2612 offsets[j] = cpu_to_le32(AR9170_EEPROM_START +
2613 RB * i + 4 * j);
2614
2615 err = ar->exec_cmd(ar, AR9170_CMD_RREG,
2616 RB, (u8 *) &offsets,
2617 RB, eeprom + RB * i);
2618 if (err)
2619 return err;
2620 }
2621
2622#undef RW
2623#undef RB
2624
2625 if (ar->eeprom.length == cpu_to_le16(0xFFFF))
2626 return -ENODATA;
2627
2628 if (ar->eeprom.operating_flags & AR9170_OPFLAG_2GHZ) {
2629 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &ar9170_band_2GHz;
2630 bands++;
2631 }
2632 if (ar->eeprom.operating_flags & AR9170_OPFLAG_5GHZ) {
2633 ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &ar9170_band_5GHz;
2634 bands++;
2635 }
2636
2637 rx_streams = hweight8(ar->eeprom.rx_mask);
2638 tx_streams = hweight8(ar->eeprom.tx_mask);
2639
2640 if (rx_streams != tx_streams)
2641 tx_params = IEEE80211_HT_MCS_TX_RX_DIFF;
2642
2643 if (tx_streams >= 1 && tx_streams <= IEEE80211_HT_MCS_TX_MAX_STREAMS)
2644 tx_params = (tx_streams - 1) <<
2645 IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT;
2646
2647 ar9170_band_2GHz.ht_cap.mcs.tx_params |= tx_params;
2648 ar9170_band_5GHz.ht_cap.mcs.tx_params |= tx_params;
2649
2650
2651
2652
2653
2654
2655
2656
2657 if (bands == 2)
2658 ar->hw->channel_change_time = 135 * 1000;
2659 else
2660 ar->hw->channel_change_time = 80 * 1000;
2661
2662 regulatory->current_rd = le16_to_cpu(ar->eeprom.reg_domain[0]);
2663 regulatory->current_rd_ext = le16_to_cpu(ar->eeprom.reg_domain[1]);
2664
2665
2666 SET_IEEE80211_PERM_ADDR(ar->hw, addr);
2667
2668 return bands ? 0 : -EINVAL;
2669}
2670
2671static int ar9170_reg_notifier(struct wiphy *wiphy,
2672 struct regulatory_request *request)
2673{
2674 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
2675 struct ar9170 *ar = hw->priv;
2676
2677 return ath_reg_notifier_apply(wiphy, request, &ar->common.regulatory);
2678}
2679
2680int ar9170_register(struct ar9170 *ar, struct device *pdev)
2681{
2682 struct ath_regulatory *regulatory = &ar->common.regulatory;
2683 int err;
2684
2685
2686 err = ar9170_read_eeprom(ar);
2687 if (err)
2688 goto err_out;
2689
2690 err = ath_regd_init(regulatory, ar->hw->wiphy,
2691 ar9170_reg_notifier);
2692 if (err)
2693 goto err_out;
2694
2695 err = ieee80211_register_hw(ar->hw);
2696 if (err)
2697 goto err_out;
2698
2699 if (!ath_is_world_regd(regulatory))
2700 regulatory_hint(ar->hw->wiphy, regulatory->alpha2);
2701
2702 err = ar9170_init_leds(ar);
2703 if (err)
2704 goto err_unreg;
2705
2706#ifdef CONFIG_AR9170_LEDS
2707 err = ar9170_register_leds(ar);
2708 if (err)
2709 goto err_unreg;
2710#endif
2711
2712 dev_info(pdev, "Atheros AR9170 is registered as '%s'\n",
2713 wiphy_name(ar->hw->wiphy));
2714
2715 return err;
2716
2717err_unreg:
2718 ieee80211_unregister_hw(ar->hw);
2719
2720err_out:
2721 return err;
2722}
2723
2724void ar9170_unregister(struct ar9170 *ar)
2725{
2726#ifdef CONFIG_AR9170_LEDS
2727 ar9170_unregister_leds(ar);
2728#endif
2729
2730 kfree_skb(ar->rx_failover);
2731 ieee80211_unregister_hw(ar->hw);
2732 mutex_destroy(&ar->mutex);
2733}
2734