diff options
Diffstat (limited to 'drivers/usb/host/ehci-q.c')
| -rw-r--r-- | drivers/usb/host/ehci-q.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 00ad9ce392ed..139a2cc3f641 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
| @@ -487,8 +487,20 @@ halt: | |||
| 487 | * we must clear the TT buffer (11.17.5). | 487 | * we must clear the TT buffer (11.17.5). |
| 488 | */ | 488 | */ |
| 489 | if (unlikely(last_status != -EINPROGRESS && | 489 | if (unlikely(last_status != -EINPROGRESS && |
| 490 | last_status != -EREMOTEIO)) | 490 | last_status != -EREMOTEIO)) { |
| 491 | ehci_clear_tt_buffer(ehci, qh, urb, token); | 491 | /* The TT's in some hubs malfunction when they |
| 492 | * receive this request following a STALL (they | ||
| 493 | * stop sending isochronous packets). Since a | ||
| 494 | * STALL can't leave the TT buffer in a busy | ||
| 495 | * state (if you believe Figures 11-48 - 11-51 | ||
| 496 | * in the USB 2.0 spec), we won't clear the TT | ||
| 497 | * buffer in this case. Strictly speaking this | ||
| 498 | * is a violation of the spec. | ||
| 499 | */ | ||
| 500 | if (last_status != -EPIPE) | ||
| 501 | ehci_clear_tt_buffer(ehci, qh, urb, | ||
| 502 | token); | ||
| 503 | } | ||
| 492 | } | 504 | } |
| 493 | 505 | ||
| 494 | /* if we're removing something not at the queue head, | 506 | /* if we're removing something not at the queue head, |
