|
@@ -558,6 +558,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
|
|
xhci_dbg(xhci, "Resume USB2 port %d\n",
|
|
|
wIndex + 1);
|
|
|
bus_state->resume_done[wIndex] = 0;
|
|
|
+ clear_bit(wIndex, &bus_state->resuming_ports);
|
|
|
xhci_set_link_state(xhci, port_array, wIndex,
|
|
|
XDEV_U0);
|
|
|
xhci_dbg(xhci, "set port %d resume\n",
|
|
@@ -845,7 +846,12 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)
|
|
|
/* Initial status is no changes */
|
|
|
retval = (max_ports + 8) / 8;
|
|
|
memset(buf, 0, retval);
|
|
|
- status = 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Inform the usbcore about resume-in-progress by returning
|
|
|
+ * a non-zero value even if there are no status changes.
|
|
|
+ */
|
|
|
+ status = bus_state->resuming_ports;
|
|
|
|
|
|
mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC | PORT_WRC;
|
|
|
|
|
@@ -885,15 +891,11 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
|
|
|
spin_lock_irqsave(&xhci->lock, flags);
|
|
|
|
|
|
if (hcd->self.root_hub->do_remote_wakeup) {
|
|
|
- port_index = max_ports;
|
|
|
- while (port_index--) {
|
|
|
- if (bus_state->resume_done[port_index] != 0) {
|
|
|
- spin_unlock_irqrestore(&xhci->lock, flags);
|
|
|
- xhci_dbg(xhci, "suspend failed because "
|
|
|
- "port %d is resuming\n",
|
|
|
- port_index + 1);
|
|
|
- return -EBUSY;
|
|
|
- }
|
|
|
+ if (bus_state->resuming_ports) {
|
|
|
+ spin_unlock_irqrestore(&xhci->lock, flags);
|
|
|
+ xhci_dbg(xhci, "suspend failed because "
|
|
|
+ "a port is resuming\n");
|
|
|
+ return -EBUSY;
|
|
|
}
|
|
|
}
|
|
|
|