Message ID | 28ccd8ca12c3310b86c0b84b73c1b607c1e00ebe.camel@kernel.crashing.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [1/2] usb: gadget: net2280: Move all "ll" registers in one structure | expand |
Zitat von Benjamin Herrenschmidt <benh@kernel.crashing.org>: > The errata description is: > > Workaround for Default Duration of LFPS Handshake Signaling for > Device-Initiated U1 Exit is too short. > > The default duration of the LFPS handshake generated by USB3380 for > a device-initiated U1-exit may not be > long enough for certain SuperSpeed downstream ports (SuperSpeed > hubs/hosts) to recognize. This could lead > to USB3380 entering the recovery state pre-maturely and ending up in > the SS.Inactive state. > > I have observed various enumeration failures, seemingly related to > lost transactions or SETUP status phases on modern hosts (typically > thunderbolt capable systems) without this workaround. > > Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> > --- > drivers/usb/gadget/udc/net2280.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/usb/gadget/udc/net2280.c > b/drivers/usb/gadget/udc/net2280.c > index e0191146ba22..51efee21915f 100644 > --- a/drivers/usb/gadget/udc/net2280.c > +++ b/drivers/usb/gadget/udc/net2280.c > @@ -2269,6 +2269,16 @@ static void usb_reinit_338x(struct net2280 *dev) > val |= 0x3 << HOT_RX_RESET_TS2; > writel(val, &dev->llregs->ll_tsn_counters_3); > > + /* > + * AB errata. Errata 11. Workaround for Default Duration of LFPS > + * Handshake Signaling for Device-Initiated U1 Exit is too short. > + * Without this, various enumeration failures observed with > + * modern superspeed hosts. > + */ > + val = readl(&dev->llregs->ll_lfps_timers_2); > + writel((val & 0xffff0000) | LFPS_TIMERS_2_WORKAROUND_VALUE, > + &dev->llregs->ll_lfps_timers_2); > + > /* > * Set Recovery Idle to Recover bit: > * - On SS connections, setting Recovery Idle to Recover Fmw improves I'm ok with your patch sequence. -Guido
diff --git a/drivers/usb/gadget/udc/net2280.c b/drivers/usb/gadget/udc/net2280.c index e0191146ba22..51efee21915f 100644 --- a/drivers/usb/gadget/udc/net2280.c +++ b/drivers/usb/gadget/udc/net2280.c @@ -2269,6 +2269,16 @@ static void usb_reinit_338x(struct net2280 *dev) val |= 0x3 << HOT_RX_RESET_TS2; writel(val, &dev->llregs->ll_tsn_counters_3); + /* + * AB errata. Errata 11. Workaround for Default Duration of LFPS + * Handshake Signaling for Device-Initiated U1 Exit is too short. + * Without this, various enumeration failures observed with + * modern superspeed hosts. + */ + val = readl(&dev->llregs->ll_lfps_timers_2); + writel((val & 0xffff0000) | LFPS_TIMERS_2_WORKAROUND_VALUE, + &dev->llregs->ll_lfps_timers_2); + /* * Set Recovery Idle to Recover bit: * - On SS connections, setting Recovery Idle to Recover Fmw improves
The errata description is: Workaround for Default Duration of LFPS Handshake Signaling for Device-Initiated U1 Exit is too short. The default duration of the LFPS handshake generated by USB3380 for a device-initiated U1-exit may not be long enough for certain SuperSpeed downstream ports (SuperSpeed hubs/hosts) to recognize. This could lead to USB3380 entering the recovery state pre-maturely and ending up in the SS.Inactive state. I have observed various enumeration failures, seemingly related to lost transactions or SETUP status phases on modern hosts (typically thunderbolt capable systems) without this workaround. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> --- drivers/usb/gadget/udc/net2280.c | 10 ++++++++++ 1 file changed, 10 insertions(+)