diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2005-12-17 18:00:12 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-03-20 14:49:57 -0800 |
commit | af0bb5998abe8ed28ee354dd4c71689cacdc91e9 (patch) | |
tree | 20172dd9551d0e2497ef4b6dff1a84f010f981ab /drivers/usb/host/uhci-hcd.h | |
parent | dccf4a48d47120a42382ba526f1a0848c13ba2a4 (diff) | |
download | kernel_samsung_smdk4412-af0bb5998abe8ed28ee354dd4c71689cacdc91e9.zip kernel_samsung_smdk4412-af0bb5998abe8ed28ee354dd4c71689cacdc91e9.tar.gz kernel_samsung_smdk4412-af0bb5998abe8ed28ee354dd4c71689cacdc91e9.tar.bz2 |
[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-hcd.h')
-rw-r--r-- | drivers/usb/host/uhci-hcd.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/usb/host/uhci-hcd.h b/drivers/usb/host/uhci-hcd.h index 7a9481c..c057956 100644 --- a/drivers/usb/host/uhci-hcd.h +++ b/drivers/usb/host/uhci-hcd.h @@ -128,6 +128,7 @@ struct uhci_qh { struct usb_device *udev; struct list_head queue; /* Queue of urbps for this QH */ struct uhci_qh *skel; /* Skeleton for this QH */ + struct uhci_td *dummy_td; /* Dummy TD to end the queue */ unsigned int unlink_frame; /* When the QH was unlinked */ int state; /* QH_STATE_xxx; see above */ |