]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ath9k: Fix PHY error processing
authorSujith Manoharan <c_manoha@qca.qualcomm.com>
Wed, 14 Aug 2013 03:41:15 +0000 (09:11 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 15 Aug 2013 20:08:03 +0000 (16:08 -0400)
Parse the PHY error details only for the last fragment
in case descriptors are chained.

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 51e7d16841d6ba9e4c8c8b5c568a39f85c9cc20c..e18adde1df6c54f834403bee2094e02f5300cfaa 100644 (file)
@@ -803,8 +803,6 @@ static bool ath9k_rx_accept(struct ath_common *common,
                        rxs->flag |= RX_FLAG_FAILED_FCS_CRC;
                        mic_error = false;
                }
-               if (rx_stats->rs_status & ATH9K_RXERR_PHY)
-                       return false;
 
                if ((rx_stats->rs_status & ATH9K_RXERR_DECRYPT) ||
                    (!is_mc && (rx_stats->rs_status & ATH9K_RXERR_KEYMISS))) {
@@ -1087,6 +1085,18 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc,
 
        ath9k_process_tsf(rx_stats, rx_status, tsf);
 
+       /*
+        * Process PHY errors and return so that the packet
+        * can be dropped.
+        */
+       if (rx_stats->rs_status & ATH9K_RXERR_PHY) {
+               ath9k_dfs_process_phyerr(sc, hdr, rx_stats, rx_status->mactime);
+               if (ath_process_fft(sc, hdr, rx_stats, rx_status->mactime))
+                       RX_STAT_INC(rx_spectral);
+
+               return -EINVAL;
+       }
+
        /*
         * everything but the rate is checked here, the rate check is done
         * separately to avoid doing two lookups for a rate for each frame.
@@ -1265,15 +1275,6 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
                rxs = IEEE80211_SKB_RXCB(hdr_skb);
                memset(rxs, 0, sizeof(struct ieee80211_rx_status));
 
-               if (rs.rs_status & ATH9K_RXERR_PHY) {
-                       ath9k_dfs_process_phyerr(sc, hdr, &rs, rxs->mactime);
-
-                       if (ath_process_fft(sc, hdr, &rs, rxs->mactime)) {
-                               RX_STAT_INC(rx_spectral);
-                               goto requeue_drop_frag;
-                       }
-               }
-
                retval = ath9k_rx_skb_preprocess(sc, hdr, &rs, rxs,
                                                 &decrypt_error, tsf);
                if (retval)