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;
        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))
 
        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;
        }
 
                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;
                }
        }
 
        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;
 }