aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/xmit.c
diff options
context:
space:
mode:
authorVasanthakumar Thiagarajan <vasanth@atheros.com>2010-06-24 05:42:44 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-06-24 15:42:39 -0400
commitca369eb494e45a3e3b8960775f88125fe1fbb0f2 (patch)
tree2a53c84c5d848e73a271005df56b754334e5d1a2 /drivers/net/wireless/ath/ath9k/xmit.c
parent75f64dd54a185150ebfc45e99351c890d4a2252f (diff)
ath9k: Fix bug in paprd
It is possbile that the transmission of paprd test frame might not get completed in 100ms if tx is stuck. Freeing this skb upon timeout in ath_paprd_calibrate() will result in accessing already freed memory when the associated pending buffer is drained in txq. This patch fixes this issue. Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/xmit.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 20221b8c04fd..edbeffb14a1c 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1644,6 +1644,8 @@ static int ath_tx_setup_buffer(struct ieee80211_hw *hw, struct ath_buf *bf,
1644 } 1644 }
1645 1645
1646 bf->bf_state.bfs_paprd = txctl->paprd; 1646 bf->bf_state.bfs_paprd = txctl->paprd;
1647 if (txctl->paprd)
1648 bf->bf_state.bfs_paprd_timestamp = jiffies;
1647 bf->bf_flags = setup_tx_flags(skb, use_ldpc); 1649 bf->bf_flags = setup_tx_flags(skb, use_ldpc);
1648 1650
1649 bf->bf_keytype = get_hw_crypto_keytype(skb); 1651 bf->bf_keytype = get_hw_crypto_keytype(skb);
@@ -1944,8 +1946,14 @@ static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
1944 dma_unmap_single(sc->dev, bf->bf_dmacontext, skb->len, DMA_TO_DEVICE); 1946 dma_unmap_single(sc->dev, bf->bf_dmacontext, skb->len, DMA_TO_DEVICE);
1945 1947
1946 if (bf->bf_state.bfs_paprd) { 1948 if (bf->bf_state.bfs_paprd) {
1947 sc->paprd_txok = txok; 1949 if (time_after(jiffies,
1948 complete(&sc->paprd_complete); 1950 bf->bf_state.bfs_paprd_timestamp +
1951 msecs_to_jiffies(ATH_PAPRD_TIMEOUT))) {
1952 dev_kfree_skb_any(skb);
1953 } else {
1954 sc->paprd_txok = txok;
1955 complete(&sc->paprd_complete);
1956 }
1949 } else { 1957 } else {
1950 ath_tx_complete(sc, skb, bf->aphy, tx_flags); 1958 ath_tx_complete(sc, skb, bf->aphy, tx_flags);
1951 ath_debug_stat_tx(sc, txq, bf, ts); 1959 ath_debug_stat_tx(sc, txq, bf, ts);