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