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

From: Bean Huo

Date: Thu Mar 05 2026 - 17:03:06 EST


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.

> +}