In check_port_resume_type, we will check port power status to determine whether 
the status should change to -ENODEV.
If all ports power control of the hub are handled at once, the port power 
status may not represent the real case and cause resume fail.
At this patch, we add hub_is_port_power_switchable as well as checking the port 
power.

Signed-off-by: Chechun Kuo <vichy....@gmail.com>
---
 drivers/usb/core/hub.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index b649fef..a50b257 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2904,7 +2904,8 @@ static int check_port_resume_type(struct usb_device *udev,
        }
        /* Is the device still present? */
        else if (status || port_is_suspended(hub, portstatus) ||
-                       !port_is_power_on(hub, portstatus) ||
+                       (hub_is_port_power_switchable(hub)
+                               && !port_is_power_on(hub, portstatus)) ||
                        !(portstatus & USB_PORT_STAT_CONNECTION)) {
                if (status >= 0)
                        status = -ENODEV;
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to