ChangeSet 1.2181.4.12, 2005/03/17 17:34:04-08:00, [EMAIL PROTECTED]
[PATCH] USB: ehci and short in-bulk transfers with 20KB+ urbs
This changes handling of short bulk IN transfers with URB buffers that
require
two or more transfer descriptors. The case is rare in most systems,
since few
drivers use such large buffers (bigger than 20KB, assuming 4K-aligned).
The existing code misbehave on at least NEC's EHCI 0.95 silicon, where
it seems
to hit a new variant of a silicon quirk relating to dummy TDs. Symptom
of the
misbehavior is that the host stops polling on the IN endpoint, and the
URB queue
no longer progresses.
This fix uses simpler logic to detect those short reads, dodging that
quirk.
Signed-off-by: David Brownell <[EMAIL PROTECTED]>
Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
ehci-q.c | 7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)
diff -Nru a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
--- a/drivers/usb/host/ehci-q.c 2005-03-30 15:06:39 -08:00
+++ b/drivers/usb/host/ehci-q.c 2005-03-30 15:06:39 -08:00
@@ -338,10 +338,11 @@
if ((token & QTD_STS_HALT) != 0) {
stopped = 1;
- /* magic dummy for some short reads; qh won't advance */
+ /* magic dummy for some short reads; qh won't advance.
+ * that silicon quirk can kick in with this dummy too.
+ */
} else if (IS_SHORT_READ (token)
- && (qh->hw_alt_next & QTD_MASK)
- == ehci->async->hw_alt_next) {
+ && !(qtd->hw_alt_next & EHCI_LIST_END))
{
stopped = 1;
goto halt;
}
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html