[PATCH] usb: Add delay for control messages to reach usb stick

Janne Grunau j at jannau.net
Sat Aug 27 12:40:29 CEST 2022


On 2022-08-26 18:20:57 -0600, Simon Glass wrote:
> Hi,
> 
> On Fri, 26 Aug 2022 at 13:37, Janne Grunau <j at jannau.net> wrote:
> >
> > Hej,
> >
> > On 2022-08-25 23:35:33 -0600, Ashok Reddy Soma wrote:
> > > We are seeing timing issues with transcend usb sticks. These devices
> > > seems to require more time than regular devices for the control messages
> > > to reach device. Add 1ms delay before sending control message to fix
> > > trancend device detection issue.
> >
> > I suspect I see something similar with the DWC3 controller on Apple
> > M1/M2 devices. It seems to be related to USB full speed devices with
> > bMaxPacketSize0 of 8. Failing devices are so only keyboards since that
> > is a device everyone will connect when using a Mac Mini as desktop.
> > I can reproduce the issue with older Logitech Unifying Receiver wireless
> > keyboard/mouse dongles (bcdDevice 12.03 or 12.10). I could also resolve
> > the issue with random 'mdelay(1);'. I chased the cause of the issue down
> > to the initial USB descriptor read to parse 'bMaxPacketSize0' in
> > usb_setup_descriptor(). Please test if adding the delay after the
> > get_descriptor_len() call in usb_setup_descriptor() is enough.
> > On the Apple silicon devices reducing the read size from 64 byte to 8
> > resolves the issue as well. Please try attached work-in-progress patch
> > (comment and commit message are not finalized).
> >
> > HTH Janne
> >
> > > Signed-off-by: Ashok Reddy Soma <ashok.reddy.soma at amd.com>
> > > ---
> > >
> > >  common/usb.c | 6 ++++++
> > >  1 file changed, 6 insertions(+)
> > >
> > > diff --git a/common/usb.c b/common/usb.c
> > > index 6fcf1e8428..3fae32b048 100644
> > > --- a/common/usb.c
> > > +++ b/common/usb.c
> > > @@ -241,6 +241,12 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
> > >             request, requesttype, value, index, size);
> > >       dev->status = USB_ST_NOT_PROC; /*not yet processed */
> > >
> > > +     /* Timing issues are observed with transcend usb sticks such as
> > > +      * “Transcend Jetflash 350 USB2.0". Add 1ms delay for the usb
> > > +      * device to get detected.
> > > +      */
> > > +     mdelay(1);
> >
> > Please let's try to avoid this. I noticed a slowdown of USB probing with
> > an hub with 4 devices connected. Since Apple silicon devices are desktop
> > style machines I expect it's not uncommon to see systems with many USB
> > devices.
> 
> Can we add a CONFIG for this, or put a setting in the device tree? Or
> is there a way to detect the problem and retry?

A short search suggests that Transcend USB1.0 flash drives have a 
bMaxPacketSize0 of 64 so it's unlikely that my change to reduce the 
initial read of the usb descriptor will fix this but please try first.  
Have you verified that this delay is required for every USB control 
message and not just for a single one? Compare the mdelay for "Kingston 
DT Ultimate" in usb_select_config().

If this is an issue of this specific USB devices I don't see how a 
config option or device tree entry is going to help. Since it is an 
issue in the device detection it might not be even possible to add a 
device specific quirk for this.

Have you tried if shorter delays than 1 ms fix the issue as well?

I'll clean up the comment in my commit and send it later as patch.

Best regards

Janne


More information about the U-Boot mailing list