* [PATCH 0/2] scsi: ufs: Add quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3
@ 2026-05-01 13:16 Can Guo
2026-05-01 13:16 ` [PATCH 1/2] scsi: ufs: core: Add a quirk for extended TX EQTR Adapt L0L1L2L3 length Can Guo
2026-05-01 13:16 ` [PATCH 2/2] scsi: ufs: ufs-qcom: Use quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 Can Guo
0 siblings, 2 replies; 9+ messages in thread
From: Can Guo @ 2026-05-01 13:16 UTC (permalink / raw)
To: avri.altman, bvanassche, beanhuo, peter.wang, martin.petersen,
mani
Cc: linux-scsi, Can Guo
Add a quirk to support TX Equalization Training (EQTR) using Adapt L0L1L2L3
length which is larger than what is allowed by M-PHY spec ver 6.0.
Can Guo (2):
scsi: ufs: core: Add a quirk for extended TX EQTR Adapt L0L1L2L3
length
scsi: ufs: ufs-qcom: Use quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3
drivers/ufs/core/ufs-txeq.c | 8 ++++++--
drivers/ufs/host/ufs-qcom.c | 3 +++
include/ufs/ufshcd.h | 7 +++++++
3 files changed, 16 insertions(+), 2 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 1/2] scsi: ufs: core: Add a quirk for extended TX EQTR Adapt L0L1L2L3 length 2026-05-01 13:16 [PATCH 0/2] scsi: ufs: Add quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 Can Guo @ 2026-05-01 13:16 ` Can Guo 2026-05-04 3:06 ` Bart Van Assche 2026-05-04 9:19 ` Peter Wang (王信友) 2026-05-01 13:16 ` [PATCH 2/2] scsi: ufs: ufs-qcom: Use quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 Can Guo 1 sibling, 2 replies; 9+ messages in thread From: Can Guo @ 2026-05-01 13:16 UTC (permalink / raw) To: avri.altman, bvanassche, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Can Guo, Alim Akhtar, James E.J. Bottomley, open list Add a quirk to support TX Equalization Training (EQTR) using Adapt L0L1L2L3 length which is larger than what is allowed by M-PHY spec ver 6.0. Signed-off-by: Can Guo <can.guo@oss.qualcomm.com> --- drivers/ufs/core/ufs-txeq.c | 8 ++++++-- include/ufs/ufshcd.h | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/ufs/core/ufs-txeq.c b/drivers/ufs/core/ufs-txeq.c index b2dc89124353..fe647450a7a1 100644 --- a/drivers/ufs/core/ufs-txeq.c +++ b/drivers/ufs/core/ufs-txeq.c @@ -740,7 +740,9 @@ static int ufshcd_setup_tx_eqtr_adapt_length(struct ufs_hba *hba, if (adapt_l0l1l2l3_cap_local > ADAPT_L0L1L2L3_LENGTH_MAX) { dev_err(hba->dev, "local RX_HS_G%u_ADAPT_INITIAL_L0L1L2L3_CAP (0x%x) exceeds MAX\n", gear, adapt_l0l1l2l3_cap_local); - return -EINVAL; + + if (!(hba->quirks & UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3)) + return -EINVAL; } ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_PEERRXHSG6ADAPTINITIALL0L1L2L3), @@ -751,7 +753,9 @@ static int ufshcd_setup_tx_eqtr_adapt_length(struct ufs_hba *hba, if (adapt_l0l1l2l3_cap_peer > ADAPT_L0L1L2L3_LENGTH_MAX) { dev_err(hba->dev, "peer RX_HS_G%u_ADAPT_INITIAL_L0L1L2L3_CAP (0x%x) exceeds MAX\n", gear, adapt_l0l1l2l3_cap_peer); - return -EINVAL; + + if (!(hba->quirks & UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3)) + return -EINVAL; } t_adapt_l0l1l2l3_local = adapt_cap_to_t_adapt_l0l1l2l3(adapt_l0l1l2l3_cap_local); diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h index cfbc75d8df83..7a7c07636cf7 100644 --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h @@ -804,6 +804,13 @@ enum ufshcd_quirks { * delay after enabling VCC to ensure it's stable. */ UFSHCD_QUIRK_VCC_ON_DELAY = 1 << 27, + + /* + * This quirk indicates that Host supports TX Equalization Training + * (EQTR) using Adapt L0L1L2L3 length which is larger than what is + * allowed by M-PHY spec ver 6.0. + */ + UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 = 1 << 28, }; enum ufshcd_caps { -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] scsi: ufs: core: Add a quirk for extended TX EQTR Adapt L0L1L2L3 length 2026-05-01 13:16 ` [PATCH 1/2] scsi: ufs: core: Add a quirk for extended TX EQTR Adapt L0L1L2L3 length Can Guo @ 2026-05-04 3:06 ` Bart Van Assche 2026-05-04 9:19 ` Peter Wang (王信友) 1 sibling, 0 replies; 9+ messages in thread From: Bart Van Assche @ 2026-05-04 3:06 UTC (permalink / raw) To: Can Guo, avri.altman, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Alim Akhtar, James E.J. Bottomley, open list On 5/1/26 3:16 PM, Can Guo wrote: > Add a quirk to support TX Equalization Training (EQTR) using Adapt L0L1L2L3 > length which is larger than what is allowed by M-PHY spec ver 6.0. Reviewed-by: Bart Van Assche <bvanassche@acm.org> ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] scsi: ufs: core: Add a quirk for extended TX EQTR Adapt L0L1L2L3 length 2026-05-01 13:16 ` [PATCH 1/2] scsi: ufs: core: Add a quirk for extended TX EQTR Adapt L0L1L2L3 length Can Guo 2026-05-04 3:06 ` Bart Van Assche @ 2026-05-04 9:19 ` Peter Wang (王信友) 2026-05-04 12:55 ` Can Guo 1 sibling, 1 reply; 9+ messages in thread From: Peter Wang (王信友) @ 2026-05-04 9:19 UTC (permalink / raw) To: beanhuo@micron.com, mani@kernel.org, can.guo@oss.qualcomm.com, avri.altman@wdc.com, bvanassche@acm.org, martin.petersen@oracle.com Cc: linux-scsi@vger.kernel.org, alim.akhtar@samsung.com, James.Bottomley@HansenPartnership.com, linux-kernel@vger.kernel.org On Fri, 2026-05-01 at 06:16 -0700, Can Guo wrote: > > diff --git a/drivers/ufs/core/ufs-txeq.c b/drivers/ufs/core/ufs- > txeq.c > index b2dc89124353..fe647450a7a1 100644 > --- a/drivers/ufs/core/ufs-txeq.c > +++ b/drivers/ufs/core/ufs-txeq.c > @@ -740,7 +740,9 @@ static int > ufshcd_setup_tx_eqtr_adapt_length(struct ufs_hba *hba, > if (adapt_l0l1l2l3_cap_local > > ADAPT_L0L1L2L3_LENGTH_MAX) { > dev_err(hba->dev, "local > RX_HS_G%u_ADAPT_INITIAL_L0L1L2L3_CAP (0x%x) exceeds MAX\n", > gear, adapt_l0l1l2l3_cap_local); > - return -EINVAL; > + > + if (!(hba->quirks & > UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3)) > + return -EINVAL; > } > > ret = ufshcd_dme_get(hba, > UIC_ARG_MIB(PA_PEERRXHSG6ADAPTINITIALL0L1L2L3), > @@ -751,7 +753,9 @@ static int > ufshcd_setup_tx_eqtr_adapt_length(struct ufs_hba *hba, > if (adapt_l0l1l2l3_cap_peer > > ADAPT_L0L1L2L3_LENGTH_MAX) { > dev_err(hba->dev, "peer > RX_HS_G%u_ADAPT_INITIAL_L0L1L2L3_CAP (0x%x) exceeds MAX\n", > gear, adapt_l0l1l2l3_cap_peer); > - return -EINVAL; > + > + if (!(hba->quirks & > UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3)) > + return -EINVAL; > Hi Can, The quirk UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 is defined as a host quirk, but it appears to be used for the device (peer) in this context. Is this usage wrong or intended? Thanks Peter ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] scsi: ufs: core: Add a quirk for extended TX EQTR Adapt L0L1L2L3 length 2026-05-04 9:19 ` Peter Wang (王信友) @ 2026-05-04 12:55 ` Can Guo 2026-05-05 5:48 ` Peter Wang (王信友) 0 siblings, 1 reply; 9+ messages in thread From: Can Guo @ 2026-05-04 12:55 UTC (permalink / raw) To: Peter Wang (王信友), beanhuo@micron.com, mani@kernel.org, avri.altman@wdc.com, bvanassche@acm.org, martin.petersen@oracle.com Cc: linux-scsi@vger.kernel.org, alim.akhtar@samsung.com, James.Bottomley@HansenPartnership.com, linux-kernel@vger.kernel.org On 5/4/2026 5:19 PM, Peter Wang (王信友) wrote: > > On Fri, 2026-05-01 at 06:16 -0700, Can Guo wrote: > > > > diff --git a/drivers/ufs/core/ufs-txeq.c b/drivers/ufs/core/ufs- > > txeq.c > > index b2dc89124353..fe647450a7a1 100644 > > --- a/drivers/ufs/core/ufs-txeq.c > > +++ b/drivers/ufs/core/ufs-txeq.c > > @@ -740,7 +740,9 @@ static int > > ufshcd_setup_tx_eqtr_adapt_length(struct ufs_hba *hba, > > if (adapt_l0l1l2l3_cap_local > > > ADAPT_L0L1L2L3_LENGTH_MAX) { > > dev_err(hba->dev, "local > > RX_HS_G%u_ADAPT_INITIAL_L0L1L2L3_CAP (0x%x) exceeds MAX\n", > > gear, adapt_l0l1l2l3_cap_local); > > - return -EINVAL; > > + > > + if (!(hba->quirks & > > UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3)) > > + return -EINVAL; > > } > > > > ret = ufshcd_dme_get(hba, > > UIC_ARG_MIB(PA_PEERRXHSG6ADAPTINITIALL0L1L2L3), > > @@ -751,7 +753,9 @@ static int > > ufshcd_setup_tx_eqtr_adapt_length(struct ufs_hba *hba, > > if (adapt_l0l1l2l3_cap_peer > > > ADAPT_L0L1L2L3_LENGTH_MAX) { > > dev_err(hba->dev, "peer > > RX_HS_G%u_ADAPT_INITIAL_L0L1L2L3_CAP (0x%x) exceeds MAX\n", > > gear, adapt_l0l1l2l3_cap_peer); > > - return -EINVAL; > > + > > + if (!(hba->quirks & > > UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3)) > > + return -EINVAL; > > > > Hi Can, > > The quirk UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 > is defined as a host quirk, but it appears to be used for the > device (peer) in this context. Is this usage wrong or intended? Hi Peter, Thanks for raising this; it is a good question. And I had spent quite some time on this one trying to make it as simple as possible... Firstly, it is intended. In TX EQTR flow, the host software programs a Adapt Length value to PA_TXADAPTLENGTH_EQTR and initiates TX EQTR procedure. With this quirk enabled, the host software is allowed (by Host HW) to continue TX EQTR even with a value which is above the spec max, so the Host software can attempt an extended (out-of-spec) value. Then the outcome is naturally determined by the peer device: 1. If the device tolerates the extended value, TX EQTR succeeds. 2. If the device does not, TX EQTR fails as part of normal EQTR behavior. So the quirk is intentionally host-only. A separate device quirk could be added, but for this path it would be redundant and would increase maintenance burden (for tracking a list of such devices) without changing the outcome. I hope I have answered your question and you can understand my considerations. Thanks, Can Guo. > > Thanks > Peter > > > ************* MEDIATEK Confidentiality Notice ******************** > The information contained in this e-mail message (including any > attachments) may be confidential, proprietary, privileged, or otherwise > exempt from disclosure under applicable laws. It is intended to be > conveyed only to the designated recipient(s). Any use, dissemination, > distribution, printing, retaining or copying of this e-mail (including its > attachments) by unintended recipient(s) is strictly prohibited and may > be unlawful. If you are not an intended recipient of this e-mail, or believe > that you have received this e-mail in error, please notify the sender > immediately (by replying to this e-mail), delete any and all copies of > this e-mail (including any attachments) from your system, and do not > disclose the content of this e-mail to any other person. Thank you! ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] scsi: ufs: core: Add a quirk for extended TX EQTR Adapt L0L1L2L3 length 2026-05-04 12:55 ` Can Guo @ 2026-05-05 5:48 ` Peter Wang (王信友) 0 siblings, 0 replies; 9+ messages in thread From: Peter Wang (王信友) @ 2026-05-05 5:48 UTC (permalink / raw) To: beanhuo@micron.com, mani@kernel.org, can.guo@oss.qualcomm.com, avri.altman@wdc.com, bvanassche@acm.org, martin.petersen@oracle.com Cc: linux-scsi@vger.kernel.org, alim.akhtar@samsung.com, James.Bottomley@HansenPartnership.com, linux-kernel@vger.kernel.org On Mon, 2026-05-04 at 20:55 +0800, Can Guo wrote: > Hi Peter, > > Thanks for raising this; it is a good question. And I had spent quite > some time > on this one trying to make it as simple as possible... > > Firstly, it is intended. In TX EQTR flow, the host software programs > a Adapt > Length value to PA_TXADAPTLENGTH_EQTR and initiates TX EQTR > procedure. > With this quirk enabled, the host software is allowed (by Host HW) to > continue > TX EQTR even with a value which is above the spec max, so the Host > software > can attempt an extended (out-of-spec) value. > > Then the outcome is naturally determined by the peer device: > 1. If the device tolerates the extended value, TX EQTR succeeds. > 2. If the device does not, TX EQTR fails as part of normal EQTR > behavior. > > So the quirk is intentionally host-only. > > A separate device quirk could be added, but for this path it would be > redundant > and would increase maintenance burden (for tracking a list of such > devices) without > changing the outcome. > > I hope I have answered your question and you can understand my > considerations. > > Thanks, > Can Guo. > Hi Can, Thank you for the clarification. I have no further questions. Reviewed-by: Peter Wang <peter.wang@mediatek.com> ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/2] scsi: ufs: ufs-qcom: Use quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 2026-05-01 13:16 [PATCH 0/2] scsi: ufs: Add quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 Can Guo 2026-05-01 13:16 ` [PATCH 1/2] scsi: ufs: core: Add a quirk for extended TX EQTR Adapt L0L1L2L3 length Can Guo @ 2026-05-01 13:16 ` Can Guo 2026-05-04 3:06 ` Bart Van Assche 1 sibling, 1 reply; 9+ messages in thread From: Can Guo @ 2026-05-01 13:16 UTC (permalink / raw) To: avri.altman, bvanassche, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Can Guo, James E.J. Bottomley, open list:UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER..., open list Use UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 for UFS Hosts HW major version 0x7 & minor version 0x1. Signed-off-by: Can Guo <can.guo@oss.qualcomm.com> --- drivers/ufs/host/ufs-qcom.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c index bc037db46624..7b6957ef164b 100644 --- a/drivers/ufs/host/ufs-qcom.c +++ b/drivers/ufs/host/ufs-qcom.c @@ -1305,6 +1305,9 @@ static void ufs_qcom_advertise_quirks(struct ufs_hba *hba) if (host->hw_ver.major > 0x3) hba->quirks |= UFSHCD_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH; + if (host->hw_ver.major == 0x7 && host->hw_ver.minor == 0x1) + hba->quirks |= UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3; + if (drvdata && drvdata->quirks) hba->quirks |= drvdata->quirks; } -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] scsi: ufs: ufs-qcom: Use quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 2026-05-01 13:16 ` [PATCH 2/2] scsi: ufs: ufs-qcom: Use quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 Can Guo @ 2026-05-04 3:06 ` Bart Van Assche 2026-05-04 3:11 ` Can Guo 0 siblings, 1 reply; 9+ messages in thread From: Bart Van Assche @ 2026-05-04 3:06 UTC (permalink / raw) To: Can Guo, avri.altman, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, James E.J. Bottomley, open list:UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER..., open list On 5/1/26 3:16 PM, Can Guo wrote: > + if (host->hw_ver.major == 0x7 && host->hw_ver.minor == 0x1) > + hba->quirks |= UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3; How about future versions of the Qualcomm controller? Will future versions support this feature? Thanks, Bart. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] scsi: ufs: ufs-qcom: Use quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 2026-05-04 3:06 ` Bart Van Assche @ 2026-05-04 3:11 ` Can Guo 0 siblings, 0 replies; 9+ messages in thread From: Can Guo @ 2026-05-04 3:11 UTC (permalink / raw) To: Bart Van Assche, avri.altman, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, James E.J. Bottomley, open list:UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER..., open list Hi Bart, On 5/4/2026 11:06 AM, Bart Van Assche wrote: > On 5/1/26 3:16 PM, Can Guo wrote: >> + if (host->hw_ver.major == 0x7 && host->hw_ver.minor == 0x1) >> + hba->quirks |= >> UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3; > How about future versions of the Qualcomm controller? Will future > versions support this feature? Minor version 0x2 might need the same Quirk, 0x3 might not. I don't have a real HW/silicon with minor version 0x2 or 0x3 handy yet to verify, this is the best I can do as of today. Thanks, Can Guo. > > Thanks, > > Bart. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-05-05 5:49 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-05-01 13:16 [PATCH 0/2] scsi: ufs: Add quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 Can Guo 2026-05-01 13:16 ` [PATCH 1/2] scsi: ufs: core: Add a quirk for extended TX EQTR Adapt L0L1L2L3 length Can Guo 2026-05-04 3:06 ` Bart Van Assche 2026-05-04 9:19 ` Peter Wang (王信友) 2026-05-04 12:55 ` Can Guo 2026-05-05 5:48 ` Peter Wang (王信友) 2026-05-01 13:16 ` [PATCH 2/2] scsi: ufs: ufs-qcom: Use quirk EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 Can Guo 2026-05-04 3:06 ` Bart Van Assche 2026-05-04 3:11 ` Can Guo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox