Re: [PATCH V3 1/2] ufs: core: Configure only active lanes during link
From: Palash Kambar
Date: Fri Apr 17 2026 - 00:25:14 EST
On 4/16/2026 4:42 PM, Manivannan Sadhasivam wrote:
> On Tue, Apr 14, 2026 at 03:01:34PM +0530, palash.kambar@xxxxxxxxxxxxxxxx wrote:
>> 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 | 37 +++++++++++++++++++++++++++++++++++++
>> 1 file changed, 37 insertions(+)
>>
>> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
>> index 31950fc51a4c..754bf4df3016 100644
>> --- a/drivers/ufs/core/ufshcd.c
>> +++ b/drivers/ufs/core/ufshcd.c
>> @@ -5035,6 +5035,38 @@ 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;
>> + int val;
>
> 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 +5140,11 @@ static int ufshcd_link_startup(struct ufs_hba *hba)
>> goto out;
>> }
>>
>> + /* Check successfully detected lanes */
>
> Drop the comment.
Will update as per suggestion.
Thanks.
>