Re: [PATCH v2 04/11] scsi: ufs: core: Add support for TX Equalization

From: Can Guo

Date: Fri Mar 06 2026 - 08:00:17 EST




On 3/6/2026 5:50 AM, Bean Huo wrote:
On Wed, 2026-03-04 at 05:53 -0800, Can Guo wrote:
+ */
+static int ufshcd_tx_eqtr_data_init(struct ufs_hba *hba,
+                                   struct ufshcd_tx_eq_params *params,
+                                   struct tx_eqtr_iter *h_iter,
+                                   struct tx_eqtr_iter *d_iter)
+{
+       u32 cap;
+       int ret;
+
+       if (!hba->host_preshoot_cap) {
+               ret = ufshcd_dme_get(hba,
UIC_ARG_MIB(TX_HS_PRESHOOT_SETTING_CAP), &cap);
+               if (ret)
+                       return ret;
+
+               hba->host_preshoot_cap = cap & TX_EQTR_CAP_MASK;
+       }
+
+       if (!hba->host_deemphasis_cap) {
+               ret = ufshcd_dme_get(hba,
UIC_ARG_MIB(TX_HS_DEEMPHASIS_SETTING_CAP), &cap);
+               if (ret)
+                       return ret;
+
+               hba->host_deemphasis_cap = cap & TX_EQTR_CAP_MASK;
+       }
+
+       if (!hba->device_preshoot_cap) {
+               ret = ufshcd_dme_peer_get(hba,
UIC_ARG_MIB(TX_HS_PRESHOOT_SETTING_CAP), &cap);
+               if (ret)
+                       return ret;
+
+               hba->device_preshoot_cap = cap & TX_EQTR_CAP_MASK;
+       }
+
+       if (!hba->device_deemphasis_cap) {
+               ret = ufshcd_dme_peer_get(hba,
UIC_ARG_MIB(TX_HS_DEEMPHASIS_SETTING_CAP), &cap);
+               if (ret)
+                       return ret;
+
+               hba->device_deemphasis_cap = cap & TX_EQTR_CAP_MASK;
+       }
+
+       memset(params->host, 0, sizeof(params->host));
+       memset(params->device, 0, sizeof(params->device));
+       memset(params->host_eqtr_record, 0xFF, sizeof(params-
host_eqtr_record));
+       memset(params->device_eqtr_record, 0xFF, sizeof(params-
device_eqtr_record));
+
+       memset(h_iter, 0, sizeof(struct tx_eqtr_iter));
+       memset(d_iter, 0, sizeof(struct tx_eqtr_iter));
+
+       h_iter->num_lanes = params->tx_lanes;
+       d_iter->num_lanes = params->rx_lanes;
+
+       /*
+        * Support PreShoot & DeEmphasis of value 0 is mandatory, hence they
are
+        * not reflected in PreShoot/DeEmphasis capabilities. Left shift the
+        * capability bitmap by 1 and set bit[0] to reflect value 0 is
+        * supported, such that test_bit() can be used later for convenience.
+        */
+       h_iter->preshoot_bitmap = (hba->host_preshoot_cap << 0x1) | 0x1;
+       h_iter->deemphasis_bitmap = (hba->host_deemphasis_cap << 0x1) | 0x1;
+       d_iter->preshoot_bitmap = (hba->device_preshoot_cap << 0x1) | 0x1;
+       d_iter->deemphasis_bitmap = (hba->device_deemphasis_cap << 0x1) | 0x1;
+
+       return ret;

ret is returned without guaranteed initialization when caps are already cached.
Good catch.

Thanks,
Can Guo.

+}