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
Bug: 153043714
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
Change-Id: I2d5696d6143842790fa25218beda12b71cfcc1d6
fourteen
Jaegeuk Kim 5 years ago committed by Jenna
parent d8de83584e
commit f20df49910
  1. 8
      drivers/scsi/ufs/ufshcd.c

@ -9026,8 +9026,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);
@ -9081,6 +9085,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);

Loading…
Cancel
Save