|
@@ -957,6 +957,8 @@ static void wl1271_recovery_work(struct work_struct *work)
|
|
|
BUG_ON(wl->conf.recovery.bug_on_recovery &&
|
|
|
!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags));
|
|
|
|
|
|
+ clear_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
|
|
|
+
|
|
|
if (wl->conf.recovery.no_recovery) {
|
|
|
wl1271_info("No recovery (chosen on module load). Fw will remain stuck.");
|
|
|
goto out_unlock;
|
|
@@ -6710,6 +6712,7 @@ static int __maybe_unused wlcore_runtime_resume(struct device *dev)
|
|
|
int ret;
|
|
|
unsigned long start_time = jiffies;
|
|
|
bool pending = false;
|
|
|
+ bool recovery = false;
|
|
|
|
|
|
/* Nothing to do if no ELP mode requested */
|
|
|
if (!test_bit(WL1271_FLAG_IN_ELP, &wl->flags))
|
|
@@ -6726,7 +6729,7 @@ static int __maybe_unused wlcore_runtime_resume(struct device *dev)
|
|
|
|
|
|
ret = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP);
|
|
|
if (ret < 0) {
|
|
|
- wl12xx_queue_recovery_work(wl);
|
|
|
+ recovery = true;
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
@@ -6734,11 +6737,12 @@ static int __maybe_unused wlcore_runtime_resume(struct device *dev)
|
|
|
ret = wait_for_completion_timeout(&compl,
|
|
|
msecs_to_jiffies(WL1271_WAKEUP_TIMEOUT));
|
|
|
if (ret == 0) {
|
|
|
- wl1271_error("ELP wakeup timeout!");
|
|
|
- wl12xx_queue_recovery_work(wl);
|
|
|
+ wl1271_warning("ELP wakeup timeout!");
|
|
|
|
|
|
/* Return no error for runtime PM for recovery */
|
|
|
- return 0;
|
|
|
+ ret = 0;
|
|
|
+ recovery = true;
|
|
|
+ goto err;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -6753,6 +6757,12 @@ err:
|
|
|
spin_lock_irqsave(&wl->wl_lock, flags);
|
|
|
wl->elp_compl = NULL;
|
|
|
spin_unlock_irqrestore(&wl->wl_lock, flags);
|
|
|
+
|
|
|
+ if (recovery) {
|
|
|
+ set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
|
|
|
+ wl12xx_queue_recovery_work(wl);
|
|
|
+ }
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|