]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: ufs: rockchip: Reset controller on PRE_CHANGE of hce enable notify
authorShawn Lin <shawn.lin@rock-chips.com>
Thu, 13 Nov 2025 04:52:55 +0000 (12:52 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 20 Nov 2025 03:33:36 +0000 (22:33 -0500)
This fixes the dme-reset failed when doing recovery. Because device
reset is not enough, we could occasionally see the error below:

ufshcd-rockchip 2a2d0000.ufs: uic cmd 0x14 with arg3 0x0 completion timeout
ufshcd-rockchip 2a2d0000.ufs: dme-reset: error code -110
ufshcd-rockchip 2a2d0000.ufs: DME_RESET failed
ufshcd-rockchip 2a2d0000.ufs: ufshcd_host_reset_and_restore: Host init failed -110

Fix this by resetting the controller on PRE_CHANGE stage of hce enable
notify.

Fixes: d3cbe455d6eb ("scsi: ufs: rockchip: Initial support for UFS")
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Link: https://patch.msgid.link/1763009575-237552-1-git-send-email-shawn.lin@rock-chips.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/host/ufs-rockchip.c

index 8754085dd0ccf49f3df901fce4ab8699ea9ccf0f..8cecb28cdce411cef3ccb40487bba7236e55cc08 100644 (file)
 #include "ufshcd-pltfrm.h"
 #include "ufs-rockchip.h"
 
+static void ufs_rockchip_controller_reset(struct ufs_rockchip_host *host)
+{
+       reset_control_assert(host->rst);
+       udelay(1);
+       reset_control_deassert(host->rst);
+}
+
 static int ufs_rockchip_hce_enable_notify(struct ufs_hba *hba,
                                         enum ufs_notify_change_status status)
 {
+       struct ufs_rockchip_host *host = ufshcd_get_variant(hba);
        int err = 0;
 
        if (status == POST_CHANGE) {
@@ -37,6 +45,9 @@ static int ufs_rockchip_hce_enable_notify(struct ufs_hba *hba,
                return ufshcd_vops_phy_initialization(hba);
        }
 
+       /* PRE_CHANGE */
+       ufs_rockchip_controller_reset(host);
+
        return 0;
 }
 
@@ -156,9 +167,7 @@ static int ufs_rockchip_common_init(struct ufs_hba *hba)
                return dev_err_probe(dev, PTR_ERR(host->rst),
                                "failed to get reset control\n");
 
-       reset_control_assert(host->rst);
-       udelay(1);
-       reset_control_deassert(host->rst);
+       ufs_rockchip_controller_reset(host);
 
        host->ref_out_clk = devm_clk_get_enabled(dev, "ref_out");
        if (IS_ERR(host->ref_out_clk))
@@ -282,9 +291,7 @@ static int ufs_rockchip_runtime_resume(struct device *dev)
                return err;
        }
 
-       reset_control_assert(host->rst);
-       udelay(1);
-       reset_control_deassert(host->rst);
+       ufs_rockchip_controller_reset(host);
 
        return ufshcd_runtime_resume(dev);
 }