| From e92aee330837e4911553761490a8fb843f2053a6 Mon Sep 17 00:00:00 2001 |
| From: Julius Werner <jwerner@chromium.org> |
| Date: Tue, 15 Oct 2013 17:45:00 -0700 |
| Subject: usb: hub: Clear Port Reset Change during init/resume |
| |
| From: Julius Werner <jwerner@chromium.org> |
| |
| commit e92aee330837e4911553761490a8fb843f2053a6 upstream. |
| |
| This patch adds the Port Reset Change flag to the set of bits that are |
| preemptively cleared on init/resume of a hub. In theory this bit should |
| never be set unexpectedly... in practice it can still happen if BIOS, |
| SMM or ACPI code plays around with USB devices without cleaning up |
| correctly. This is especially dangerous for XHCI root hubs, which don't |
| generate any more Port Status Change Events until all change bits are |
| cleared, so this is a good precaution to have (similar to how it's |
| already done for the Warm Port Reset Change flag). |
| |
| Signed-off-by: Julius Werner <jwerner@chromium.org> |
| Acked-by: Alan Stern <stern@rowland.harvard.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/core/hub.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/drivers/usb/core/hub.c |
| +++ b/drivers/usb/core/hub.c |
| @@ -1129,6 +1129,11 @@ static void hub_activate(struct usb_hub |
| usb_clear_port_feature(hub->hdev, port1, |
| USB_PORT_FEAT_C_ENABLE); |
| } |
| + if (portchange & USB_PORT_STAT_C_RESET) { |
| + need_debounce_delay = true; |
| + usb_clear_port_feature(hub->hdev, port1, |
| + USB_PORT_FEAT_C_RESET); |
| + } |
| if ((portchange & USB_PORT_STAT_C_BH_RESET) && |
| hub_is_superspeed(hub->hdev)) { |
| need_debounce_delay = true; |