aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis R. Rodriguez <[email protected]>2010-10-20 23:07:04 +0000
committerJohn W. Linville <[email protected]>2010-10-27 19:41:14 +0000
commit7583c550c3e635dcc61ab127c36ecefd59fb8dc8 (patch)
tree6f6ba84e24622bc0c15e81b3510e28bf234a87a9
parentath9k: add locking for stopping RX (diff)
downloadkernel-7583c550c3e635dcc61ab127c36ecefd59fb8dc8.tar.gz
kernel-7583c550c3e635dcc61ab127c36ecefd59fb8dc8.zip
ath9k: add locking for starting the PCU on RX
There was some locking for starting some parts of RX but not for starting the PCU. Include this otherwise we can content against stopping the PCU. This can potentially lead to races against different buffers on the PCU which can lead to to the DMA RX engine writing to buffers which are already freed. This is part of a series that will help resolve the bug: https://bugzilla.kernel.org/show_bug.cgi?id=14624 For more details about this issue refer to: http://marc.info/?l=linux-wireless&m=128629803703756&w=2 Cc: [email protected] Cc: Ben Greear <[email protected]> Cc: Kyungwan Nam <[email protected]> Signed-off-by: Luis R. Rodriguez <[email protected]> Tested-by: Ben Greear <[email protected]> Signed-off-by: John W. Linville <[email protected]>
-rw-r--r--drivers/net/wireless/ath/ath9k/recv.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index e581b1f6c40c..b3c9baf855c4 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -297,11 +297,11 @@ static void ath_edma_start_recv(struct ath_softc *sc)
ath_rx_addbuffer_edma(sc, ATH9K_RX_QUEUE_LP,
sc->rx.rx_edma[ATH9K_RX_QUEUE_LP].rx_fifo_hwsize);
- spin_unlock_bh(&sc->rx.rxbuflock);
-
ath_opmode_init(sc);
ath9k_hw_startpcureceive(sc->sc_ah, (sc->sc_flags & SC_OP_OFFCHANNEL));
+
+ spin_unlock_bh(&sc->rx.rxbuflock);
}
static void ath_edma_stop_recv(struct ath_softc *sc)
@@ -504,10 +504,11 @@ int ath_startrecv(struct ath_softc *sc)
ath9k_hw_rxena(ah);
start_recv:
- spin_unlock_bh(&sc->rx.rxbuflock);
ath_opmode_init(sc);
ath9k_hw_startpcureceive(ah, (sc->sc_flags & SC_OP_OFFCHANNEL));
+ spin_unlock_bh(&sc->rx.rxbuflock);
+
return 0;
}