Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: dwc3: gadget: fix writing NYET threshold

Before writing a new value to the register, the old value needs to be
masked out for the new value to be programmed as intended, because at
least in some cases the reset value of that field is 0xf (max value).

At the moment, the dwc3 core initialises the threshold to the maximum
value (0xf), with the option to override it via a DT. No upstream DTs
seem to override it, therefore this commit doesn't change behaviour for
any upstream platform. Nevertheless, the code should be fixed to have
the desired outcome.

Do so.

Fixes: 80caf7d21adc ("usb: dwc3: add lpm erratum support")
Cc: stable@vger.kernel.org # 5.10+ (needs adjustment for 5.4)
Signed-off-by: André Draszik <andre.draszik@linaro.org>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/20241209-dwc3-nyet-fix-v2-1-02755683345b@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

André Draszik and committed by
Greg Kroah-Hartman
01ea6bf5 4bbf9020

+4 -1
+1
drivers/usb/dwc3/core.h
··· 464 464 #define DWC3_DCTL_TRGTULST_SS_INACT (DWC3_DCTL_TRGTULST(6)) 465 465 466 466 /* These apply for core versions 1.94a and later */ 467 + #define DWC3_DCTL_NYET_THRES_MASK (0xf << 20) 467 468 #define DWC3_DCTL_NYET_THRES(n) (((n) & 0xf) << 20) 468 469 469 470 #define DWC3_DCTL_KEEP_CONNECT BIT(19)
+3 -1
drivers/usb/dwc3/gadget.c
··· 4195 4195 WARN_ONCE(DWC3_VER_IS_PRIOR(DWC3, 240A) && dwc->has_lpm_erratum, 4196 4196 "LPM Erratum not available on dwc3 revisions < 2.40a\n"); 4197 4197 4198 - if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A)) 4198 + if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A)) { 4199 + reg &= ~DWC3_DCTL_NYET_THRES_MASK; 4199 4200 reg |= DWC3_DCTL_NYET_THRES(dwc->lpm_nyet_threshold); 4201 + } 4200 4202 4201 4203 dwc3_gadget_dctl_write_safe(dwc, reg); 4202 4204 } else {