]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: ufs: core: Use link recovery when h8 exit fails during runtime resume
authorSeunghui Lee <sh043.lee@samsung.com>
Thu, 17 Jul 2025 08:12:13 +0000 (17:12 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:22:36 +0000 (16:22 +0200)
[ Upstream commit 35dabf4503b94a697bababe94678a8bc989c3223 ]

If the h8 exit fails during runtime resume process, the runtime thread
enters runtime suspend immediately and the error handler operates at the
same time.  It becomes stuck and cannot be recovered through the error
handler.  To fix this, use link recovery instead of the error handler.

Fixes: 4db7a2360597 ("scsi: ufs: Fix concurrency of error handler and other error recovery paths")
Signed-off-by: Seunghui Lee <sh043.lee@samsung.com>
Link: https://lore.kernel.org/r/20250717081213.6811-1-sh043.lee@samsung.com
Reviewed-by: Bean Huo <beanhuo@micron.com>
Acked-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/ufs/ufshcd.c

index a4c70fbc809f1b47a559416b262440d8836fd22f..a212e6ad11d5f68919de282a244c3fb0f6e4d9de 100644 (file)
@@ -3872,7 +3872,7 @@ out:
        hba->uic_async_done = NULL;
        if (reenable_intr)
                ufshcd_enable_intr(hba, UIC_COMMAND_COMPL);
-       if (ret) {
+       if (ret && !hba->pm_op_in_progress) {
                ufshcd_set_link_broken(hba);
                ufshcd_schedule_eh_work(hba);
        }
@@ -3880,6 +3880,14 @@ out_unlock:
        spin_unlock_irqrestore(hba->host->host_lock, flags);
        mutex_unlock(&hba->uic_cmd_mutex);
 
+       /*
+        * If the h8 exit fails during the runtime resume process, it becomes
+        * stuck and cannot be recovered through the error handler.  To fix
+        * this, use link recovery instead of the error handler.
+        */
+       if (ret && hba->pm_op_in_progress)
+               ret = ufshcd_link_recovery(hba);
+
        return ret;
 }