Re: [PATCH v4 07/12] scsi: ufs: core: Add support to retrain TX Equalization via debugfs
From: Bean Huo
Date: Sun Mar 22 2026 - 09:37:22 EST
On Fri, 2026-03-20 at 20:10 -0700, Can Guo wrote:
> +/**
> + * ufshcd_retrain_tx_eq - Retrain TX Equalization and apply new settings
> + * @hba: per-adapter instance
> + * @gear: target High-Speed (HS) gear for retraining
> + *
> + * This function initiates a refresh of the TX Equalization settings for a
> + * specific HS gear. It scales the clocks to maximum frequency, negotiates
> the
> + * power mode with the device, retrains TX EQ and applies new TX EQ settings
> + * by conducting a Power Mode change.
> + *
> + * Returns 0 on success, non-zero error code otherwise
> + */
> +int ufshcd_retrain_tx_eq(struct ufs_hba *hba, u32 gear)
> +{
> + struct ufs_pa_layer_attr new_pwr_info, final_params = {};
> + int ret;
> +
> + if (!ufshcd_is_tx_eq_supported(hba) || !use_adaptive_txeq)
> + return -EOPNOTSUPP;
> +
> + if (gear < adaptive_txeq_gear)
> + return -ERANGE;
> +
> + ufshcd_hold(hba);
> +
> + ret = ufshcd_pause_command_processing(hba, 1 * USEC_PER_SEC);
> + if (ret) {
> + ufshcd_release(hba);
> + return ret;
> + }
> +
> + /* scale up clocks to max frequency before TX EQTR */
> + if (ufshcd_is_clkscaling_supported(hba))
> + ufshcd_scale_clks(hba, ULONG_MAX, true);
> +
> + new_pwr_info = hba->pwr_info;
> + new_pwr_info.gear_tx = gear;
> + new_pwr_info.gear_rx = gear;
> +
> + ret = ufshcd_vops_negotiate_pwr_mode(hba, &new_pwr_info,
> &final_params);
> + if (ret)
> + memcpy(&final_params, &new_pwr_info, sizeof(final_params));
> +
> + if (final_params.gear_tx != gear) {
> + dev_err(hba->dev, "Negotiated Gear (%u) does not match target
> Gear (%u)\n",
> + final_params.gear_tx, gear);\
might be ret = -EINVAL; before goto?
> + goto out;
> + }