diff options
| author | Stanislaw Gruszka <sgruszka@redhat.com> | 2013-05-02 09:43:57 +0200 | 
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2013-05-03 13:55:08 -0400 | 
| commit | db178340433f90e09ada35c174dfb2c84c2c71f4 (patch) | |
| tree | a31adfbc7a4303c5e9b979299866604bc99bb507 /drivers/net/wireless/ath | |
| parent | 4ef69d0394cba8caa9f75d3f2e53429bfb8b3045 (diff) | |
| download | olio-linux-3.10-db178340433f90e09ada35c174dfb2c84c2c71f4.tar.xz olio-linux-3.10-db178340433f90e09ada35c174dfb2c84c2c71f4.zip  | |
ath5k: do not reschedule tx_complete_work on stop
This patch claim to fix "WARNING: at net/mac80211/util.c:599
ieee80211_can_queue_work.isra.7+0x30/0x40", which was reported at:
https://bugzilla.redhat.com/show_bug.cgi?id=922295
We use ATH_STAT_STARTED flag to disallow to perform
ath5k_tx_complete_poll_work() code, hence reschedule
ah->tx_complete_work, when we stop device. This flag was defined in
ath5k code, but it was not used.
I didn't get feedback if the fix works, so patch is compile only tested.
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath')
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/base.c | 5 | 
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 9b20d9ee271..7f702fe3ecc 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c @@ -2369,6 +2369,9 @@ ath5k_tx_complete_poll_work(struct work_struct *work)  	int i;  	bool needreset = false; +	if (!test_bit(ATH_STAT_STARTED, ah->status)) +		return; +  	mutex_lock(&ah->lock);  	for (i = 0; i < ARRAY_SIZE(ah->txqs); i++) { @@ -2676,6 +2679,7 @@ done:  	mmiowb();  	mutex_unlock(&ah->lock); +	set_bit(ATH_STAT_STARTED, ah->status);  	ieee80211_queue_delayed_work(ah->hw, &ah->tx_complete_work,  			msecs_to_jiffies(ATH5K_TX_COMPLETE_POLL_INT)); @@ -2737,6 +2741,7 @@ void ath5k_stop(struct ieee80211_hw *hw)  	ath5k_stop_tasklets(ah); +	clear_bit(ATH_STAT_STARTED, ah->status);  	cancel_delayed_work_sync(&ah->tx_complete_work);  	if (!ath5k_modparam_no_hw_rfkill_switch)  |