ath5k: capture CCK and OFDM restarts
authorMathy Vanhoef <vanhoefm@gmail.com>
Fri, 13 Jun 2014 23:14:56 +0000 (01:14 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 1 Jul 2014 18:26:25 +0000 (14:26 -0400)
Treat frames that underwent a CCK or OFDM restart as frames with an invalid CRC.

Signed-off-by: Mathy Vanhoef <vanhoefm@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath5k/base.c

index 5839a3434119db91ccad538cb3d4d4694aae1c96..8ad2550bce7ff4820511a606a30d10f81e09b91d 100644 (file)
@@ -1462,7 +1462,20 @@ ath5k_receive_frame_ok(struct ath5k_hw *ah, struct ath5k_rx_status *rs)
                        ah->stats.rxerr_phy++;
                        if (rs->rs_phyerr > 0 && rs->rs_phyerr < 32)
                                ah->stats.rxerr_phy_code[rs->rs_phyerr]++;
-                       return false;
+
+                       /*
+                        * Treat packets that underwent a CCK or OFDM reset as having a bad CRC.
+                        * These restarts happen when the radio resynchronizes to a stronger frame
+                        * while receiving a weaker frame. Here we receive the prefix of the weak
+                        * frame. Since these are incomplete packets, mark their CRC as invalid.
+                        */
+                       if (rs->rs_phyerr == AR5K_RX_PHY_ERROR_OFDM_RESTART ||
+                           rs->rs_phyerr == AR5K_RX_PHY_ERROR_CCK_RESTART) {
+                               rs->rs_status |= AR5K_RXERR_CRC;
+                               rs->rs_status &= ~AR5K_RXERR_PHY;
+                       } else {
+                               return false;
+                       }
                }
                if (rs->rs_status & AR5K_RXERR_DECRYPT) {
                        /*