aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/host/ehci-hcd.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 92c62911f574..185721dba42b 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -501,6 +501,9 @@ static int ehci_run (struct usb_hcd *hcd)
501 u32 temp; 501 u32 temp;
502 u32 hcc_params; 502 u32 hcc_params;
503 503
504 hcd->uses_new_polling = 1;
505 hcd->poll_rh = 0;
506
504 /* EHCI spec section 4.1 */ 507 /* EHCI spec section 4.1 */
505 if ((retval = ehci_reset(ehci)) != 0) { 508 if ((retval = ehci_reset(ehci)) != 0) {
506 ehci_mem_cleanup(ehci); 509 ehci_mem_cleanup(ehci);
@@ -574,7 +577,7 @@ static int ehci_run (struct usb_hcd *hcd)
574static irqreturn_t ehci_irq (struct usb_hcd *hcd) 577static irqreturn_t ehci_irq (struct usb_hcd *hcd)
575{ 578{
576 struct ehci_hcd *ehci = hcd_to_ehci (hcd); 579 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
577 u32 status; 580 u32 status, pcd_status = 0;
578 int bh; 581 int bh;
579 582
580 spin_lock (&ehci->lock); 583 spin_lock (&ehci->lock);
@@ -624,6 +627,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
624 /* remote wakeup [4.3.1] */ 627 /* remote wakeup [4.3.1] */
625 if (status & STS_PCD) { 628 if (status & STS_PCD) {
626 unsigned i = HCS_N_PORTS (ehci->hcs_params); 629 unsigned i = HCS_N_PORTS (ehci->hcs_params);
630 pcd_status = status;
627 631
628 /* resume root hub? */ 632 /* resume root hub? */
629 if (!(ehci_readl(ehci, &ehci->regs->command) & CMD_RUN)) 633 if (!(ehci_readl(ehci, &ehci->regs->command) & CMD_RUN))
@@ -670,6 +674,8 @@ dead:
670 if (bh) 674 if (bh)
671 ehci_work (ehci); 675 ehci_work (ehci);
672 spin_unlock (&ehci->lock); 676 spin_unlock (&ehci->lock);
677 if (pcd_status & STS_PCD)
678 usb_hcd_poll_rh_status(hcd);
673 return IRQ_HANDLED; 679 return IRQ_HANDLED;
674} 680}
675 681