aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/usb/host/uhci-debug.c
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2005-12-17 18:00:12 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2006-03-20 14:49:57 -0800
commitaf0bb5998abe8ed28ee354dd4c71689cacdc91e9 (patch)
tree20172dd9551d0e2497ef4b6dff1a84f010f981ab /drivers/usb/host/uhci-debug.c
parent[PATCH] UHCI: use one QH per endpoint, not per URB (diff)
downloadwireguard-linux-af0bb5998abe8ed28ee354dd4c71689cacdc91e9.tar.xz
wireguard-linux-af0bb5998abe8ed28ee354dd4c71689cacdc91e9.zip
[PATCH] UHCI: use dummy TDs
This patch (as624) fixes a hardware race in uhci-hcd by adding a dummy TD to the end of each endpoint's queue. Without the dummy the host controller will effectively turn off the queue when it reaches the end, which happens asynchronously. This leads to a potential problem when new transfer descriptors are added to the end of the queue; they may never get used. With a dummy TD present the controller never turns off the queue; instead it just stops at the dummy and leaves the queue on but inactive. When new TDs are added to the end of the queue, the first new one gets written over the dummy. Thus there's never any question about whether the queue is running or needs to be restarted. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/uhci-debug.c')
-rw-r--r--drivers/usb/host/uhci-debug.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/usb/host/uhci-debug.c b/drivers/usb/host/uhci-debug.c
index 3faccbd68547..6814783adf91 100644
--- a/drivers/usb/host/uhci-debug.c
+++ b/drivers/usb/host/uhci-debug.c
@@ -189,6 +189,11 @@ static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space)
space, "", nurbs);
}
+ if (qh->udev) {
+ out += sprintf(out, "%*s Dummy TD\n", space, "");
+ out += uhci_show_td(qh->dummy_td, out, len - (out - buf), 0);
+ }
+
return out - buf;
}