Re: [PATCH 01/13] usb: define a generic USB_RESUME_TIMEOUT macro

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Sun, Feb 15, 2015 at 09:06:15AM +0800, Peter Chen wrote:
> On Fri, Feb 13, 2015 at 07:42:22PM -0600, Felipe Balbi wrote:
> > On Sat, Feb 14, 2015 at 08:13:36AM +0800, Greg KH wrote:
> > > On Fri, Feb 13, 2015 at 03:07:43PM -0600, Felipe Balbi wrote:
> > > > Every USB Host controller should use this new
> > > > macro to define for how long resume signalling
> > > > should be driven on the bus.
> > > > 
> > > > Currently, almost every single USB controller
> > > > is using a 20ms timeout for resume signalling.
> > > > 
> > > > That's problematic for two reasons:
> > > > 
> > > > a) sometimes that 20ms timer expires a little
> > > > before 20ms, which makes us fail certification
> > > > 
> > > > b) some (many) devices actually need more than
> > > > 20ms resume signalling.
> > > > 
> > > > Sure, in case of (b) we can state that the device
> > > > is against the USB spec, but the fact is that
> > > > we have no control over which device the certification
> > > > lab will use. We also have no control over which host
> > > > they will use. Most likely they'll be using a Windows
> > > > PC which, again, we have no control over how that
> > > > USB stack is written and how long resume signalling
> > > > they are using.
> > > > 
> > > > At the end of the day, we must make sure Linux passes
> > > > electrical compliance when working as Host or as Device
> > > > and currently we don't pass compliance as host because
> > > > we're driving resume signallig for exactly 20ms and
> > > > that confuses certification test setup resulting in
> > > > Certification failure.
> > > > 
> > > > Signed-off-by: Felipe Balbi <balbi@xxxxxx>
> > > > ---
> > > >  include/linux/usb.h | 3 +++
> > > >  1 file changed, 3 insertions(+)
> > > > 
> > > > diff --git a/include/linux/usb.h b/include/linux/usb.h
> > > > index f89c24a03bd9..1dd89f0db344 100644
> > > > --- a/include/linux/usb.h
> > > > +++ b/include/linux/usb.h
> > > > @@ -210,6 +210,9 @@ void usb_put_intf(struct usb_interface *intf);
> > > >  #define USB_MAXINTERFACES	32
> > > >  #define USB_MAXIADS		(USB_MAXINTERFACES/2)
> > > >  
> > > > +/* USB Resume Timer */
> > > > +#define USB_RESUME_TIMEOUT	40 /* ms */
> > > > +
> > > 
> > > If you add the comment as Alan suggested, feel free to add:
> > > 
> > > Acked-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
> > 
> > Is this good enough ?
> > 
> > commit 3154122f81c8411b432d5f44a196302243d5af3d
> > Author: Felipe Balbi <balbi@xxxxxx>
> > Date:   Fri Feb 13 14:34:25 2015 -0600
> > 
> >     usb: define a generic USB_RESUME_TIMEOUT macro
> >     
> >     Every USB Host controller should use this new
> >     macro to define for how long resume signalling
> >     should be driven on the bus.
> >     
> >     Currently, almost every single USB controller
> >     is using a 20ms timeout for resume signalling.
> >     
> >     That's problematic for two reasons:
> >     
> >     a) sometimes that 20ms timer expires a little
> >     before 20ms, which makes us fail certification
> >     
> >     b) some (many) devices actually need more than
> >     20ms resume signalling.
> >     
> >     Sure, in case of (b) we can state that the device
> >     is against the USB spec, but the fact is that
> >     we have no control over which device the certification
> >     lab will use. We also have no control over which host
> >     they will use. Most likely they'll be using a Windows
> >     PC which, again, we have no control over how that
> >     USB stack is written and how long resume signalling
> >     they are using.
> >     
> >     At the end of the day, we must make sure Linux passes
> >     electrical compliance when working as Host or as Device
> >     and currently we don't pass compliance as host because
> >     we're driving resume signallig for exactly 20ms and
> >     that confuses certification test setup resulting in
> >     Certification failure.
> >     
> >     Signed-off-by: Felipe Balbi <balbi@xxxxxx>
> > 
> > diff --git a/include/linux/usb.h b/include/linux/usb.h
> > index 7ee1b5c3b4cb..447fe29b55b4 100644
> > --- a/include/linux/usb.h
> > +++ b/include/linux/usb.h
> > @@ -205,6 +205,32 @@ void usb_put_intf(struct usb_interface *intf);
> >  #define USB_MAXINTERFACES	32
> >  #define USB_MAXIADS		(USB_MAXINTERFACES/2)
> >  
> > +/*
> > + * USB Resume Timer: Every Host controller driver should drive the resume
> > + * signalling on the bus for the amount of time defined by this macro.
> > + *
> > + * That way we will have a 'stable' behavior among all HCDs supported by Linux.
> > + *
> > + * Note that the USB Specification states we should drive resume for *at least*
> > + * 20 ms, but it doesn't give an upper bound. This creates two possible
> > + * situations which we want to avoid:
> > + *
> > + * (a) sometimes an msleep(20) might expire slightly before 20 ms, which causes
> > + * us to fail USB Electrical Tests, thus failing Certification
> > + *
> > + * (b) Some (many) devices actually need more than 20 ms of resume signalling,
> > + * and while we can argue that's against the USB Specification, we don't have
> > + * control over which devices a certification laboratory will be using for
> > + * certification. If CertLab uses a device which was tested against Windows and
> > + * that happens to have relaxed resume signalling rules, we might fall into
> > + * situations where we fail interoperability and electrical tests.
> > + *
> > + * In order to avoid both conditions, we're using a 40 ms resume timeout, which
> > + * should cope with both LPJ calibration errors and devices not following every
> > + * detail of the USB Specification.
> > + */
> > +#define USB_RESUME_TIMEOUT	40 /* ms */
> > +
> 
> It should be ok for chipidea core which end of its resume signal
> automatically about ~21ms.
> 
> By the way, which item you have failed for USB Certification test?
> 
> Acked-by: Peter Chen <peter.chen@xxxxxxxxxxxxx>

Electrical tests for resume signaling. It failed with a specific hub,
however :-) But it's easy to note with dwc3/musb and a USB sniffer.
Sometimes resume signalling is cut before 20ms because we had msleep(20)
:-)

-- 
balbi

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux