aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath
diff options
context:
space:
mode:
authorSujith Manoharan <c_manoha@qca.qualcomm.com>2013-08-13 23:41:20 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-08-15 16:08:05 -0400
commitb09255957b69d7b5ea1ad9d2b455a4f8769e06e7 (patch)
treeba19e1fd54a3d58a106b3dbb0ad10875b414bfa4 /drivers/net/wireless/ath
parenteb5f952c31abdd5849fb9005beb3dc4ac734c355 (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.c12
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);