diff options
Diffstat (limited to 'drivers/usb')
| -rw-r--r-- | drivers/usb/host/ehci-hub.c | 4 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-hub.c | 7 | ||||
| -rw-r--r-- | drivers/usb/host/uhci-hcd.c | 7 | ||||
| -rw-r--r-- | drivers/usb/host/uhci-hub.c | 2 | 
4 files changed, 15 insertions, 5 deletions
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 1292a5b2197..796ea0c8900 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c @@ -166,6 +166,10 @@ static void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci,  			ehci_writel(ehci, temp | HOSTPC_PHCD, hostpc_reg);  		}  	} + +	/* Does the root hub have a port wakeup pending? */ +	if (!suspending && (ehci_readl(ehci, &ehci->regs->status) & STS_PCD)) +		usb_hcd_resume_root_hub(ehci_to_hcd(ehci));  }  static int ehci_bus_suspend (struct usb_hcd *hcd) diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 4dd39022c38..cddcda95b57 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c @@ -355,6 +355,11 @@ static void ohci_finish_controller_resume(struct usb_hcd *hcd)  		ohci_readl(ohci, &ohci->regs->intrenable);  		msleep(20);  	} + +	/* Does the root hub have a port wakeup pending? */ +	if (ohci_readl(ohci, &ohci->regs->intrstatus) & +			(OHCI_INTR_RD | OHCI_INTR_RHSC)) +		usb_hcd_resume_root_hub(hcd);  }  /* Carry out polling-, autostop-, and autoresume-related state changes */ @@ -364,7 +369,7 @@ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,  	int	poll_rh = 1;  	int	rhsc_enable; -	/* Some broken controllers never turn off RHCS in the interrupt +	/* Some broken controllers never turn off RHSC in the interrupt  	 * status register.  For their sake we won't re-enable RHSC  	 * interrupts if the interrupt bit is already active.  	 */ diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index a7850f51fdc..9d4d81248f9 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c @@ -862,10 +862,11 @@ static int uhci_pci_resume(struct usb_hcd *hcd, bool hibernated)  	/* If interrupts don't work and remote wakeup is enabled then  	 * the suspended root hub needs to be polled.  	 */ -	if (!uhci->RD_enable && hcd->self.root_hub->do_remote_wakeup) { +	if (!uhci->RD_enable && hcd->self.root_hub->do_remote_wakeup)  		set_bit(HCD_FLAG_POLL_RH, &hcd->flags); -		usb_hcd_poll_rh_status(hcd); -	} + +	/* Does the root hub have a port wakeup pending? */ +	usb_hcd_poll_rh_status(hcd);  	return 0;  }  #endif diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c index f0c58116c0a..6d59c0f77f2 100644 --- a/drivers/usb/host/uhci-hub.c +++ b/drivers/usb/host/uhci-hub.c @@ -200,7 +200,7 @@ static int uhci_hub_status_data(struct usb_hcd *hcd, char *buf)  	    case UHCI_RH_SUSPENDING:  	    case UHCI_RH_SUSPENDED:  		/* if port change, ask to be resumed */ -		if (status) +		if (status || uhci->resuming_ports)  			usb_hcd_resume_root_hub(hcd);  		break;  |