[PATCH v4 1/2] ufs: core: Configure only active lanes during link
From: palash . kambar
Date: Fri Apr 17 2026 - 00:56:31 EST
From: Palash Kambar <palash.kambar@xxxxxxxxxxxxxxxx>
The number of connected lanes detected during UFS link startup can be
fewer than the lanes specified in the device tree. The current driver
logic attempts to configure all lanes defined in the device tree,
regardless of their actual availability. This mismatch may cause
failures during power mode changes.
Hence, Add a check during link startup to ensure that only the lanes
actually discovered are considered valid. If a mismatch is detected,
fail the initialization early, preventing the driver from entering
an unsupported configuration that could cause power mode transition
failures.
Signed-off-by: Palash Kambar <palash.kambar@xxxxxxxxxxxxxxxx>
---
drivers/ufs/core/ufshcd.c | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 31950fc51a4c..10f8d2b552be 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -5035,6 +5035,40 @@ void ufshcd_update_evt_hist(struct ufs_hba *hba, u32 id, u32 val)
}
EXPORT_SYMBOL_GPL(ufshcd_update_evt_hist);
+static int ufshcd_validate_link_params(struct ufs_hba *hba)
+{
+ int ret, val;
+
+ ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES),
+ &val);
+ if (ret)
+ goto out;
+
+ if (val != hba->lanes_per_direction) {
+ dev_err(hba->dev, "Tx lane mismatch [config,reported] [%d,%d]\n",
+ hba->lanes_per_direction, val);
+ ret = -ENOLINK;
+ goto out;
+ }
+
+ ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDRXDATALANES),
+ &val);
+ if (ret)
+ goto out;
+
+ if (val != hba->lanes_per_direction) {
+ dev_err(hba->dev, "Rx lane mismatch [config,reported] [%d,%d]\n",
+ hba->lanes_per_direction, val);
+ ret = -ENOLINK;
+ goto out;
+ }
+
+return 0;
+
+out:
+ return ret;
+}
+
/**
* ufshcd_link_startup - Initialize unipro link startup
* @hba: per adapter instance
@@ -5108,6 +5142,10 @@ static int ufshcd_link_startup(struct ufs_hba *hba)
goto out;
}
+ ret = ufshcd_validate_link_params(hba);
+ if (ret)
+ goto out;
+
/* Include any host controller configuration via UIC commands */
ret = ufshcd_vops_link_startup_notify(hba, POST_CHANGE);
if (ret)
--
2.34.1