|
@@ -739,13 +739,16 @@ static void hub_tt_work(struct work_struct *work)
|
|
|
int limit = 100;
|
|
|
|
|
|
spin_lock_irqsave (&hub->tt.lock, flags);
|
|
|
- while (--limit && !list_empty (&hub->tt.clear_list)) {
|
|
|
+ while (!list_empty(&hub->tt.clear_list)) {
|
|
|
struct list_head *next;
|
|
|
struct usb_tt_clear *clear;
|
|
|
struct usb_device *hdev = hub->hdev;
|
|
|
const struct hc_driver *drv;
|
|
|
int status;
|
|
|
|
|
|
+ if (!hub->quiescing && --limit < 0)
|
|
|
+ break;
|
|
|
+
|
|
|
next = hub->tt.clear_list.next;
|
|
|
clear = list_entry (next, struct usb_tt_clear, clear_list);
|
|
|
list_del (&clear->clear_list);
|
|
@@ -1210,7 +1213,7 @@ static void hub_quiesce(struct usb_hub *hub, enum hub_quiescing_type type)
|
|
|
if (hub->has_indicators)
|
|
|
cancel_delayed_work_sync(&hub->leds);
|
|
|
if (hub->tt.hub)
|
|
|
- cancel_work_sync(&hub->tt.clear_work);
|
|
|
+ flush_work_sync(&hub->tt.clear_work);
|
|
|
}
|
|
|
|
|
|
/* caller has locked the hub device */
|