diff options
author | Sujith Manoharan <c_manoha@qca.qualcomm.com> | 2013-08-13 23:41:20 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-08-15 16:08:05 -0400 |
commit | b09255957b69d7b5ea1ad9d2b455a4f8769e06e7 (patch) | |
tree | ba19e1fd54a3d58a106b3dbb0ad10875b414bfa4 /drivers/net/wireless/ath | |
parent | eb5f952c31abdd5849fb9005beb3dc4ac734c355 (diff) |
ath9k: Handle corrupt descriptors properly
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>
Diffstat (limited to 'drivers/net/wireless/ath')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/recv.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index 5b84ce4ee45e..30cb7267c12b 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
@@ -1099,6 +1099,16 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc, | |||
1099 | if (rx_stats->rs_more) | 1099 | if (rx_stats->rs_more) |
1100 | return 0; | 1100 | return 0; |
1101 | 1101 | ||
1102 | /* | ||
1103 | * Return immediately if the RX descriptor has been marked | ||
1104 | * as corrupt based on the various error bits. | ||
1105 | * | ||
1106 | * This is different from the other corrupt descriptor | ||
1107 | * condition handled above. | ||
1108 | */ | ||
1109 | if (rx_stats->rs_status & ATH9K_RXERR_CORRUPT_DESC) | ||
1110 | return -EINVAL; | ||
1111 | |||
1102 | hdr = (struct ieee80211_hdr *) (skb->data + ah->caps.rx_status_len); | 1112 | hdr = (struct ieee80211_hdr *) (skb->data + ah->caps.rx_status_len); |
1103 | 1113 | ||
1104 | ath9k_process_tsf(rx_stats, rx_status, tsf); | 1114 | ath9k_process_tsf(rx_stats, rx_status, tsf); |
@@ -1335,8 +1345,6 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) | |||
1335 | sc->rx.frag = skb; | 1345 | sc->rx.frag = skb; |
1336 | goto requeue; | 1346 | goto requeue; |
1337 | } | 1347 | } |
1338 | if (rs.rs_status & ATH9K_RXERR_CORRUPT_DESC) | ||
1339 | goto requeue_drop_frag; | ||
1340 | 1348 | ||
1341 | if (sc->rx.frag) { | 1349 | if (sc->rx.frag) { |
1342 | int space = skb->len - skb_tailroom(hdr_skb); | 1350 | int space = skb->len - skb_tailroom(hdr_skb); |