|
@@ -145,6 +145,16 @@ static int handshake (struct ehci_hcd *ehci, void __iomem *ptr,
|
|
|
return -ETIMEDOUT;
|
|
|
}
|
|
|
|
|
|
+static int handshake_on_error_set_halt(struct ehci_hcd *ehci, void __iomem *ptr,
|
|
|
+ u32 mask, u32 done, int usec)
|
|
|
+{
|
|
|
+ int error = handshake(ehci, ptr, mask, done, usec);
|
|
|
+ if (error)
|
|
|
+ ehci_to_hcd(ehci)->state = HC_STATE_HALT;
|
|
|
+
|
|
|
+ return error;
|
|
|
+}
|
|
|
+
|
|
|
/* force HC to halt state from unknown (EHCI spec section 2.3) */
|
|
|
static int ehci_halt (struct ehci_hcd *ehci)
|
|
|
{
|
|
@@ -217,11 +227,9 @@ static void ehci_quiesce (struct ehci_hcd *ehci)
|
|
|
/* wait for any schedule enables/disables to take effect */
|
|
|
temp = ehci_readl(ehci, &ehci->regs->command) << 10;
|
|
|
temp &= STS_ASS | STS_PSS;
|
|
|
- if (handshake (ehci, &ehci->regs->status, STS_ASS | STS_PSS,
|
|
|
- temp, 16 * 125) != 0) {
|
|
|
- ehci_to_hcd(ehci)->state = HC_STATE_HALT;
|
|
|
+ if (handshake_on_error_set_halt(ehci, &ehci->regs->status,
|
|
|
+ STS_ASS | STS_PSS, temp, 16 * 125))
|
|
|
return;
|
|
|
- }
|
|
|
|
|
|
/* then disable anything that's still active */
|
|
|
temp = ehci_readl(ehci, &ehci->regs->command);
|
|
@@ -229,11 +237,8 @@ static void ehci_quiesce (struct ehci_hcd *ehci)
|
|
|
ehci_writel(ehci, temp, &ehci->regs->command);
|
|
|
|
|
|
/* hardware can take 16 microframes to turn off ... */
|
|
|
- if (handshake (ehci, &ehci->regs->status, STS_ASS | STS_PSS,
|
|
|
- 0, 16 * 125) != 0) {
|
|
|
- ehci_to_hcd(ehci)->state = HC_STATE_HALT;
|
|
|
- return;
|
|
|
- }
|
|
|
+ handshake_on_error_set_halt(ehci, &ehci->regs->status,
|
|
|
+ STS_ASS | STS_PSS, 0, 16 * 125);
|
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|