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:Good catch.
+ */
+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.
Thanks,
Can Guo.
+}