scsi: ufs: Relocate flush of exceptional event
authorKiwoong Kim <kwmad.kim@samsung.com>
Sat, 19 Dec 2020 06:40:39 +0000 (15:40 +0900)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 6 Jan 2021 03:26:15 +0000 (22:26 -0500)
The current flush location does not guarantee disabling BKOPS for the case
of requesting device power off.

 1) The exceptional event handler is queued

 2) ufs suspend starts with a request of device power off

 3) BKOPS is disabled in ufs suspend

 4) The queued work for the handler is done and BKOPS is re-enabled

Relocate the flush statement to ensure BKOPS remain disabled.

Link: https://lore.kernel.org/r/1608360039-16390-1-git-send-email-kwmad.kim@samsung.com
Reviewed-by: Can Guo <cang@codeaurora.org>
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Kiwoong Kim <kwmad.kim@samsung.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufshcd.c

index 04ab6f2..00ee8ca 100644 (file)
@@ -8696,6 +8696,8 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
                        ufshcd_wb_need_flush(hba));
        }
 
+       flush_work(&hba->eeh_work);
+
        if (req_dev_pwr_mode != hba->curr_dev_pwr_mode) {
                if (!ufshcd_is_runtime_pm(pm_op))
                        /* ensure that bkops is disabled */
@@ -8708,8 +8710,6 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
                }
        }
 
-       flush_work(&hba->eeh_work);
-
        /*
         * In the case of DeepSleep, the device is expected to remain powered
         * with the link off, so do not check for bkops.