diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2012-07-11 11:22:57 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-07-16 19:56:47 -0400 |
commit | 361aabf395e4a23cf554cf4ec0c0c6963b8beb01 (patch) | |
tree | 607f8e039f47905713b7634a663dccd6998d8135 /drivers/usb/host/ehci.h | |
parent | 32830f207691176234b4c4dd17f0d7ab6d87d94b (diff) |
USB: EHCI: don't lose events during a scan
This patch (as1584) fixes a minor bug that has been present in
ehci-hcd since the beginning.
Scanning the schedules for URB completions is single-threaded. If a
completion interrupt occurs while an URB is being given back, the
interrupt handler realizes that a scan is in progress on another CPU
and avoids starting a new one.
This means that completion events can be lost. If an URB completes
after it has been scanned but while a scan is still in progress, the
driver won't notice and won't rescan the completed URB.
The patch fixes the problem by adding a new flag to indicate that
another scan is needed after the current scan is done. The flag gets
set whenever a completion interrupt occurs while a scan is in
progress. The rescan will see the completion, thus preventing it from
getting lost.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/host/ehci.h')
-rw-r--r-- | drivers/usb/host/ehci.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 303c36cc99c9..c462d52ac575 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
@@ -113,7 +113,8 @@ struct ehci_hcd { /* one per controller */ | |||
113 | enum ehci_rh_state rh_state; | 113 | enum ehci_rh_state rh_state; |
114 | 114 | ||
115 | /* general schedule support */ | 115 | /* general schedule support */ |
116 | unsigned scanning:1; | 116 | bool scanning:1; |
117 | bool need_rescan:1; | ||
117 | bool intr_unlinking:1; | 118 | bool intr_unlinking:1; |
118 | bool async_unlinking:1; | 119 | bool async_unlinking:1; |
119 | 120 | ||