summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0035-usb-do-no-disable-interrupts-in-giveback.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0035-usb-do-no-disable-interrupts-in-giveback.patch')
-rw-r--r--debian/patches-rt/0035-usb-do-no-disable-interrupts-in-giveback.patch46
1 files changed, 46 insertions, 0 deletions
diff --git a/debian/patches-rt/0035-usb-do-no-disable-interrupts-in-giveback.patch b/debian/patches-rt/0035-usb-do-no-disable-interrupts-in-giveback.patch
new file mode 100644
index 000000000..07b1ab8e9
--- /dev/null
+++ b/debian/patches-rt/0035-usb-do-no-disable-interrupts-in-giveback.patch
@@ -0,0 +1,46 @@
+From 58c679541448da375ccc262585f3172e913811f3 Mon Sep 17 00:00:00 2001
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Date: Fri, 8 Nov 2013 17:34:54 +0100
+Subject: [PATCH 035/347] usb: do no disable interrupts in giveback
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.246-rt110.tar.xz
+
+Since commit 94dfd7ed ("USB: HCD: support giveback of URB in tasklet
+context") the USB code disables interrupts before invoking the complete
+callback.
+This should not be required the HCD completes the URBs either in hard-irq
+context or in BH context. Lockdep may report false positives if one has two
+HCDs (one completes in IRQ and the other in BH context) and is using the same
+USB driver (device) with both HCDs. This is safe since the same URBs are never
+mixed with those two HCDs.
+Longeterm we should force all HCDs to complete in the same context.
+
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ drivers/usb/core/hcd.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
+index df661460e9f9..1a1487d312d0 100644
+--- a/drivers/usb/core/hcd.c
++++ b/drivers/usb/core/hcd.c
+@@ -1752,7 +1752,6 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
+ struct usb_hcd *hcd = bus_to_hcd(urb->dev->bus);
+ struct usb_anchor *anchor = urb->anchor;
+ int status = urb->unlinked;
+- unsigned long flags;
+
+ urb->hcpriv = NULL;
+ if (unlikely((urb->transfer_flags & URB_SHORT_NOT_OK) &&
+@@ -1780,9 +1779,7 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
+ * and no one may trigger the above deadlock situation when
+ * running complete() in tasklet.
+ */
+- local_irq_save(flags);
+ urb->complete(urb);
+- local_irq_restore(flags);
+
+ usb_anchor_resume_wakeups(anchor);
+ atomic_dec(&urb->use_count);
+--
+2.36.1
+