aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2012-11-14 18:58:52 -0500
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2013-01-03 17:10:21 -0500
commit1c7439c61fa6516419c32a9824976334ea969d47 (patch)
tree8d379bd7147c6361adcffd7959aea985530230cf /drivers/usb
parent55c1945edaac94c5338a3647bc2e85ff75d9cf36 (diff)
USB: Handle auto-transition from hot to warm reset.
USB 3.0 hubs and roothubs will automatically transition a failed hot reset to a warm (BH) reset. In that case, the warm reset change bit will be set, and the link state change bit may also be set. Change hub_port_finish_reset to unconditionally clear those change bits for USB 3.0 hubs. If these bits are not cleared, we may lose port change events from the roothub. This commit should be backported to kernels as old as 3.2, that contain the commit 75d7cf72ab9fa01dc70877aa5c68e8ef477229dc "usbcore: refine warm reset logic". Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/core/hub.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index a815fd2cc5e..7f8f10ec127 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2580,16 +2580,16 @@ static void hub_port_finish_reset(struct usb_hub *hub, int port1,
2580 clear_port_feature(hub->hdev, 2580 clear_port_feature(hub->hdev,
2581 port1, USB_PORT_FEAT_C_RESET); 2581 port1, USB_PORT_FEAT_C_RESET);
2582 /* FIXME need disconnect() for NOTATTACHED device */ 2582 /* FIXME need disconnect() for NOTATTACHED device */
2583 if (warm) { 2583 if (hub_is_superspeed(hub->hdev)) {
2584 clear_port_feature(hub->hdev, port1, 2584 clear_port_feature(hub->hdev, port1,
2585 USB_PORT_FEAT_C_BH_PORT_RESET); 2585 USB_PORT_FEAT_C_BH_PORT_RESET);
2586 clear_port_feature(hub->hdev, port1, 2586 clear_port_feature(hub->hdev, port1,
2587 USB_PORT_FEAT_C_PORT_LINK_STATE); 2587 USB_PORT_FEAT_C_PORT_LINK_STATE);
2588 } else { 2588 }
2589 if (!warm)
2589 usb_set_device_state(udev, *status 2590 usb_set_device_state(udev, *status
2590 ? USB_STATE_NOTATTACHED 2591 ? USB_STATE_NOTATTACHED
2591 : USB_STATE_DEFAULT); 2592 : USB_STATE_DEFAULT);
2592 }
2593 break; 2593 break;
2594 } 2594 }
2595} 2595}