From 51276d653be32e61861c5537f1d388c9fa2a3ae6 Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Mon, 1 Jun 2020 21:07:09 -0700 Subject: [PATCH] scsi: ufs: Fix pm_runtime count in reset flow ufshcd_probe_hba() puts pm_runtime all the time. So, during the reset flow, we need to get one. pm_runtime_get_sync (1) ufshcd_async_scan pm_runtime_get_sync (2) ufshcd_hold_all ufshcd_probe_hba - pm_runtime_put_sync (1) - ufshcd_reset_and_restore - ufshcd_detect_device - ufshcd_host_reset_and_restore - ufshcd_probe_hba - pm_runtime_put_sync (0) ufshcd_release_all pm_runtime_put_sync (-1) Bug: 157744625 Signed-off-by: Jaegeuk Kim Change-Id: I2d5696d6143842790fa25218beda12b71cfcc1d6 Signed-off-by: Yaroslav Furman Signed-off-by: onettboots --- drivers/scsi/ufs/ufshcd.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 61f0f06de0b8..8a8a97a33b8f 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -7972,8 +7972,12 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba *hba) ufshcd_set_clk_freq(hba, true); err = ufshcd_hba_enable(hba); - if (err) + if (err) { + /* ufshcd_probe_hba() will put it */ + if (!ufshcd_eh_in_progress(hba) && !hba->pm_op_in_progress) + pm_runtime_put_sync(hba->dev); goto out; + } /* Establish the link again and restore the device */ err = ufshcd_probe_hba(hba); @@ -8024,6 +8028,8 @@ static int ufshcd_reset_and_restore(struct ufs_hba *hba) ufshcd_enable_irq(hba); do { + if (!ufshcd_eh_in_progress(hba) && !hba->pm_op_in_progress) + pm_runtime_get_sync(hba->dev); err = ufshcd_detect_device(hba); } while (err && --retries);