]> Pileus Git - ~andy/linux/blob - drivers/net/wireless/ath/carl9170/rx.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec...
[~andy/linux] / drivers / net / wireless / ath / carl9170 / rx.c
1 /*
2  * Atheros CARL9170 driver
3  *
4  * 802.11 & command trap routines
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/slab.h>
41 #include <linux/module.h>
42 #include <linux/etherdevice.h>
43 #include <linux/crc32.h>
44 #include <net/mac80211.h>
45 #include "carl9170.h"
46 #include "hw.h"
47 #include "cmd.h"
48
49 static void carl9170_dbg_message(struct ar9170 *ar, const char *buf, u32 len)
50 {
51         bool restart = false;
52         enum carl9170_restart_reasons reason = CARL9170_RR_NO_REASON;
53
54         if (len > 3) {
55                 if (memcmp(buf, CARL9170_ERR_MAGIC, 3) == 0) {
56                         ar->fw.err_counter++;
57                         if (ar->fw.err_counter > 3) {
58                                 restart = true;
59                                 reason = CARL9170_RR_TOO_MANY_FIRMWARE_ERRORS;
60                         }
61                 }
62
63                 if (memcmp(buf, CARL9170_BUG_MAGIC, 3) == 0) {
64                         ar->fw.bug_counter++;
65                         restart = true;
66                         reason = CARL9170_RR_FATAL_FIRMWARE_ERROR;
67                 }
68         }
69
70         wiphy_info(ar->hw->wiphy, "FW: %.*s\n", len, buf);
71
72         if (restart)
73                 carl9170_restart(ar, reason);
74 }
75
76 static void carl9170_handle_ps(struct ar9170 *ar, struct carl9170_rsp *rsp)
77 {
78         u32 ps;
79         bool new_ps;
80
81         ps = le32_to_cpu(rsp->psm.state);
82
83         new_ps = (ps & CARL9170_PSM_COUNTER) != CARL9170_PSM_WAKE;
84         if (ar->ps.state != new_ps) {
85                 if (!new_ps) {
86                         ar->ps.sleep_ms = jiffies_to_msecs(jiffies -
87                                 ar->ps.last_action);
88                 }
89
90                 ar->ps.last_action = jiffies;
91
92                 ar->ps.state = new_ps;
93         }
94 }
95
96 static int carl9170_check_sequence(struct ar9170 *ar, unsigned int seq)
97 {
98         if (ar->cmd_seq < -1)
99                 return 0;
100
101         /*
102          * Initialize Counter
103          */
104         if (ar->cmd_seq < 0)
105                 ar->cmd_seq = seq;
106
107         /*
108          * The sequence is strictly monotonic increasing and it never skips!
109          *
110          * Therefore we can safely assume that whenever we received an
111          * unexpected sequence we have lost some valuable data.
112          */
113         if (seq != ar->cmd_seq) {
114                 int count;
115
116                 count = (seq - ar->cmd_seq) % ar->fw.cmd_bufs;
117
118                 wiphy_err(ar->hw->wiphy, "lost %d command responses/traps! "
119                           "w:%d g:%d\n", count, ar->cmd_seq, seq);
120
121                 carl9170_restart(ar, CARL9170_RR_LOST_RSP);
122                 return -EIO;
123         }
124
125         ar->cmd_seq = (ar->cmd_seq + 1) % ar->fw.cmd_bufs;
126         return 0;
127 }
128
129 static void carl9170_cmd_callback(struct ar9170 *ar, u32 len, void *buffer)
130 {
131         /*
132          * Some commands may have a variable response length
133          * and we cannot predict the correct length in advance.
134          * So we only check if we provided enough space for the data.
135          */
136         if (unlikely(ar->readlen != (len - 4))) {
137                 dev_warn(&ar->udev->dev, "received invalid command response:"
138                          "got %d, instead of %d\n", len - 4, ar->readlen);
139                 print_hex_dump_bytes("carl9170 cmd:", DUMP_PREFIX_OFFSET,
140                         ar->cmd_buf, (ar->cmd.hdr.len + 4) & 0x3f);
141                 print_hex_dump_bytes("carl9170 rsp:", DUMP_PREFIX_OFFSET,
142                         buffer, len);
143                 /*
144                  * Do not complete. The command times out,
145                  * and we get a stack trace from there.
146                  */
147                 carl9170_restart(ar, CARL9170_RR_INVALID_RSP);
148         }
149
150         spin_lock(&ar->cmd_lock);
151         if (ar->readbuf) {
152                 if (len >= 4)
153                         memcpy(ar->readbuf, buffer + 4, len - 4);
154
155                 ar->readbuf = NULL;
156         }
157         complete(&ar->cmd_wait);
158         spin_unlock(&ar->cmd_lock);
159 }
160
161 void carl9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len)
162 {
163         struct carl9170_rsp *cmd = buf;
164         struct ieee80211_vif *vif;
165
166         if ((cmd->hdr.cmd & CARL9170_RSP_FLAG) != CARL9170_RSP_FLAG) {
167                 if (!(cmd->hdr.cmd & CARL9170_CMD_ASYNC_FLAG))
168                         carl9170_cmd_callback(ar, len, buf);
169
170                 return;
171         }
172
173         if (unlikely(cmd->hdr.len != (len - 4))) {
174                 if (net_ratelimit()) {
175                         wiphy_err(ar->hw->wiphy, "FW: received over-/under"
176                                 "sized event %x (%d, but should be %d).\n",
177                                cmd->hdr.cmd, cmd->hdr.len, len - 4);
178
179                         print_hex_dump_bytes("dump:", DUMP_PREFIX_NONE,
180                                              buf, len);
181                 }
182
183                 return;
184         }
185
186         /* hardware event handlers */
187         switch (cmd->hdr.cmd) {
188         case CARL9170_RSP_PRETBTT:
189                 /* pre-TBTT event */
190                 rcu_read_lock();
191                 vif = carl9170_get_main_vif(ar);
192
193                 if (!vif) {
194                         rcu_read_unlock();
195                         break;
196                 }
197
198                 switch (vif->type) {
199                 case NL80211_IFTYPE_STATION:
200                         carl9170_handle_ps(ar, cmd);
201                         break;
202
203                 case NL80211_IFTYPE_AP:
204                 case NL80211_IFTYPE_ADHOC:
205                 case NL80211_IFTYPE_MESH_POINT:
206                         carl9170_update_beacon(ar, true);
207                         break;
208
209                 default:
210                         break;
211                 }
212                 rcu_read_unlock();
213
214                 break;
215
216
217         case CARL9170_RSP_TXCOMP:
218                 /* TX status notification */
219                 carl9170_tx_process_status(ar, cmd);
220                 break;
221
222         case CARL9170_RSP_BEACON_CONFIG:
223                 /*
224                  * (IBSS) beacon send notification
225                  * bytes: 04 c2 XX YY B4 B3 B2 B1
226                  *
227                  * XX always 80
228                  * YY always 00
229                  * B1-B4 "should" be the number of send out beacons.
230                  */
231                 break;
232
233         case CARL9170_RSP_ATIM:
234                 /* End of Atim Window */
235                 break;
236
237         case CARL9170_RSP_WATCHDOG:
238                 /* Watchdog Interrupt */
239                 carl9170_restart(ar, CARL9170_RR_WATCHDOG);
240                 break;
241
242         case CARL9170_RSP_TEXT:
243                 /* firmware debug */
244                 carl9170_dbg_message(ar, (char *)buf + 4, len - 4);
245                 break;
246
247         case CARL9170_RSP_HEXDUMP:
248                 wiphy_dbg(ar->hw->wiphy, "FW: HD %d\n", len - 4);
249                 print_hex_dump_bytes("FW:", DUMP_PREFIX_NONE,
250                                      (char *)buf + 4, len - 4);
251                 break;
252
253         case CARL9170_RSP_RADAR:
254                 if (!net_ratelimit())
255                         break;
256
257                 wiphy_info(ar->hw->wiphy, "FW: RADAR! Please report this "
258                        "incident to linux-wireless@vger.kernel.org !\n");
259                 break;
260
261         case CARL9170_RSP_GPIO:
262 #ifdef CONFIG_CARL9170_WPC
263                 if (ar->wps.pbc) {
264                         bool state = !!(cmd->gpio.gpio & cpu_to_le32(
265                                 AR9170_GPIO_PORT_WPS_BUTTON_PRESSED));
266
267                         if (state != ar->wps.pbc_state) {
268                                 ar->wps.pbc_state = state;
269                                 input_report_key(ar->wps.pbc, KEY_WPS_BUTTON,
270                                                  state);
271                                 input_sync(ar->wps.pbc);
272                         }
273                 }
274 #endif /* CONFIG_CARL9170_WPC */
275                 break;
276
277         case CARL9170_RSP_BOOT:
278                 complete(&ar->fw_boot_wait);
279                 break;
280
281         default:
282                 wiphy_err(ar->hw->wiphy, "FW: received unhandled event %x\n",
283                         cmd->hdr.cmd);
284                 print_hex_dump_bytes("dump:", DUMP_PREFIX_NONE, buf, len);
285                 break;
286         }
287 }
288
289 static int carl9170_rx_mac_status(struct ar9170 *ar,
290         struct ar9170_rx_head *head, struct ar9170_rx_macstatus *mac,
291         struct ieee80211_rx_status *status)
292 {
293         struct ieee80211_channel *chan;
294         u8 error, decrypt;
295
296         BUILD_BUG_ON(sizeof(struct ar9170_rx_head) != 12);
297         BUILD_BUG_ON(sizeof(struct ar9170_rx_macstatus) != 4);
298
299         error = mac->error;
300
301         if (error & AR9170_RX_ERROR_WRONG_RA) {
302                 if (!ar->sniffer_enabled)
303                         return -EINVAL;
304         }
305
306         if (error & AR9170_RX_ERROR_PLCP) {
307                 if (!(ar->filter_state & FIF_PLCPFAIL))
308                         return -EINVAL;
309
310                 status->flag |= RX_FLAG_FAILED_PLCP_CRC;
311         }
312
313         if (error & AR9170_RX_ERROR_FCS) {
314                 ar->tx_fcs_errors++;
315
316                 if (!(ar->filter_state & FIF_FCSFAIL))
317                         return -EINVAL;
318
319                 status->flag |= RX_FLAG_FAILED_FCS_CRC;
320         }
321
322         decrypt = ar9170_get_decrypt_type(mac);
323         if (!(decrypt & AR9170_RX_ENC_SOFTWARE) &&
324             decrypt != AR9170_ENC_ALG_NONE) {
325                 if ((decrypt == AR9170_ENC_ALG_TKIP) &&
326                     (error & AR9170_RX_ERROR_MMIC))
327                         status->flag |= RX_FLAG_MMIC_ERROR;
328
329                 status->flag |= RX_FLAG_DECRYPTED;
330         }
331
332         if (error & AR9170_RX_ERROR_DECRYPT && !ar->sniffer_enabled)
333                 return -ENODATA;
334
335         error &= ~(AR9170_RX_ERROR_MMIC |
336                    AR9170_RX_ERROR_FCS |
337                    AR9170_RX_ERROR_WRONG_RA |
338                    AR9170_RX_ERROR_DECRYPT |
339                    AR9170_RX_ERROR_PLCP);
340
341         /* drop any other error frames */
342         if (unlikely(error)) {
343                 /* TODO: update netdevice's RX dropped/errors statistics */
344
345                 if (net_ratelimit())
346                         wiphy_dbg(ar->hw->wiphy, "received frame with "
347                                "suspicious error code (%#x).\n", error);
348
349                 return -EINVAL;
350         }
351
352         chan = ar->channel;
353         if (chan) {
354                 status->band = chan->band;
355                 status->freq = chan->center_freq;
356         }
357
358         switch (mac->status & AR9170_RX_STATUS_MODULATION) {
359         case AR9170_RX_STATUS_MODULATION_CCK:
360                 if (mac->status & AR9170_RX_STATUS_SHORT_PREAMBLE)
361                         status->flag |= RX_FLAG_SHORTPRE;
362                 switch (head->plcp[0]) {
363                 case AR9170_RX_PHY_RATE_CCK_1M:
364                         status->rate_idx = 0;
365                         break;
366                 case AR9170_RX_PHY_RATE_CCK_2M:
367                         status->rate_idx = 1;
368                         break;
369                 case AR9170_RX_PHY_RATE_CCK_5M:
370                         status->rate_idx = 2;
371                         break;
372                 case AR9170_RX_PHY_RATE_CCK_11M:
373                         status->rate_idx = 3;
374                         break;
375                 default:
376                         if (net_ratelimit()) {
377                                 wiphy_err(ar->hw->wiphy, "invalid plcp cck "
378                                        "rate (%x).\n", head->plcp[0]);
379                         }
380
381                         return -EINVAL;
382                 }
383                 break;
384
385         case AR9170_RX_STATUS_MODULATION_DUPOFDM:
386         case AR9170_RX_STATUS_MODULATION_OFDM:
387                 switch (head->plcp[0] & 0xf) {
388                 case AR9170_TXRX_PHY_RATE_OFDM_6M:
389                         status->rate_idx = 0;
390                         break;
391                 case AR9170_TXRX_PHY_RATE_OFDM_9M:
392                         status->rate_idx = 1;
393                         break;
394                 case AR9170_TXRX_PHY_RATE_OFDM_12M:
395                         status->rate_idx = 2;
396                         break;
397                 case AR9170_TXRX_PHY_RATE_OFDM_18M:
398                         status->rate_idx = 3;
399                         break;
400                 case AR9170_TXRX_PHY_RATE_OFDM_24M:
401                         status->rate_idx = 4;
402                         break;
403                 case AR9170_TXRX_PHY_RATE_OFDM_36M:
404                         status->rate_idx = 5;
405                         break;
406                 case AR9170_TXRX_PHY_RATE_OFDM_48M:
407                         status->rate_idx = 6;
408                         break;
409                 case AR9170_TXRX_PHY_RATE_OFDM_54M:
410                         status->rate_idx = 7;
411                         break;
412                 default:
413                         if (net_ratelimit()) {
414                                 wiphy_err(ar->hw->wiphy, "invalid plcp ofdm "
415                                         "rate (%x).\n", head->plcp[0]);
416                         }
417
418                         return -EINVAL;
419                 }
420                 if (status->band == IEEE80211_BAND_2GHZ)
421                         status->rate_idx += 4;
422                 break;
423
424         case AR9170_RX_STATUS_MODULATION_HT:
425                 if (head->plcp[3] & 0x80)
426                         status->flag |= RX_FLAG_40MHZ;
427                 if (head->plcp[6] & 0x80)
428                         status->flag |= RX_FLAG_SHORT_GI;
429
430                 status->rate_idx = clamp(0, 75, head->plcp[3] & 0x7f);
431                 status->flag |= RX_FLAG_HT;
432                 break;
433
434         default:
435                 BUG();
436                 return -ENOSYS;
437         }
438
439         return 0;
440 }
441
442 static void carl9170_rx_phy_status(struct ar9170 *ar,
443         struct ar9170_rx_phystatus *phy, struct ieee80211_rx_status *status)
444 {
445         int i;
446
447         BUILD_BUG_ON(sizeof(struct ar9170_rx_phystatus) != 20);
448
449         for (i = 0; i < 3; i++)
450                 if (phy->rssi[i] != 0x80)
451                         status->antenna |= BIT(i);
452
453         /* post-process RSSI */
454         for (i = 0; i < 7; i++)
455                 if (phy->rssi[i] & 0x80)
456                         phy->rssi[i] = ((phy->rssi[i] & 0x7f) + 1) & 0x7f;
457
458         /* TODO: we could do something with phy_errors */
459         status->signal = ar->noise[0] + phy->rssi_combined;
460 }
461
462 static struct sk_buff *carl9170_rx_copy_data(u8 *buf, int len)
463 {
464         struct sk_buff *skb;
465         int reserved = 0;
466         struct ieee80211_hdr *hdr = (void *) buf;
467
468         if (ieee80211_is_data_qos(hdr->frame_control)) {
469                 u8 *qc = ieee80211_get_qos_ctl(hdr);
470                 reserved += NET_IP_ALIGN;
471
472                 if (*qc & IEEE80211_QOS_CTL_A_MSDU_PRESENT)
473                         reserved += NET_IP_ALIGN;
474         }
475
476         if (ieee80211_has_a4(hdr->frame_control))
477                 reserved += NET_IP_ALIGN;
478
479         reserved = 32 + (reserved & NET_IP_ALIGN);
480
481         skb = dev_alloc_skb(len + reserved);
482         if (likely(skb)) {
483                 skb_reserve(skb, reserved);
484                 memcpy(skb_put(skb, len), buf, len);
485         }
486
487         return skb;
488 }
489
490 static u8 *carl9170_find_ie(u8 *data, unsigned int len, u8 ie)
491 {
492         struct ieee80211_mgmt *mgmt = (void *)data;
493         u8 *pos, *end;
494
495         pos = (u8 *)mgmt->u.beacon.variable;
496         end = data + len;
497         while (pos < end) {
498                 if (pos + 2 + pos[1] > end)
499                         return NULL;
500
501                 if (pos[0] == ie)
502                         return pos;
503
504                 pos += 2 + pos[1];
505         }
506         return NULL;
507 }
508
509 /*
510  * NOTE:
511  *
512  * The firmware is in charge of waking up the device just before
513  * the AP is expected to transmit the next beacon.
514  *
515  * This leaves the driver with the important task of deciding when
516  * to set the PHY back to bed again.
517  */
518 static void carl9170_ps_beacon(struct ar9170 *ar, void *data, unsigned int len)
519 {
520         struct ieee80211_hdr *hdr = data;
521         struct ieee80211_tim_ie *tim_ie;
522         u8 *tim;
523         u8 tim_len;
524         bool cam;
525
526         if (likely(!(ar->hw->conf.flags & IEEE80211_CONF_PS)))
527                 return;
528
529         /* check if this really is a beacon */
530         if (!ieee80211_is_beacon(hdr->frame_control))
531                 return;
532
533         /* min. beacon length + FCS_LEN */
534         if (len <= 40 + FCS_LEN)
535                 return;
536
537         /* and only beacons from the associated BSSID, please */
538         if (!ether_addr_equal_64bits(hdr->addr3, ar->common.curbssid) ||
539             !ar->common.curaid)
540                 return;
541
542         ar->ps.last_beacon = jiffies;
543
544         tim = carl9170_find_ie(data, len - FCS_LEN, WLAN_EID_TIM);
545         if (!tim)
546                 return;
547
548         if (tim[1] < sizeof(*tim_ie))
549                 return;
550
551         tim_len = tim[1];
552         tim_ie = (struct ieee80211_tim_ie *) &tim[2];
553
554         if (!WARN_ON_ONCE(!ar->hw->conf.ps_dtim_period))
555                 ar->ps.dtim_counter = (tim_ie->dtim_count - 1) %
556                         ar->hw->conf.ps_dtim_period;
557
558         /* Check whenever the PHY can be turned off again. */
559
560         /* 1. What about buffered unicast traffic for our AID? */
561         cam = ieee80211_check_tim(tim_ie, tim_len, ar->common.curaid);
562
563         /* 2. Maybe the AP wants to send multicast/broadcast data? */
564         cam |= !!(tim_ie->bitmap_ctrl & 0x01);
565
566         if (!cam) {
567                 /* back to low-power land. */
568                 ar->ps.off_override &= ~PS_OFF_BCN;
569                 carl9170_ps_check(ar);
570         } else {
571                 /* force CAM */
572                 ar->ps.off_override |= PS_OFF_BCN;
573         }
574 }
575
576 static void carl9170_ba_check(struct ar9170 *ar, void *data, unsigned int len)
577 {
578         struct ieee80211_bar *bar = (void *) data;
579         struct carl9170_bar_list_entry *entry;
580         unsigned int queue;
581
582         if (likely(!ieee80211_is_back(bar->frame_control)))
583                 return;
584
585         if (len <= sizeof(*bar) + FCS_LEN)
586                 return;
587
588         queue = TID_TO_WME_AC(((le16_to_cpu(bar->control) &
589                 IEEE80211_BAR_CTRL_TID_INFO_MASK) >>
590                 IEEE80211_BAR_CTRL_TID_INFO_SHIFT) & 7);
591
592         rcu_read_lock();
593         list_for_each_entry_rcu(entry, &ar->bar_list[queue], list) {
594                 struct sk_buff *entry_skb = entry->skb;
595                 struct _carl9170_tx_superframe *super = (void *)entry_skb->data;
596                 struct ieee80211_bar *entry_bar = (void *)super->frame_data;
597
598 #define TID_CHECK(a, b) (                                               \
599         ((a) & cpu_to_le16(IEEE80211_BAR_CTRL_TID_INFO_MASK)) ==        \
600         ((b) & cpu_to_le16(IEEE80211_BAR_CTRL_TID_INFO_MASK)))          \
601
602                 if (bar->start_seq_num == entry_bar->start_seq_num &&
603                     TID_CHECK(bar->control, entry_bar->control) &&
604                     ether_addr_equal_64bits(bar->ra, entry_bar->ta) &&
605                     ether_addr_equal_64bits(bar->ta, entry_bar->ra)) {
606                         struct ieee80211_tx_info *tx_info;
607
608                         tx_info = IEEE80211_SKB_CB(entry_skb);
609                         tx_info->flags |= IEEE80211_TX_STAT_ACK;
610
611                         spin_lock_bh(&ar->bar_list_lock[queue]);
612                         list_del_rcu(&entry->list);
613                         spin_unlock_bh(&ar->bar_list_lock[queue]);
614                         kfree_rcu(entry, head);
615                         break;
616                 }
617         }
618         rcu_read_unlock();
619
620 #undef TID_CHECK
621 }
622
623 static bool carl9170_ampdu_check(struct ar9170 *ar, u8 *buf, u8 ms,
624                                  struct ieee80211_rx_status *rx_status)
625 {
626         __le16 fc;
627
628         if ((ms & AR9170_RX_STATUS_MPDU) == AR9170_RX_STATUS_MPDU_SINGLE) {
629                 /*
630                  * This frame is not part of an aMPDU.
631                  * Therefore it is not subjected to any
632                  * of the following content restrictions.
633                  */
634                 return true;
635         }
636
637         rx_status->flag |= RX_FLAG_AMPDU_DETAILS | RX_FLAG_AMPDU_LAST_KNOWN;
638         rx_status->ampdu_reference = ar->ampdu_ref;
639
640         /*
641          * "802.11n - 7.4a.3 A-MPDU contents" describes in which contexts
642          * certain frame types can be part of an aMPDU.
643          *
644          * In order to keep the processing cost down, I opted for a
645          * stateless filter solely based on the frame control field.
646          */
647
648         fc = ((struct ieee80211_hdr *)buf)->frame_control;
649         if (ieee80211_is_data_qos(fc) && ieee80211_is_data_present(fc))
650                 return true;
651
652         if (ieee80211_is_ack(fc) || ieee80211_is_back(fc) ||
653             ieee80211_is_back_req(fc))
654                 return true;
655
656         if (ieee80211_is_action(fc))
657                 return true;
658
659         return false;
660 }
661
662 static int carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len,
663                                 struct ieee80211_rx_status *status)
664 {
665         struct sk_buff *skb;
666
667         /* (driver) frame trap handler
668          *
669          * Because power-saving mode handing has to be implemented by
670          * the driver/firmware. We have to check each incoming beacon
671          * from the associated AP, if there's new data for us (either
672          * broadcast/multicast or unicast) we have to react quickly.
673          *
674          * So, if you have you want to add additional frame trap
675          * handlers, this would be the perfect place!
676          */
677
678         carl9170_ps_beacon(ar, buf, len);
679
680         carl9170_ba_check(ar, buf, len);
681
682         skb = carl9170_rx_copy_data(buf, len);
683         if (!skb)
684                 return -ENOMEM;
685
686         memcpy(IEEE80211_SKB_RXCB(skb), status, sizeof(*status));
687         ieee80211_rx(ar->hw, skb);
688         return 0;
689 }
690
691 /*
692  * If the frame alignment is right (or the kernel has
693  * CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS), and there
694  * is only a single MPDU in the USB frame, then we could
695  * submit to mac80211 the SKB directly. However, since
696  * there may be multiple packets in one SKB in stream
697  * mode, and we need to observe the proper ordering,
698  * this is non-trivial.
699  */
700 static void carl9170_rx_untie_data(struct ar9170 *ar, u8 *buf, int len)
701 {
702         struct ar9170_rx_head *head;
703         struct ar9170_rx_macstatus *mac;
704         struct ar9170_rx_phystatus *phy = NULL;
705         struct ieee80211_rx_status status;
706         int mpdu_len;
707         u8 mac_status;
708
709         if (!IS_STARTED(ar))
710                 return;
711
712         if (unlikely(len < sizeof(*mac)))
713                 goto drop;
714
715         memset(&status, 0, sizeof(status));
716
717         mpdu_len = len - sizeof(*mac);
718
719         mac = (void *)(buf + mpdu_len);
720         mac_status = mac->status;
721         switch (mac_status & AR9170_RX_STATUS_MPDU) {
722         case AR9170_RX_STATUS_MPDU_FIRST:
723                 ar->ampdu_ref++;
724                 /* Aggregated MPDUs start with an PLCP header */
725                 if (likely(mpdu_len >= sizeof(struct ar9170_rx_head))) {
726                         head = (void *) buf;
727
728                         /*
729                          * The PLCP header needs to be cached for the
730                          * following MIDDLE + LAST A-MPDU packets.
731                          *
732                          * So, if you are wondering why all frames seem
733                          * to share a common RX status information,
734                          * then you have the answer right here...
735                          */
736                         memcpy(&ar->rx_plcp, (void *) buf,
737                                sizeof(struct ar9170_rx_head));
738
739                         mpdu_len -= sizeof(struct ar9170_rx_head);
740                         buf += sizeof(struct ar9170_rx_head);
741
742                         ar->rx_has_plcp = true;
743                 } else {
744                         if (net_ratelimit()) {
745                                 wiphy_err(ar->hw->wiphy, "plcp info "
746                                         "is clipped.\n");
747                         }
748
749                         goto drop;
750                 }
751                 break;
752
753         case AR9170_RX_STATUS_MPDU_LAST:
754                 status.flag |= RX_FLAG_AMPDU_IS_LAST;
755
756                 /*
757                  * The last frame of an A-MPDU has an extra tail
758                  * which does contain the phy status of the whole
759                  * aggregate.
760                  */
761                 if (likely(mpdu_len >= sizeof(struct ar9170_rx_phystatus))) {
762                         mpdu_len -= sizeof(struct ar9170_rx_phystatus);
763                         phy = (void *)(buf + mpdu_len);
764                 } else {
765                         if (net_ratelimit()) {
766                                 wiphy_err(ar->hw->wiphy, "frame tail "
767                                         "is clipped.\n");
768                         }
769
770                         goto drop;
771                 }
772
773         case AR9170_RX_STATUS_MPDU_MIDDLE:
774                 /*  These are just data + mac status */
775                 if (unlikely(!ar->rx_has_plcp)) {
776                         if (!net_ratelimit())
777                                 return;
778
779                         wiphy_err(ar->hw->wiphy, "rx stream does not start "
780                                         "with a first_mpdu frame tag.\n");
781
782                         goto drop;
783                 }
784
785                 head = &ar->rx_plcp;
786                 break;
787
788         case AR9170_RX_STATUS_MPDU_SINGLE:
789                 /* single mpdu has both: plcp (head) and phy status (tail) */
790                 head = (void *) buf;
791
792                 mpdu_len -= sizeof(struct ar9170_rx_head);
793                 mpdu_len -= sizeof(struct ar9170_rx_phystatus);
794
795                 buf += sizeof(struct ar9170_rx_head);
796                 phy = (void *)(buf + mpdu_len);
797                 break;
798
799         default:
800                 BUG_ON(1);
801                 break;
802         }
803
804         /* FC + DU + RA + FCS */
805         if (unlikely(mpdu_len < (2 + 2 + ETH_ALEN + FCS_LEN)))
806                 goto drop;
807
808         if (unlikely(carl9170_rx_mac_status(ar, head, mac, &status)))
809                 goto drop;
810
811         if (!carl9170_ampdu_check(ar, buf, mac_status, &status))
812                 goto drop;
813
814         if (phy)
815                 carl9170_rx_phy_status(ar, phy, &status);
816         else
817                 status.flag |= RX_FLAG_NO_SIGNAL_VAL;
818
819         if (carl9170_handle_mpdu(ar, buf, mpdu_len, &status))
820                 goto drop;
821
822         return;
823 drop:
824         ar->rx_dropped++;
825 }
826
827 static void carl9170_rx_untie_cmds(struct ar9170 *ar, const u8 *respbuf,
828                                    const unsigned int resplen)
829 {
830         struct carl9170_rsp *cmd;
831         int i = 0;
832
833         while (i < resplen) {
834                 cmd = (void *) &respbuf[i];
835
836                 i += cmd->hdr.len + 4;
837                 if (unlikely(i > resplen))
838                         break;
839
840                 if (carl9170_check_sequence(ar, cmd->hdr.seq))
841                         break;
842
843                 carl9170_handle_command_response(ar, cmd, cmd->hdr.len + 4);
844         }
845
846         if (unlikely(i != resplen)) {
847                 if (!net_ratelimit())
848                         return;
849
850                 wiphy_err(ar->hw->wiphy, "malformed firmware trap:\n");
851                 print_hex_dump_bytes("rxcmd:", DUMP_PREFIX_OFFSET,
852                                      respbuf, resplen);
853         }
854 }
855
856 static void __carl9170_rx(struct ar9170 *ar, u8 *buf, unsigned int len)
857 {
858         unsigned int i = 0;
859
860         /* weird thing, but this is the same in the original driver */
861         while (len > 2 && i < 12 && buf[0] == 0xff && buf[1] == 0xff) {
862                 i += 2;
863                 len -= 2;
864                 buf += 2;
865         }
866
867         if (unlikely(len < 4))
868                 return;
869
870         /* found the 6 * 0xffff marker? */
871         if (i == 12)
872                 carl9170_rx_untie_cmds(ar, buf, len);
873         else
874                 carl9170_rx_untie_data(ar, buf, len);
875 }
876
877 static void carl9170_rx_stream(struct ar9170 *ar, void *buf, unsigned int len)
878 {
879         unsigned int tlen, wlen = 0, clen = 0;
880         struct ar9170_stream *rx_stream;
881         u8 *tbuf;
882
883         tbuf = buf;
884         tlen = len;
885
886         while (tlen >= 4) {
887                 rx_stream = (void *) tbuf;
888                 clen = le16_to_cpu(rx_stream->length);
889                 wlen = ALIGN(clen, 4);
890
891                 /* check if this is stream has a valid tag.*/
892                 if (rx_stream->tag != cpu_to_le16(AR9170_RX_STREAM_TAG)) {
893                         /*
894                          * TODO: handle the highly unlikely event that the
895                          * corrupted stream has the TAG at the right position.
896                          */
897
898                         /* check if the frame can be repaired. */
899                         if (!ar->rx_failover_missing) {
900
901                                 /* this is not "short read". */
902                                 if (net_ratelimit()) {
903                                         wiphy_err(ar->hw->wiphy,
904                                                 "missing tag!\n");
905                                 }
906
907                                 __carl9170_rx(ar, tbuf, tlen);
908                                 return;
909                         }
910
911                         if (ar->rx_failover_missing > tlen) {
912                                 if (net_ratelimit()) {
913                                         wiphy_err(ar->hw->wiphy,
914                                                 "possible multi "
915                                                 "stream corruption!\n");
916                                         goto err_telluser;
917                                 } else {
918                                         goto err_silent;
919                                 }
920                         }
921
922                         memcpy(skb_put(ar->rx_failover, tlen), tbuf, tlen);
923                         ar->rx_failover_missing -= tlen;
924
925                         if (ar->rx_failover_missing <= 0) {
926                                 /*
927                                  * nested carl9170_rx_stream call!
928                                  *
929                                  * termination is guaranteed, even when the
930                                  * combined frame also have an element with
931                                  * a bad tag.
932                                  */
933
934                                 ar->rx_failover_missing = 0;
935                                 carl9170_rx_stream(ar, ar->rx_failover->data,
936                                                    ar->rx_failover->len);
937
938                                 skb_reset_tail_pointer(ar->rx_failover);
939                                 skb_trim(ar->rx_failover, 0);
940                         }
941
942                         return;
943                 }
944
945                 /* check if stream is clipped */
946                 if (wlen > tlen - 4) {
947                         if (ar->rx_failover_missing) {
948                                 /* TODO: handle double stream corruption. */
949                                 if (net_ratelimit()) {
950                                         wiphy_err(ar->hw->wiphy, "double rx "
951                                                 "stream corruption!\n");
952                                         goto err_telluser;
953                                 } else {
954                                         goto err_silent;
955                                 }
956                         }
957
958                         /*
959                          * save incomplete data set.
960                          * the firmware will resend the missing bits when
961                          * the rx - descriptor comes round again.
962                          */
963
964                         memcpy(skb_put(ar->rx_failover, tlen), tbuf, tlen);
965                         ar->rx_failover_missing = clen - tlen;
966                         return;
967                 }
968                 __carl9170_rx(ar, rx_stream->payload, clen);
969
970                 tbuf += wlen + 4;
971                 tlen -= wlen + 4;
972         }
973
974         if (tlen) {
975                 if (net_ratelimit()) {
976                         wiphy_err(ar->hw->wiphy, "%d bytes of unprocessed "
977                                 "data left in rx stream!\n", tlen);
978                 }
979
980                 goto err_telluser;
981         }
982
983         return;
984
985 err_telluser:
986         wiphy_err(ar->hw->wiphy, "damaged RX stream data [want:%d, "
987                 "data:%d, rx:%d, pending:%d ]\n", clen, wlen, tlen,
988                 ar->rx_failover_missing);
989
990         if (ar->rx_failover_missing)
991                 print_hex_dump_bytes("rxbuf:", DUMP_PREFIX_OFFSET,
992                                      ar->rx_failover->data,
993                                      ar->rx_failover->len);
994
995         print_hex_dump_bytes("stream:", DUMP_PREFIX_OFFSET,
996                              buf, len);
997
998         wiphy_err(ar->hw->wiphy, "please check your hardware and cables, if "
999                 "you see this message frequently.\n");
1000
1001 err_silent:
1002         if (ar->rx_failover_missing) {
1003                 skb_reset_tail_pointer(ar->rx_failover);
1004                 skb_trim(ar->rx_failover, 0);
1005                 ar->rx_failover_missing = 0;
1006         }
1007 }
1008
1009 void carl9170_rx(struct ar9170 *ar, void *buf, unsigned int len)
1010 {
1011         if (ar->fw.rx_stream)
1012                 carl9170_rx_stream(ar, buf, len);
1013         else
1014                 __carl9170_rx(ar, buf, len);
1015 }