diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/recv.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/recv.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index a3fc987ebab0..534a91bcc1d9 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
@@ -870,15 +870,18 @@ static bool ath9k_rx_accept(struct ath_common *common, | |||
870 | if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) { | 870 | if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) { |
871 | *decrypt_error = true; | 871 | *decrypt_error = true; |
872 | } else if (rx_stats->rs_status & ATH9K_RXERR_MIC) { | 872 | } else if (rx_stats->rs_status & ATH9K_RXERR_MIC) { |
873 | if (ieee80211_is_ctl(fc)) | 873 | /* |
874 | /* | 874 | * The MIC error bit is only valid if the frame |
875 | * Sometimes, we get invalid | 875 | * is not a control frame or fragment, and it was |
876 | * MIC failures on valid control frames. | 876 | * decrypted using a valid TKIP key. |
877 | * Remove these mic errors. | 877 | */ |
878 | */ | 878 | if (!ieee80211_is_ctl(fc) && |
879 | rx_stats->rs_status &= ~ATH9K_RXERR_MIC; | 879 | !ieee80211_has_morefrags(fc) && |
880 | else | 880 | !(le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG) && |
881 | test_bit(rx_stats->rs_keyix, common->tkip_keymap)) | ||
881 | rxs->flag |= RX_FLAG_MMIC_ERROR; | 882 | rxs->flag |= RX_FLAG_MMIC_ERROR; |
883 | else | ||
884 | rx_stats->rs_status &= ~ATH9K_RXERR_MIC; | ||
882 | } | 885 | } |
883 | /* | 886 | /* |
884 | * Reject error frames with the exception of | 887 | * Reject error frames with the exception of |