FAILED: patch "[PATCH] scsi: ufs: Avoid runtime suspend possibly being blocked" failed to apply to 4.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 24e2e7a19f7e4b83d0d5189040d997bce3596473 Mon Sep 17 00:00:00 2001
From: Stanley Chu <[email protected]>
Date: Wed, 12 Jun 2019 23:19:05 +0800
Subject: [PATCH] scsi: ufs: Avoid runtime suspend possibly being blocked
forever
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-zerodev->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.
drivers/scsi/ufs/ufshcd-pltfrm.c +4 -7
@@ -430,24 +430,21 @@ int ufshcd_pltfrm_init(struct platform_device *pdev, goto dealloc_host; } -pm_runtime_set_active (&pdev->dev); -pm_runtime_enable (&pdev->dev); -ufshcd_init_lanes_per_dir (hba); err =ufshcd_init (hba, mmio_base, irq);if (err) {dev_err (dev,"Initialization failed\n" ); - goto out_disable_rpm; + goto dealloc_host; }platform_set_drvdata (pdev, hba); +pm_runtime_set_active (&pdev->dev); +pm_runtime_enable (&pdev->dev); +return 0 ; -out_disable_rpm: -pm_runtime_disable (&pdev->dev); -pm_runtime_set_suspended (&pdev->dev); dealloc_host:ufshcd_dealloc_host (hba); out: