]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
usb: dwc3: gadget: fix writing NYET threshold
authorAndré Draszik <andre.draszik@linaro.org>
Mon, 9 Dec 2024 11:49:53 +0000 (11:49 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 1 Feb 2025 17:22:22 +0000 (18:22 +0100)
commit 01ea6bf5cb58b20cc1bd159f0cf74a76cf04bb69 upstream.

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>
drivers/usb/dwc3/core.h
drivers/usb/dwc3/gadget.c

index 3649400f04a762fdf7ad0a910644c4608d330cdc..4ccbd2dc1bf81e99820fb7c5650a711d50d09685 100644 (file)
 #define DWC3_DCTL_TRGTULST_SS_INACT    (DWC3_DCTL_TRGTULST(6))
 
 /* These apply for core versions 1.94a and later */
+#define DWC3_DCTL_NYET_THRES_MASK      (0xf << 20)
 #define DWC3_DCTL_NYET_THRES(n)                (((n) & 0xf) << 20)
 
 #define DWC3_DCTL_KEEP_CONNECT         BIT(19)
index 2665c7d27f19bc3ea62b8a5c2a37fea879daf4ae..e1e18a4f0d0715ecb68fee2e64e1d6144501a1d8 100644 (file)
@@ -3519,8 +3519,10 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
                WARN_ONCE(DWC3_VER_IS_PRIOR(DWC3, 240A) && dwc->has_lpm_erratum,
                                "LPM Erratum not available on dwc3 revisions < 2.40a\n");
 
-               if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A))
+               if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A)) {
+                       reg &= ~DWC3_DCTL_NYET_THRES_MASK;
                        reg |= DWC3_DCTL_NYET_THRES(dwc->lpm_nyet_threshold);
+               }
 
                dwc3_gadget_dctl_write_safe(dwc, reg);
        } else {