diff options
Diffstat (limited to 'drivers/usb/host/ehci-q.c')
-rw-r--r-- | drivers/usb/host/ehci-q.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 9b13bf2fa98d..e469221e7ec3 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
@@ -702,7 +702,7 @@ qh_make ( | |||
702 | } | 702 | } |
703 | 703 | ||
704 | /* support for tt scheduling, and access to toggles */ | 704 | /* support for tt scheduling, and access to toggles */ |
705 | qh->dev = usb_get_dev (urb->dev); | 705 | qh->dev = urb->dev; |
706 | 706 | ||
707 | /* using TT? */ | 707 | /* using TT? */ |
708 | switch (urb->dev->speed) { | 708 | switch (urb->dev->speed) { |
@@ -721,7 +721,14 @@ qh_make ( | |||
721 | info1 |= maxp << 16; | 721 | info1 |= maxp << 16; |
722 | 722 | ||
723 | info2 |= (EHCI_TUNE_MULT_TT << 30); | 723 | info2 |= (EHCI_TUNE_MULT_TT << 30); |
724 | info2 |= urb->dev->ttport << 23; | 724 | |
725 | /* Some Freescale processors have an erratum in which the | ||
726 | * port number in the queue head was 0..N-1 instead of 1..N. | ||
727 | */ | ||
728 | if (ehci_has_fsl_portno_bug(ehci)) | ||
729 | info2 |= (urb->dev->ttport-1) << 23; | ||
730 | else | ||
731 | info2 |= urb->dev->ttport << 23; | ||
725 | 732 | ||
726 | /* set the address of the TT; for TDI's integrated | 733 | /* set the address of the TT; for TDI's integrated |
727 | * root hub tt, leave it zeroed. | 734 | * root hub tt, leave it zeroed. |
@@ -1015,12 +1022,14 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
1015 | /* stop async schedule right now? */ | 1022 | /* stop async schedule right now? */ |
1016 | if (unlikely (qh == ehci->async)) { | 1023 | if (unlikely (qh == ehci->async)) { |
1017 | /* can't get here without STS_ASS set */ | 1024 | /* can't get here without STS_ASS set */ |
1018 | if (ehci_to_hcd(ehci)->state != HC_STATE_HALT) { | 1025 | if (ehci_to_hcd(ehci)->state != HC_STATE_HALT |
1026 | && !ehci->reclaim) { | ||
1027 | /* ... and CMD_IAAD clear */ | ||
1019 | writel (cmd & ~CMD_ASE, &ehci->regs->command); | 1028 | writel (cmd & ~CMD_ASE, &ehci->regs->command); |
1020 | wmb (); | 1029 | wmb (); |
1021 | // handshake later, if we need to | 1030 | // handshake later, if we need to |
1031 | timer_action_done (ehci, TIMER_ASYNC_OFF); | ||
1022 | } | 1032 | } |
1023 | timer_action_done (ehci, TIMER_ASYNC_OFF); | ||
1024 | return; | 1033 | return; |
1025 | } | 1034 | } |
1026 | 1035 | ||