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 <jaegeuk@google.com>
Change-Id: I2d5696d6143842790fa25218beda12b71cfcc1d6
Signed-off-by: Yaroslav Furman <yaro330@gmail.com>
Signed-off-by: alanndz <alanndz7@gmail.com>
Signed-off-by: azrim <mirzaspc@gmail.com>
This commit is contained in:
Jaegeuk Kim 2020-06-01 21:07:09 -07:00 committed by azrim
parent ac6cccc8c1
commit 8fc1377131
No known key found for this signature in database
GPG Key ID: 497F8FB059B45D1C

View File

@ -7966,8 +7966,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);
@ -8018,6 +8022,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);