drivers/ufs/core/ufshcd.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
UFS RTC support schedules ufs_rtc_update_work to periodically update the
device RTC. The work can issue query commands and access the UFS host
controller.
A previous change moved the RTC work cancellation before the PRE_CHANGE
vendor suspend callback to close a race in the common suspend path.
However, the active-active path jumps directly to vops_suspend after
flushing exception handling work and therefore bypasses the
cancellation.
If the RTC work runs while the vendor suspend callback is gating or
otherwise changing hardware state, it can access the controller during
suspend and trigger an SError.
Cancel the RTC work before entering the vendor suspend callback in the
active-active path. Since this path now cancels the work, move the RTC
work scheduling outside the device and link state restoration block in
the resume path. This restarts RTC updates after an active-active
suspend and resume cycle.
Fixes: b0bd84c39289 ("scsi: ufs: core: Fix SError in ufshcd_rtc_work() during UFS suspend")
Signed-off-by: Guangshuo Li <lgs201920130244@gmail.com>
---
v2:
- Correct the Fixes tag.
- Restart the RTC update work from the common resume path.
drivers/ufs/core/ufshcd.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index d3044a3089b5..c3b105b2678e 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -10269,6 +10269,7 @@ static int __ufshcd_wl_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
req_link_state == UIC_LINK_ACTIVE_STATE) {
ufshcd_disable_auto_bkops(hba);
flush_work(&hba->eeh_work);
+ cancel_delayed_work_sync(&hba->ufs_rtc_update_work);
goto vops_suspend;
}
@@ -10478,10 +10479,11 @@ static int __ufshcd_wl_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
if (ret)
goto set_old_link_state;
ufshcd_set_timestamp_attr(hba);
- schedule_delayed_work(&hba->ufs_rtc_update_work,
- msecs_to_jiffies(UFS_RTC_UPDATE_INTERVAL_MS));
}
+ schedule_delayed_work(&hba->ufs_rtc_update_work,
+ msecs_to_jiffies(UFS_RTC_UPDATE_INTERVAL_MS));
+
if (ufshcd_keep_autobkops_enabled_except_suspend(hba))
ufshcd_enable_auto_bkops(hba);
else
--
2.43.0
On 7/14/26 10:27 AM, Guangshuo Li wrote: > Cancel the RTC work before entering the vendor suspend callback in the > active-active path. Since this path now cancels the work, move the RTC > work scheduling outside the device and link state restoration block in > the resume path. This restarts RTC updates after an active-active > suspend and resume cycle. Reviewed-by: Bart Van Assche <bvanassche@acm.org>
On Wed, 2026-07-15 at 01:27 +0800, Guangshuo Li wrote:
> controller.
>
> A previous change moved the RTC work cancellation before the PRE_CHANGE
> vendor suspend callback to close a race in the common suspend path.
> However, the active-active path jumps directly to vops_suspend after
> flushing exception handling work and therefore bypasses the
> cancellation.
>
> If the RTC work runs while the vendor suspend callback is gating or
> otherwise changing hardware state, it can access the controller during
> suspend and trigger an SError.
>
> Cancel the RTC work before entering the vendor suspend callback in the
> active-active path. Since this path now cancels the work, move the RTC
> work scheduling outside the device and link state restoration block in
> the resume path. This restarts RTC updates after an active-active
> suspend and resume cycle.
>
> Fixes: b0bd84c39289 ("scsi: ufs: core: Fix SError in ufshcd_rtc_work() during
> UFS suspend")
> Signed-off-by: Guangshuo Li <lgs201920130244@gmail.com>
Reviewed-by: Bean Huo <beanhuo@micron.com>
On Wed, 2026-07-15 at 01:27 +0800, Guangshuo Li wrote:
> UFS RTC support schedules ufs_rtc_update_work to periodically update
> the
> device RTC. The work can issue query commands and access the UFS host
> controller.
>
> A previous change moved the RTC work cancellation before the
> PRE_CHANGE
> vendor suspend callback to close a race in the common suspend path.
> However, the active-active path jumps directly to vops_suspend after
> flushing exception handling work and therefore bypasses the
> cancellation.
>
> If the RTC work runs while the vendor suspend callback is gating or
> otherwise changing hardware state, it can access the controller
> during
> suspend and trigger an SError.
>
> Cancel the RTC work before entering the vendor suspend callback in
> the
> active-active path. Since this path now cancels the work, move the
> RTC
> work scheduling outside the device and link state restoration block
> in
> the resume path. This restarts RTC updates after an active-active
> suspend and resume cycle.
>
> Fixes: b0bd84c39289 ("scsi: ufs: core: Fix SError in
> ufshcd_rtc_work() during UFS suspend")
> Signed-off-by: Guangshuo Li <lgs201920130244@gmail.com>
> ---
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
© 2016 - 2026 Red Hat, Inc.