summaryrefslogtreecommitdiff
path: root/drivers/usb/host
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/host')
-rw-r--r--drivers/usb/host/ehci-hcd.c13
-rw-r--r--drivers/usb/host/ehci.h3
2 files changed, 12 insertions, 4 deletions
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 74ffd20edff8..f6cf1d178107 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -400,14 +400,21 @@ static void ehci_work (struct ehci_hcd *ehci)
* it reports urb completions. this flag guards against bogus
* attempts at re-entrant schedule scanning.
*/
- if (ehci->scanning)
+ if (ehci->scanning) {
+ ehci->need_rescan = true;
return;
- ehci->scanning = 1;
+ }
+ ehci->scanning = true;
+
+ rescan:
+ ehci->need_rescan = false;
if (ehci->async_count)
scan_async(ehci);
if (ehci->next_uframe != -1)
scan_periodic (ehci);
- ehci->scanning = 0;
+ if (ehci->need_rescan)
+ goto rescan;
+ ehci->scanning = false;
/* the IO watchdog guards against hardware or driver bugs that
* misplace IRQs, and should let us run completely without IRQs.
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 */
enum ehci_rh_state rh_state;
/* general schedule support */
- unsigned scanning:1;
+ bool scanning:1;
+ bool need_rescan:1;
bool intr_unlinking:1;
bool async_unlinking:1;