wlcore: Fix timout errors after recovery
authorTony Lindgren <tony@atomide.com>
Tue, 19 Jun 2018 09:43:39 +0000 (02:43 -0700)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 27 Jun 2018 15:45:12 +0000 (18:45 +0300)
After enabling runtime PM, if we force hardware reset multiple times with:

# echo 1 > /sys/kernel/debug/ieee80211/phy0/wlcore/start_recovery

We will after few tries get the following error:

wlcore: ERROR timeout waiting for the hardware to complete initialization

And then wlcore is unable to reconnect until after the wlcore related modules
are reloaded.

Let's fix this by moving pm_runtime_put() earlier before we restart the hardware.
And let's use the sync version to make sure we're done before we restart.

Note that we still will get -EBUSY warning from wl12xx_sdio_set_power() but let's
fix that separately once we know exactly why we get the warning.

Reported-by: Eyal Reizer <eyalr@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ti/wlcore/main.c

index 8eccd0d..398d6d9 100644 (file)
@@ -977,6 +977,7 @@ static void wl1271_recovery_work(struct work_struct *work)
        }
 
        wlcore_op_stop_locked(wl);
+       pm_runtime_put_sync(wl->dev);
 
        ieee80211_restart_hw(wl->hw);
 
@@ -986,8 +987,6 @@ static void wl1271_recovery_work(struct work_struct *work)
         */
        wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_FW_RESTART);
 
-       pm_runtime_put(wl->dev);
-
 out_unlock:
        wl->watchdog_recovery = false;
        clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);