Re: [PATCH v4 07/12] scsi: ufs: core: Add support to retrain TX Equalization via debugfs

From: Can Guo

Date: Mon Mar 23 2026 - 02:14:05 EST




On 3/22/2026 9:36 PM, Bean Huo wrote:
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?
You are right, let me add it in next version.

Thanks,
Can Guo.


+               goto out;
+       }