On Wed, 17 Aug 2011, River Wang wrote: > From: Wang Zhi <zhi.wang@xxxxxxxxxxxxx> > Date: Wed, 17 Aug 2011 02:59:42 -0700 > Subject: [PATCH]: USB: EHCI: Do not rely on PORT_SUSPEND to stop USB > resuming in ehci_bus_resume(). > > From EHCI Spec p.28 HC should clear PORT_SUSPEND when SW clears > PORT_RESUME. In Intel Oaktrail platform, MPH (Multi-Port Host > Controller) core clears PORT_SUSPEND directly when SW sets PORT_RESUME > bit. If we rely on PORT_SUSPEND bit to stop USB resume, we will miss > the action of clearing PORT_RESUME. This will cause unexpected long > resume signal on USB bus. > > Signed-off-by: Wang Zhi <zhi.wang@xxxxxxxxxxxxx> > --- > ehci-hub.c | 7 +++---- > 1 file changed, 3 insertions(+), 4 deletions(-) > > diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c > index 88cfb8f..0f3a724 100644 > --- a/drivers/usb/host/ehci-hub.c > +++ b/drivers/usb/host/ehci-hub.c > @@ -343,7 +343,7 @@ static int ehci_bus_resume (struct usb_hcd *hcd) > u32 temp; > u32 power_okay; > int i; > - u8 resume_needed = 0; > + unsigned long resume_needed = 0; > > if (time_before (jiffies, ehci->next_statechange)) > msleep(5); > @@ -416,7 +416,7 @@ static int ehci_bus_resume (struct usb_hcd *hcd) > if (test_bit(i, &ehci->bus_suspended) && > (temp & PORT_SUSPEND)) { > temp |= PORT_RESUME; > - resume_needed = 1; > + set_bit(i, &resume_needed); > } > ehci_writel(ehci, temp, &ehci->regs->port_status [i]); > } > @@ -431,8 +431,7 @@ static int ehci_bus_resume (struct usb_hcd *hcd) > i = HCS_N_PORTS (ehci->hcs_params); > while (i--) { > temp = ehci_readl(ehci, &ehci->regs->port_status [i]); > - if (test_bit(i, &ehci->bus_suspended) && > - (temp & PORT_SUSPEND)) { > + if (test_bit(i, &resume_needed)) { > temp &= ~(PORT_RWC_BITS | PORT_RESUME); > ehci_writel(ehci, temp, &ehci->regs->port_status [i]); > ehci_vdbg (ehci, "resumed port %d\n", i + 1); Signed-off-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html