| From 62f0342de1f012f3e90607d39e20fce811391169 Mon Sep 17 00:00:00 2001 |
| From: Felipe Balbi <balbi@ti.com> |
| Date: Fri, 13 Feb 2015 14:34:25 -0600 |
| Subject: usb: define a generic USB_RESUME_TIMEOUT macro |
| |
| From: Felipe Balbi <balbi@ti.com> |
| |
| commit 62f0342de1f012f3e90607d39e20fce811391169 upstream. |
| |
| 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. |
| |
| Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Acked-by: Peter Chen <peter.chen@freescale.com> |
| Signed-off-by: Felipe Balbi <balbi@ti.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| include/linux/usb.h | 26 ++++++++++++++++++++++++++ |
| 1 file changed, 26 insertions(+) |
| |
| --- a/include/linux/usb.h |
| +++ b/include/linux/usb.h |
| @@ -205,6 +205,32 @@ void usb_put_intf(struct usb_interface * |
| #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 */ |
| + |
| /** |
| * struct usb_interface_cache - long-term representation of a device interface |
| * @num_altsetting: number of altsettings defined. |