aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSenthil Balasubramanian <senthilkumar@atheros.com>2008-12-09 06:53:33 -0500
committerJohn W. Linville <linville@tuxdriver.com>2008-12-12 14:01:37 -0500
commita07d3619faeea3f540dd55f86685136f8928b4ad (patch)
treed836b56689793fe6991cbce837a3387d4ad7bb15 /drivers
parentb143923689fdcc8e56688f2506a11ff16e4cd20b (diff)
ath9k: BH shouldn't be enabled when hardirqs are disabled.
ath_tx_complete_buf uses a BH version of spinlock and so releasing the lock enables BH which is incorrect when called from sta_notify callback as MAC80211 disables hardirqs before the driver callback is called. As ath_tx_complete_buf is shared between user and softirq context using normal spinlock may not be appropriate. Though the proper fix would be to cleanup the context properly in the driver code, this would be an interim fix to avoid kernel warning. Signed-off-by: Senthil Balasubramanian <senthilkumar@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/ath9k/xmit.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c
index ec359c624831..e2e847db0891 100644
--- a/drivers/net/wireless/ath9k/xmit.c
+++ b/drivers/net/wireless/ath9k/xmit.c
@@ -310,6 +310,7 @@ static void ath_tx_complete_buf(struct ath_softc *sc,
310{ 310{
311 struct sk_buff *skb = bf->bf_mpdu; 311 struct sk_buff *skb = bf->bf_mpdu;
312 struct ath_xmit_status tx_status; 312 struct ath_xmit_status tx_status;
313 unsigned long flags;
313 314
314 /* 315 /*
315 * Set retry information. 316 * Set retry information.
@@ -340,9 +341,9 @@ static void ath_tx_complete_buf(struct ath_softc *sc,
340 /* 341 /*
341 * Return the list of ath_buf of this mpdu to free queue 342 * Return the list of ath_buf of this mpdu to free queue
342 */ 343 */
343 spin_lock_bh(&sc->sc_txbuflock); 344 spin_lock_irqsave(&sc->sc_txbuflock, flags);
344 list_splice_tail_init(bf_q, &sc->sc_txbuf); 345 list_splice_tail_init(bf_q, &sc->sc_txbuf);
345 spin_unlock_bh(&sc->sc_txbuflock); 346 spin_unlock_irqrestore(&sc->sc_txbuflock, flags);
346} 347}
347 348
348/* 349/*