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 | ||
