during suspend/S3 state drv_flush is called from mac80211 irrespective of
interface count. In ath9k we queue a work in ath9k_flush which we expect
to be cancelled in the drv_stop call back. during suspend process mac80211
calls drv_stop only when the interface count(local->count) is non-zero.
unfortunately when the network manager is enabled, drv_flush is called
while drv_stop is not called as local->count reaches '0'.
So fix this by simply checking for the device presence in the
drv_flush call back in the driver before queueing work or anything else.
this patch fixes the following WARNING
Call Trace:
[<
c014c6e2>] warn_slowpath_common+0x72/0xa0
[<
fc133f99>] ? ieee80211_can_queue_work+0x39/0x50 [mac80211]
[<
fc133f99>] ? ieee80211_can_queue_work+0x39/0x50 [mac80211]
[<
c014c75b>] warn_slowpath_fmt+0x2b/0x30
[<
fc133f99>] ieee80211_can_queue_work+0x39/0x50 [mac80211]
[<
fc134ed1>] ieee80211_queue_delayed_work+0x21/0x50 [mac80211]
[<
fc1e5b22>] ath_tx_complete_poll_work+0xb2/0x100 [ath9k]
[<
c016399e>] run_workqueue+0x8e/0x150
[<
fc1e5a70>] ? ath_tx_complete_poll_work+0x0/0x100 [ath9k]
[<
c0163ae4>] worker_thread+0x84/0xe0
[<
c0167a60>] ? autoremove_wake_function+0x0/0x50
[<
c0163a60>] ? worker_thread+0x0/0xe0
[<
c01677d4>] kthread+0x74/0x80
[<
c0167760>] ? kthread+0x0/0x80
[<
c0104087>] kernel_thread_helper+0x7/0x10
---[ end trace
2aff81010df9215b ]---
Signed-off-by: Rajkumar Manoharan <rmanoharan@atheros.com>
Signed-off-by: Mohammed Shafi Shajakhan <mshajakhan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
static void ath9k_flush(struct ieee80211_hw *hw, bool drop)
{
struct ath_softc *sc = hw->priv;
+ struct ath_hw *ah = sc->sc_ah;
+ struct ath_common *common = ath9k_hw_common(ah);
int timeout = 200; /* ms */
int i, j;
cancel_delayed_work_sync(&sc->tx_complete_work);
+ if (sc->sc_flags & SC_OP_INVALID) {
+ ath_dbg(common, ATH_DBG_ANY, "Device not present\n");
+ mutex_unlock(&sc->mutex);
+ return;
+ }
+
if (drop)
timeout = 1;