• Stanley Chu's avatar
    scsi: ufs: Avoid runtime suspend possibly being blocked forever · 24e2e7a1
    Stanley Chu authored
    UFS runtime suspend can be triggered after pm_runtime_enable() is invoked
    in ufshcd_pltfrm_init(). However if the first runtime suspend is triggered
    before binding ufs_hba structure to ufs device structure via
    platform_set_drvdata(), then UFS runtime suspend will be no longer
    triggered in the future because its dev->power.runtime_error was set in the
    first triggering and does not have any chance to be cleared.
    
    To be more clear, dev->power.runtime_error is set if hba is NULL in
    ufshcd_runtime_suspend() which returns -EINVAL to rpm_callback() where
    dev->power.runtime_error is set as -EINVAL. In this case, any future
    rpm_suspend() for UFS device fails because rpm_check_suspend_allowed()
    fails due to non-zero
    dev->power.runtime_error.
    
    To resolve this issue, make sure the first UFS runtime suspend get valid
    "hba" in ufshcd_runtime_suspend(): Enable UFS runtime PM only after hba is
    successfully bound to UFS device structure.
    
    Fixes: 62694735 ([SCSI] ufs: Add runtime PM support for UFS host controller driver)
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarStanley Chu <stanley.chu@mediatek.com>
    Reviewed-by: default avatarAvri Altman <avri.altman@wdc.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    24e2e7a1
ufshcd-pltfrm.c 12.1 KB