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;
> +       }