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