]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: ufs: core: Configure only active lanes during link
authorPalash Kambar <palash.kambar@oss.qualcomm.com>
Thu, 23 Apr 2026 10:20:22 +0000 (15:50 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 15 May 2026 02:19:08 +0000 (22:19 -0400)
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.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
Signed-off-by: Palash Kambar <palash.kambar@oss.qualcomm.com>
Link: https://patch.msgid.link/20260423102023.3779489-2-palash.kambar@oss.qualcomm.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c

index a6026cc4b2f40566bd167bbb79c4f22c46848a63..1aad1c03c3fccab0e406f1e1c8559778c8a0cb19 100644 (file)
@@ -5218,6 +5218,35 @@ 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)
+               return ret;
+
+       if (val != hba->lanes_per_direction) {
+               dev_err(hba->dev, "Tx lane mismatch [config,reported] [%d,%d]\n",
+                       hba->lanes_per_direction, val);
+               return -ENOLINK;
+       }
+
+       ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDRXDATALANES),
+                            &val);
+       if (ret)
+               return ret;
+
+       if (val != hba->lanes_per_direction) {
+               dev_err(hba->dev, "Rx lane mismatch [config,reported] [%d,%d]\n",
+                       hba->lanes_per_direction, val);
+               return -ENOLINK;
+       }
+
+       return 0;
+}
+
 /**
  * ufshcd_link_startup - Initialize unipro link startup
  * @hba: per adapter instance
@@ -5291,6 +5320,10 @@ link_startup:
                        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)