linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements
@ 2025-08-25 10:10 peter.wang
  2025-08-25 10:10 ` [PATCH v1 01/10] ufs: host: mediatek: Enhance recovery on hibernation exit failure peter.wang
                   ` (9 more replies)
  0 siblings, 10 replies; 13+ messages in thread
From: peter.wang @ 2025-08-25 10:10 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, jiajie.hao, yi-fan.peng,
	qilin.tan, lin.gui, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	sanjeev.y

From: Peter Wang <peter.wang@mediatek.com>

These patches collectively enhance the UFS host driver's reliability,
power management efficiency, and error recovery mechanisms on MediaTek
platforms. They address critical issues and introduce optimizations
that improve system stability and performance.

Peter Wang (7):
  ufs: host: mediatek: Enhance recovery on hibernation exit failure
  ufs: host: mediatek: Enhance recovery on resume failure
  ufs: host: mediatek: Correct system PM flow
  ufs: host: mediatek: Support UFS PHY runtime PM and correct sequence
  ufs: host: mediatek: Disable auto-hibern8 during power mode changes
  ufs: host: mediatek: Fix unbalanced IRQ enable issue
  ufs: host: mediatek: Fix device power control

Alice Chao (2):
  ufs: host: mediatek: Correct resume flow for LPM and MTCMOS
  ufs: host: mediatek: Fix adapt issue after PA_Init

Sanjeev Y (1):
  ufs: host: mediatek: Return error directly on idle wait timeout

 drivers/ufs/host/ufs-mediatek.c | 176 ++++++++++++++++++++++++++------
 drivers/ufs/host/ufs-mediatek.h |   1 +
 2 files changed, 147 insertions(+), 30 deletions(-)

-- 
2.45.2


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v1 01/10] ufs: host: mediatek: Enhance recovery on hibernation exit failure
  2025-08-25 10:10 [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements peter.wang
@ 2025-08-25 10:10 ` peter.wang
  2025-08-25 15:46   ` Bart Van Assche
  2025-08-25 10:10 ` [PATCH v1 02/10] ufs: host: mediatek: Enhance recovery on resume failure peter.wang
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 13+ messages in thread
From: peter.wang @ 2025-08-25 10:10 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, jiajie.hao, yi-fan.peng,
	qilin.tan, lin.gui, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	sanjeev.y

From: Peter Wang <peter.wang@mediatek.com>

This patch improves the recovery process when exiting hibernation
mode fails. It triggers the error handler and breaks the suspend
operation, ensuring that the system can recover from hibernation
errors more effectively. The error handling mechanism is activated
by setting 'force_reset' and scheduling the error handler work.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
---
 drivers/ufs/host/ufs-mediatek.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index 5ef0ba4527e4..3882bcc85305 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -1686,8 +1686,9 @@ static void ufs_mtk_dev_vreg_set_lpm(struct ufs_hba *hba, bool lpm)
 	}
 }
 
-static void ufs_mtk_auto_hibern8_disable(struct ufs_hba *hba)
+static int ufs_mtk_auto_hibern8_disable(struct ufs_hba *hba)
 {
+	unsigned long flags;
 	int ret;
 
 	/* disable auto-hibern8 */
@@ -1697,8 +1698,20 @@ static void ufs_mtk_auto_hibern8_disable(struct ufs_hba *hba)
 	ufs_mtk_wait_idle_state(hba, 5);
 
 	ret = ufs_mtk_wait_link_state(hba, VS_LINK_UP, 100);
-	if (ret)
+	if (ret) {
 		dev_warn(hba->dev, "exit h8 state fail, ret=%d\n", ret);
+
+		spin_lock_irqsave(hba->host->host_lock, flags);
+		hba->force_reset = true;
+		hba->ufshcd_state = UFSHCD_STATE_EH_SCHEDULED_FATAL;
+		schedule_work(&hba->eh_work);
+		spin_unlock_irqrestore(hba->host->host_lock, flags);
+
+		/* trigger error handler and break suspend */
+		ret = -EBUSY;
+	}
+
+	return ret;
 }
 
 static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
@@ -1709,7 +1722,7 @@ static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
 
 	if (status == PRE_CHANGE) {
 		if (ufshcd_is_auto_hibern8_supported(hba))
-			ufs_mtk_auto_hibern8_disable(hba);
+			return ufs_mtk_auto_hibern8_disable(hba);
 		return 0;
 	}
 
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 02/10] ufs: host: mediatek: Enhance recovery on resume failure
  2025-08-25 10:10 [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements peter.wang
  2025-08-25 10:10 ` [PATCH v1 01/10] ufs: host: mediatek: Enhance recovery on hibernation exit failure peter.wang
@ 2025-08-25 10:10 ` peter.wang
  2025-08-25 10:10 ` [PATCH v1 03/10] ufs: host: mediatek: Correct system PM flow peter.wang
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: peter.wang @ 2025-08-25 10:10 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, jiajie.hao, yi-fan.peng,
	qilin.tan, lin.gui, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	sanjeev.y

From: Peter Wang <peter.wang@mediatek.com>

This patch improves the recovery process when a resume operation
fails. If both the resume and recovery fail, it logs the device's
power status and returns 0 to prevent I/O hang..

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
---
 drivers/ufs/host/ufs-mediatek.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index 3882bcc85305..d396878cc9a4 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -1780,8 +1780,21 @@ static int ufs_mtk_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
 	}
 
 	return 0;
+
 fail:
-	return ufshcd_link_recovery(hba);
+	/*
+	 * Check if the platform (parent) device has resumed, and ensure that
+	 * power, clock, and MTCMOS are all turned on.
+	 */
+	err = ufshcd_link_recovery(hba);
+	if (err) {
+		dev_err(hba->dev, "Device PM: req=%d, status:%d, err:%d\n",
+			hba->dev->power.request,
+			hba->dev->power.runtime_status,
+			hba->dev->power.runtime_error);
+	}
+
+	return 0; /* Cannot return a failure, otherwise, the I/O will hang. */
 }
 
 static void ufs_mtk_dbg_register_dump(struct ufs_hba *hba)
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 03/10] ufs: host: mediatek: Correct system PM flow
  2025-08-25 10:10 [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements peter.wang
  2025-08-25 10:10 ` [PATCH v1 01/10] ufs: host: mediatek: Enhance recovery on hibernation exit failure peter.wang
  2025-08-25 10:10 ` [PATCH v1 02/10] ufs: host: mediatek: Enhance recovery on resume failure peter.wang
@ 2025-08-25 10:10 ` peter.wang
  2025-08-25 10:10 ` [PATCH v1 04/10] ufs: host: mediatek: Correct resume flow for LPM and MTCMOS peter.wang
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: peter.wang @ 2025-08-25 10:10 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, jiajie.hao, yi-fan.peng,
	qilin.tan, lin.gui, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	sanjeev.y

From: Peter Wang <peter.wang@mediatek.com>

This patch refines the system power management (PM) flow by
skipping low power mode (LPM) and MTCMOS settings if runtime PM
has already been applied. This optimization prevents redundant
operations, ensuring a more efficient PM process.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
---
 drivers/ufs/host/ufs-mediatek.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index d396878cc9a4..1a8848246611 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -2309,27 +2309,38 @@ static int ufs_mtk_system_suspend(struct device *dev)
 
 	ret = ufshcd_system_suspend(dev);
 	if (ret)
-		return ret;
+		goto out;
+
+	if (pm_runtime_suspended(hba->dev))
+		goto out;
 
 	ufs_mtk_dev_vreg_set_lpm(hba, true);
 
 	if (ufs_mtk_is_rtff_mtcmos(hba))
 		ufs_mtk_mtcmos_ctrl(false, res);
 
-	return 0;
+out:
+	return ret;
 }
 
 static int ufs_mtk_system_resume(struct device *dev)
 {
+	int ret = 0;
 	struct ufs_hba *hba = dev_get_drvdata(dev);
 	struct arm_smccc_res res;
 
+	if (pm_runtime_suspended(hba->dev))
+		goto out;
+
 	ufs_mtk_dev_vreg_set_lpm(hba, false);
 
 	if (ufs_mtk_is_rtff_mtcmos(hba))
 		ufs_mtk_mtcmos_ctrl(true, res);
 
-	return ufshcd_system_resume(dev);
+out:
+	ret = ufshcd_system_resume(dev);
+
+	return ret;
 }
 #endif
 
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 04/10] ufs: host: mediatek: Correct resume flow for LPM and MTCMOS
  2025-08-25 10:10 [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements peter.wang
                   ` (2 preceding siblings ...)
  2025-08-25 10:10 ` [PATCH v1 03/10] ufs: host: mediatek: Correct system PM flow peter.wang
@ 2025-08-25 10:10 ` peter.wang
  2025-08-25 10:10 ` [PATCH v1 05/10] ufs: host: mediatek: Support UFS PHY runtime PM and correct sequence peter.wang
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: peter.wang @ 2025-08-25 10:10 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, jiajie.hao, yi-fan.peng,
	qilin.tan, lin.gui, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	sanjeev.y

From: Alice Chao <alice.chao@mediatek.com>

This patch corrects the system resume flow by ensuring that MTCMOS
is turned on before setting LPM to false.
During system suspend, LPM is set to true and MTCMOS is turned off.
The updated resume sequence ensures proper power management and
system stability.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Alice Chao <alice.chao@mediatek.com>
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
---
 drivers/ufs/host/ufs-mediatek.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index 1a8848246611..9c90d804aaa0 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -2332,11 +2332,11 @@ static int ufs_mtk_system_resume(struct device *dev)
 	if (pm_runtime_suspended(hba->dev))
 		goto out;
 
-	ufs_mtk_dev_vreg_set_lpm(hba, false);
-
 	if (ufs_mtk_is_rtff_mtcmos(hba))
 		ufs_mtk_mtcmos_ctrl(true, res);
 
+	ufs_mtk_dev_vreg_set_lpm(hba, false);
+
 out:
 	ret = ufshcd_system_resume(dev);
 
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 05/10] ufs: host: mediatek: Support UFS PHY runtime PM and correct sequence
  2025-08-25 10:10 [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements peter.wang
                   ` (3 preceding siblings ...)
  2025-08-25 10:10 ` [PATCH v1 04/10] ufs: host: mediatek: Correct resume flow for LPM and MTCMOS peter.wang
@ 2025-08-25 10:10 ` peter.wang
  2025-08-25 10:10 ` [PATCH v1 06/10] ufs: host: mediatek: Disable auto-hibern8 during power mode changes peter.wang
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: peter.wang @ 2025-08-25 10:10 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, jiajie.hao, yi-fan.peng,
	qilin.tan, lin.gui, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	sanjeev.y

From: Peter Wang <peter.wang@mediatek.com>

This patch adds support for UFS PHY runtime power management by
probing the PHY device and enabling its runtime PM. It ensures the
correct sequence of operations during suspend and resume:
PHY suspend -> UFS suspend -> UFS resume -> PHY resume.
This enhancement improves power management efficiency and system
stability.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
---
 drivers/ufs/host/ufs-mediatek.c | 53 +++++++++++++++++++++++++++++----
 drivers/ufs/host/ufs-mediatek.h |  1 +
 2 files changed, 48 insertions(+), 6 deletions(-)

diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index 9c90d804aaa0..f9def0b68921 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -2248,10 +2248,12 @@ static const struct ufs_hba_variant_ops ufs_hba_mtk_vops = {
 static int ufs_mtk_probe(struct platform_device *pdev)
 {
 	int err;
-	struct device *dev = &pdev->dev;
-	struct device_node *reset_node;
-	struct platform_device *reset_pdev;
+	struct device *dev = &pdev->dev, *phy_dev = NULL;
+	struct device_node *reset_node, *phy_node = NULL;
+	struct platform_device *reset_pdev, *phy_pdev = NULL;
 	struct device_link *link;
+	struct ufs_hba *hba;
+	struct ufs_mtk_host *host;
 
 	reset_node = of_find_compatible_node(NULL, NULL,
 					     "ti,syscon-reset");
@@ -2278,13 +2280,44 @@ static int ufs_mtk_probe(struct platform_device *pdev)
 	}
 
 skip_reset:
+	/* find phy node */
+	phy_node = of_parse_phandle(dev->of_node, "phys", 0);
+
+	if (phy_node) {
+		phy_pdev = of_find_device_by_node(phy_node);
+		if (!phy_pdev)
+			goto skip_phy;
+		phy_dev = &phy_pdev->dev;
+
+		pm_runtime_set_active(phy_dev);
+		pm_runtime_enable(phy_dev);
+		pm_runtime_get_sync(phy_dev);
+
+		put_device(phy_dev);
+		dev_info(dev, "phys node found\n");
+	} else {
+		dev_notice(dev, "phys node not found\n");
+	}
+
+skip_phy:
 	/* perform generic probe */
 	err = ufshcd_pltfrm_init(pdev, &ufs_hba_mtk_vops);
-
-out:
-	if (err)
+	if (err) {
 		dev_err(dev, "probe failed %d\n", err);
+		goto out;
+	}
+
+	hba = platform_get_drvdata(pdev);
+	if (!hba)
+		goto out;
+
+	if (phy_node && phy_dev) {
+		host = ufshcd_get_variant(hba);
+		host->phy_dev = phy_dev;
+	}
 
+out:
+	of_node_put(phy_node);
 	of_node_put(reset_node);
 	return err;
 }
@@ -2348,6 +2381,7 @@ static int ufs_mtk_system_resume(struct device *dev)
 static int ufs_mtk_runtime_suspend(struct device *dev)
 {
 	struct ufs_hba *hba = dev_get_drvdata(dev);
+	struct ufs_mtk_host *host = ufshcd_get_variant(hba);
 	struct arm_smccc_res res;
 	int ret = 0;
 
@@ -2360,17 +2394,24 @@ static int ufs_mtk_runtime_suspend(struct device *dev)
 	if (ufs_mtk_is_rtff_mtcmos(hba))
 		ufs_mtk_mtcmos_ctrl(false, res);
 
+	if (host->phy_dev)
+		pm_runtime_put_sync(host->phy_dev);
+
 	return 0;
 }
 
 static int ufs_mtk_runtime_resume(struct device *dev)
 {
 	struct ufs_hba *hba = dev_get_drvdata(dev);
+	struct ufs_mtk_host *host = ufshcd_get_variant(hba);
 	struct arm_smccc_res res;
 
 	if (ufs_mtk_is_rtff_mtcmos(hba))
 		ufs_mtk_mtcmos_ctrl(true, res);
 
+	if (host->phy_dev)
+		pm_runtime_get_sync(host->phy_dev);
+
 	ufs_mtk_dev_vreg_set_lpm(hba, false);
 
 	return ufshcd_runtime_resume(dev);
diff --git a/drivers/ufs/host/ufs-mediatek.h b/drivers/ufs/host/ufs-mediatek.h
index e46dc5fa209d..dfbf78bd8664 100644
--- a/drivers/ufs/host/ufs-mediatek.h
+++ b/drivers/ufs/host/ufs-mediatek.h
@@ -193,6 +193,7 @@ struct ufs_mtk_host {
 	bool is_mcq_intr_enabled;
 	int mcq_nr_intr;
 	struct ufs_mtk_mcq_intr_info mcq_intr_info[UFSHCD_MAX_Q_NR];
+	struct device *phy_dev;
 };
 
 /* MTK delay of autosuspend: 500 ms */
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 06/10] ufs: host: mediatek: Disable auto-hibern8 during power mode changes
  2025-08-25 10:10 [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements peter.wang
                   ` (4 preceding siblings ...)
  2025-08-25 10:10 ` [PATCH v1 05/10] ufs: host: mediatek: Support UFS PHY runtime PM and correct sequence peter.wang
@ 2025-08-25 10:10 ` peter.wang
  2025-08-25 10:10 ` [PATCH v1 07/10] ufs: host: mediatek: Return error directly on idle wait timeout peter.wang
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: peter.wang @ 2025-08-25 10:10 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, jiajie.hao, yi-fan.peng,
	qilin.tan, lin.gui, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	sanjeev.y

From: Peter Wang <peter.wang@mediatek.com>

This patch ensures that auto-hibern8 is disabled when changing power
modes to prevent unintended entry into auto-hibern8 during these
transitions. The original auto-hibern8 timer value is restored
after the power mode change is complete, maintaining system stability
and preventing potential issues during power state transitions.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
---
 drivers/ufs/host/ufs-mediatek.c | 63 ++++++++++++++++++---------------
 1 file changed, 35 insertions(+), 28 deletions(-)

diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index f9def0b68921..b1ea998d3218 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -1429,19 +1429,54 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba,
 	return ret;
 }
 
+static int ufs_mtk_auto_hibern8_disable(struct ufs_hba *hba)
+{
+	unsigned long flags;
+	int ret;
+
+	/* disable auto-hibern8 */
+	ufshcd_writel(hba, 0, REG_AUTO_HIBERNATE_IDLE_TIMER);
+
+	/* wait host return to idle state when auto-hibern8 off */
+	ufs_mtk_wait_idle_state(hba, 5);
+
+	ret = ufs_mtk_wait_link_state(hba, VS_LINK_UP, 100);
+	if (ret) {
+		dev_warn(hba->dev, "exit h8 state fail, ret=%d\n", ret);
+
+		spin_lock_irqsave(hba->host->host_lock, flags);
+		hba->force_reset = true;
+		hba->ufshcd_state = UFSHCD_STATE_EH_SCHEDULED_FATAL;
+		schedule_work(&hba->eh_work);
+		spin_unlock_irqrestore(hba->host->host_lock, flags);
+
+		/* trigger error handler and break suspend */
+		ret = -EBUSY;
+	}
+
+	return ret;
+}
+
 static int ufs_mtk_pwr_change_notify(struct ufs_hba *hba,
 				enum ufs_notify_change_status stage,
 				const struct ufs_pa_layer_attr *dev_max_params,
 				struct ufs_pa_layer_attr *dev_req_params)
 {
 	int ret = 0;
+	static u32 reg;
 
 	switch (stage) {
 	case PRE_CHANGE:
+		if (ufshcd_is_auto_hibern8_supported(hba)) {
+			reg = ufshcd_readl(hba, REG_AUTO_HIBERNATE_IDLE_TIMER);
+			ufs_mtk_auto_hibern8_disable(hba);
+		}
 		ret = ufs_mtk_pre_pwr_change(hba, dev_max_params,
 					     dev_req_params);
 		break;
 	case POST_CHANGE:
+		if (ufshcd_is_auto_hibern8_supported(hba))
+			ufshcd_writel(hba, reg, REG_AUTO_HIBERNATE_IDLE_TIMER);
 		break;
 	default:
 		ret = -EINVAL;
@@ -1686,34 +1721,6 @@ static void ufs_mtk_dev_vreg_set_lpm(struct ufs_hba *hba, bool lpm)
 	}
 }
 
-static int ufs_mtk_auto_hibern8_disable(struct ufs_hba *hba)
-{
-	unsigned long flags;
-	int ret;
-
-	/* disable auto-hibern8 */
-	ufshcd_writel(hba, 0, REG_AUTO_HIBERNATE_IDLE_TIMER);
-
-	/* wait host return to idle state when auto-hibern8 off */
-	ufs_mtk_wait_idle_state(hba, 5);
-
-	ret = ufs_mtk_wait_link_state(hba, VS_LINK_UP, 100);
-	if (ret) {
-		dev_warn(hba->dev, "exit h8 state fail, ret=%d\n", ret);
-
-		spin_lock_irqsave(hba->host->host_lock, flags);
-		hba->force_reset = true;
-		hba->ufshcd_state = UFSHCD_STATE_EH_SCHEDULED_FATAL;
-		schedule_work(&hba->eh_work);
-		spin_unlock_irqrestore(hba->host->host_lock, flags);
-
-		/* trigger error handler and break suspend */
-		ret = -EBUSY;
-	}
-
-	return ret;
-}
-
 static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
 	enum ufs_notify_change_status status)
 {
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 07/10] ufs: host: mediatek: Return error directly on idle wait timeout
  2025-08-25 10:10 [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements peter.wang
                   ` (5 preceding siblings ...)
  2025-08-25 10:10 ` [PATCH v1 06/10] ufs: host: mediatek: Disable auto-hibern8 during power mode changes peter.wang
@ 2025-08-25 10:10 ` peter.wang
  2025-08-25 10:10 ` [PATCH v1 08/10] ufs: host: mediatek: Fix adapt issue after PA_Init peter.wang
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: peter.wang @ 2025-08-25 10:10 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, jiajie.hao, yi-fan.peng,
	qilin.tan, lin.gui, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	sanjeev.y

From: Sanjeev Y <sanjeev.y@mediatek.com>

This patch optimizes the recovery flow by returning an error code
immediately if a wait idle timeout occurs, rather than proceeding
to wait for the link to reach the up state. This change shortens
the recovery process and improves error handling efficiency when
idle state transitions fail.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Sanjeev Y <sanjeev.y@mediatek.com>
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
---
 drivers/ufs/host/ufs-mediatek.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index b1ea998d3218..5037bf2ae5c0 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -416,7 +416,7 @@ static void ufs_mtk_dbg_sel(struct ufs_hba *hba)
 	}
 }
 
-static void ufs_mtk_wait_idle_state(struct ufs_hba *hba,
+static int ufs_mtk_wait_idle_state(struct ufs_hba *hba,
 			    unsigned long retry_ms)
 {
 	u64 timeout, time_checked;
@@ -452,8 +452,12 @@ static void ufs_mtk_wait_idle_state(struct ufs_hba *hba,
 			break;
 	} while (time_checked < timeout);
 
-	if (wait_idle && sm != VS_HCE_BASE)
+	if (wait_idle && sm != VS_HCE_BASE) {
 		dev_info(hba->dev, "wait idle tmo: 0x%x\n", val);
+		return -ETIMEDOUT;
+	}
+
+	return 0;
 }
 
 static int ufs_mtk_wait_link_state(struct ufs_hba *hba, u32 state,
@@ -1438,9 +1442,13 @@ static int ufs_mtk_auto_hibern8_disable(struct ufs_hba *hba)
 	ufshcd_writel(hba, 0, REG_AUTO_HIBERNATE_IDLE_TIMER);
 
 	/* wait host return to idle state when auto-hibern8 off */
-	ufs_mtk_wait_idle_state(hba, 5);
+	ret = ufs_mtk_wait_idle_state(hba, 5);
+	if (ret)
+		goto out;
 
 	ret = ufs_mtk_wait_link_state(hba, VS_LINK_UP, 100);
+
+out:
 	if (ret) {
 		dev_warn(hba->dev, "exit h8 state fail, ret=%d\n", ret);
 
@@ -1619,7 +1627,11 @@ static int ufs_mtk_link_set_hpm(struct ufs_hba *hba)
 		return err;
 
 	/* Check link state to make sure exit h8 success */
-	ufs_mtk_wait_idle_state(hba, 5);
+	err = ufs_mtk_wait_idle_state(hba, 5);
+	if (err) {
+		dev_warn(hba->dev, "wait idle fail, err=%d\n", err);
+		return err;
+	}
 	err = ufs_mtk_wait_link_state(hba, VS_LINK_UP, 100);
 	if (err) {
 		dev_warn(hba->dev, "exit h8 state fail, err=%d\n", err);
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 08/10] ufs: host: mediatek: Fix adapt issue after PA_Init
  2025-08-25 10:10 [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements peter.wang
                   ` (6 preceding siblings ...)
  2025-08-25 10:10 ` [PATCH v1 07/10] ufs: host: mediatek: Return error directly on idle wait timeout peter.wang
@ 2025-08-25 10:10 ` peter.wang
  2025-08-25 10:10 ` [PATCH v1 09/10] ufs: host: mediatek: Fix unbalanced IRQ enable issue peter.wang
  2025-08-25 10:10 ` [PATCH v1 10/10] ufs: host: mediatek: Fix device power control peter.wang
  9 siblings, 0 replies; 13+ messages in thread
From: peter.wang @ 2025-08-25 10:10 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, jiajie.hao, yi-fan.peng,
	qilin.tan, lin.gui, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	sanjeev.y

From: Alice Chao <alice.chao@mediatek.com>

This patch addresses the issue where the host does not send adapt
to the device after PA_Init success.
It ensures that the adapt process is correctly initiated for devices
with IP version MT6899 and above, resolving communication issues
between the host and device.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Alice Chao <alice.chao@mediatek.com>
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
---
 drivers/ufs/host/ufs-mediatek.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index 5037bf2ae5c0..d12dd0edd389 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -1556,8 +1556,19 @@ static int ufs_mtk_pre_link(struct ufs_hba *hba)
 
 	return ret;
 }
+
 static void ufs_mtk_post_link(struct ufs_hba *hba)
 {
+	struct ufs_mtk_host *host = ufshcd_get_variant(hba);
+	u32 tmp;
+
+	/* fix device PA_INIT no adapt */
+	if (host->ip_ver >= IP_VER_MT6899) {
+		ufshcd_dme_get(hba, UIC_ARG_MIB(VS_DEBUGOMC), &tmp);
+		tmp |= 0x100;
+		ufshcd_dme_set(hba, UIC_ARG_MIB(VS_DEBUGOMC), tmp);
+	}
+
 	/* enable unipro clock gating feature */
 	ufs_mtk_cfg_unipro_cg(hba, true);
 }
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 09/10] ufs: host: mediatek: Fix unbalanced IRQ enable issue
  2025-08-25 10:10 [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements peter.wang
                   ` (7 preceding siblings ...)
  2025-08-25 10:10 ` [PATCH v1 08/10] ufs: host: mediatek: Fix adapt issue after PA_Init peter.wang
@ 2025-08-25 10:10 ` peter.wang
  2025-08-25 10:10 ` [PATCH v1 10/10] ufs: host: mediatek: Fix device power control peter.wang
  9 siblings, 0 replies; 13+ messages in thread
From: peter.wang @ 2025-08-25 10:10 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, jiajie.hao, yi-fan.peng,
	qilin.tan, lin.gui, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	sanjeev.y

From: Peter Wang <peter.wang@mediatek.com>

This patch resolves the issue of unbalanced IRQ enablement by setting
the 'is_mcq_intr_enabled' flag after the first successful IRQ
enablement. This ensures proper tracking of the IRQ state and prevents
potential mismatches in IRQ handling.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
---
 drivers/ufs/host/ufs-mediatek.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index d12dd0edd389..934c643633d3 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -2195,6 +2195,7 @@ static int ufs_mtk_config_mcq_irq(struct ufs_hba *hba)
 			return ret;
 		}
 	}
+	host->is_mcq_intr_enabled = true;
 
 	return 0;
 }
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 10/10] ufs: host: mediatek: Fix device power control
  2025-08-25 10:10 [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements peter.wang
                   ` (8 preceding siblings ...)
  2025-08-25 10:10 ` [PATCH v1 09/10] ufs: host: mediatek: Fix unbalanced IRQ enable issue peter.wang
@ 2025-08-25 10:10 ` peter.wang
  9 siblings, 0 replies; 13+ messages in thread
From: peter.wang @ 2025-08-25 10:10 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, jiajie.hao, yi-fan.peng,
	qilin.tan, lin.gui, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	sanjeev.y

From: Peter Wang <peter.wang@mediatek.com>

This patch adjusts the timing of device power control to ensure
that low power mode (LPM) is entered only after VCC is turned off.
This change prevents VCCQ/VCCQ2 from entering LPM prematurely,
ensuring proper power management and device stability.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
---
 drivers/ufs/host/ufs-mediatek.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index 934c643633d3..ec45a40f04d0 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -2347,6 +2347,13 @@ static int ufs_mtk_probe(struct platform_device *pdev)
 		host->phy_dev = phy_dev;
 	}
 
+	/*
+	 * Because the default power setting of VSx (the upper layer of
+	 * VCCQ/VCCQ2) is HWLP, we need to prevent VCCQ/VCCQ2 from
+	 * entering LPM.
+	 */
+	ufs_mtk_dev_vreg_set_lpm(hba, false);
+
 out:
 	of_node_put(phy_node);
 	of_node_put(reset_node);
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 01/10] ufs: host: mediatek: Enhance recovery on hibernation exit failure
  2025-08-25 10:10 ` [PATCH v1 01/10] ufs: host: mediatek: Enhance recovery on hibernation exit failure peter.wang
@ 2025-08-25 15:46   ` Bart Van Assche
  2025-08-26  3:04     ` Peter Wang (王信友)
  0 siblings, 1 reply; 13+ messages in thread
From: Bart Van Assche @ 2025-08-25 15:46 UTC (permalink / raw)
  To: peter.wang, linux-scsi, martin.petersen
  Cc: wsd_upstream, linux-mediatek, chun-hung.wu, alice.chao, cc.chou,
	chaotian.jing, jiajie.hao, yi-fan.peng, qilin.tan, lin.gui,
	tun-yu.yu, eddie.huang, naomi.chu, ed.tsai, sanjeev.y

On 8/25/25 3:10 AM, peter.wang@mediatek.com wrote:
> @@ -1697,8 +1698,20 @@ static void ufs_mtk_auto_hibern8_disable(struct ufs_hba *hba)
>   	ufs_mtk_wait_idle_state(hba, 5);
>   
>   	ret = ufs_mtk_wait_link_state(hba, VS_LINK_UP, 100);
> -	if (ret)
> +	if (ret) {
>   		dev_warn(hba->dev, "exit h8 state fail, ret=%d\n", ret);
> +
> +		spin_lock_irqsave(hba->host->host_lock, flags);
> +		hba->force_reset = true;
> +		hba->ufshcd_state = UFSHCD_STATE_EH_SCHEDULED_FATAL;
> +		schedule_work(&hba->eh_work);
> +		spin_unlock_irqrestore(hba->host->host_lock, flags);
> +
> +		/* trigger error handler and break suspend */
> +		ret = -EBUSY;
> +	}
> +
> +	return ret;
>   }

Hi Peter,

UFS host drivers shouldn't touch hba->force_reset, hba->ufshcd_state nor 
hba->eh_work. Please add a helper function in the UFS driver core and 
export it.

Thanks,

Bart.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 01/10] ufs: host: mediatek: Enhance recovery on hibernation exit failure
  2025-08-25 15:46   ` Bart Van Assche
@ 2025-08-26  3:04     ` Peter Wang (王信友)
  0 siblings, 0 replies; 13+ messages in thread
From: Peter Wang (王信友) @ 2025-08-26  3:04 UTC (permalink / raw)
  To: linux-scsi@vger.kernel.org, bvanassche@acm.org,
	martin.petersen@oracle.com
  Cc: Sanjeev Y, Alice Chao (趙珮均),
	CC Chou (周志杰),
	Eddie Huang (黃智傑),
	Ed Tsai (蔡宗軒), wsd_upstream,
	Chaotian Jing (井朝天),
	Chun-Hung Wu (巫駿宏),
	Yi-fan Peng (彭羿凡),
	Qilin Tan (谭麒麟),
	linux-mediatek@lists.infradead.org,
	Jiajie Hao (郝加节), Lin Gui (桂林),
	Naomi Chu (朱詠田),
	Tun-yu Yu (游敦聿)

On Mon, 2025-08-25 at 08:46 -0700, Bart Van Assche wrote:
> 
> 
> Hi Peter,
> 
> UFS host drivers shouldn't touch hba->force_reset, hba->ufshcd_state
> nor
> hba->eh_work. Please add a helper function in the UFS driver core and
> export it.
> 
> Thanks,
> 
> Bart.

Hi Bart,

I will export ufshcd_force_error_recovery in the next version.
Thank you for your suggestion.

Peter

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2025-08-26  3:04 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-25 10:10 [PATCH v1 00/10] ufs: host: mediatek: Power Management and Stability Enhancements peter.wang
2025-08-25 10:10 ` [PATCH v1 01/10] ufs: host: mediatek: Enhance recovery on hibernation exit failure peter.wang
2025-08-25 15:46   ` Bart Van Assche
2025-08-26  3:04     ` Peter Wang (王信友)
2025-08-25 10:10 ` [PATCH v1 02/10] ufs: host: mediatek: Enhance recovery on resume failure peter.wang
2025-08-25 10:10 ` [PATCH v1 03/10] ufs: host: mediatek: Correct system PM flow peter.wang
2025-08-25 10:10 ` [PATCH v1 04/10] ufs: host: mediatek: Correct resume flow for LPM and MTCMOS peter.wang
2025-08-25 10:10 ` [PATCH v1 05/10] ufs: host: mediatek: Support UFS PHY runtime PM and correct sequence peter.wang
2025-08-25 10:10 ` [PATCH v1 06/10] ufs: host: mediatek: Disable auto-hibern8 during power mode changes peter.wang
2025-08-25 10:10 ` [PATCH v1 07/10] ufs: host: mediatek: Return error directly on idle wait timeout peter.wang
2025-08-25 10:10 ` [PATCH v1 08/10] ufs: host: mediatek: Fix adapt issue after PA_Init peter.wang
2025-08-25 10:10 ` [PATCH v1 09/10] ufs: host: mediatek: Fix unbalanced IRQ enable issue peter.wang
2025-08-25 10:10 ` [PATCH v1 10/10] ufs: host: mediatek: Fix device power control peter.wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).