|
@@ -678,6 +678,26 @@ void usb_poison_anchored_urbs(struct usb_anchor *anchor)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(usb_poison_anchored_urbs);
|
|
|
|
|
|
+/**
|
|
|
+ * usb_unpoison_anchored_urbs - let an anchor be used successfully again
|
|
|
+ * @anchor: anchor the requests are bound to
|
|
|
+ *
|
|
|
+ * Reverses the effect of usb_poison_anchored_urbs
|
|
|
+ * the anchor can be used normally after it returns
|
|
|
+ */
|
|
|
+void usb_unpoison_anchored_urbs(struct usb_anchor *anchor)
|
|
|
+{
|
|
|
+ unsigned long flags;
|
|
|
+ struct urb *lazarus;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&anchor->lock, flags);
|
|
|
+ list_for_each_entry(lazarus, &anchor->urb_list, anchor_list) {
|
|
|
+ usb_unpoison_urb(lazarus);
|
|
|
+ }
|
|
|
+ anchor->poisoned = 0;
|
|
|
+ spin_unlock_irqrestore(&anchor->lock, flags);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(usb_unpoison_anchored_urbs);
|
|
|
/**
|
|
|
* usb_unlink_anchored_urbs - asynchronously cancel transfer requests en masse
|
|
|
* @anchor: anchor the requests are bound to
|