ath9k: Handle corrupt descriptors properly
authorSujith Manoharan <c_manoha@qca.qualcomm.com>
Wed, 14 Aug 2013 03:41:20 +0000 (09:11 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 15 Aug 2013 20:08:05 +0000 (16:08 -0400)
The MIC/PHYERR/CRC error bits are valid only for
the last desc. for chained packets. Check this early
in the preprocess() routine and bail out.

Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/recv.c

index 5b84ce4..30cb726 100644 (file)
@@ -1099,6 +1099,16 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc,
        if (rx_stats->rs_more)
                return 0;
 
+       /*
+        * Return immediately if the RX descriptor has been marked
+        * as corrupt based on the various error bits.
+        *
+        * This is different from the other corrupt descriptor
+        * condition handled above.
+        */
+       if (rx_stats->rs_status & ATH9K_RXERR_CORRUPT_DESC)
+               return -EINVAL;
+
        hdr = (struct ieee80211_hdr *) (skb->data + ah->caps.rx_status_len);
 
        ath9k_process_tsf(rx_stats, rx_status, tsf);
@@ -1335,8 +1345,6 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
                        sc->rx.frag = skb;
                        goto requeue;
                }
-               if (rs.rs_status & ATH9K_RXERR_CORRUPT_DESC)
-                       goto requeue_drop_frag;
 
                if (sc->rx.frag) {
                        int space = skb->len - skb_tailroom(hdr_skb);