From: Andiry Xu Date: Thu, 31 Mar 2011 06:56:50 +0000 (+0800) Subject: usbcore: Bug fix: system can't suspend with USB3.0 device connected to USB3.0 hub X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=a8f08d86dbf1b7bb5869cf1807d2fd40ec9d6d0a;p=GitHub%2FLineageOS%2Fandroid_kernel_samsung_universal7580.git usbcore: Bug fix: system can't suspend with USB3.0 device connected to USB3.0 hub This patch clear PORT_POWER when suspend a USB3.0 device behind a USB3.0 external hub, so the system can suspend and resume. Note USB3.0 device may not work after system resume and this is a temporary workaround. The correct fix will be in future patches. Signed-off-by: Andiry Xu Signed-off-by: Sarah Sharp --- diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 8fb754916c6..93720bdc9ef 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -2285,7 +2285,17 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) } /* see 7.1.7.6 */ - status = set_port_feature(hub->hdev, port1, USB_PORT_FEAT_SUSPEND); + /* Clear PORT_POWER if it's a USB3.0 device connected to USB 3.0 + * external hub. + * FIXME: this is a temporary workaround to make the system able + * to suspend/resume. + */ + if ((hub->hdev->parent != NULL) && hub_is_superspeed(hub->hdev)) + status = clear_port_feature(hub->hdev, port1, + USB_PORT_FEAT_POWER); + else + status = set_port_feature(hub->hdev, port1, + USB_PORT_FEAT_SUSPEND); if (status) { dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n", port1, status);