| From 519034b686f3f1fb53137d5bea9255661b9d4c17 Mon Sep 17 00:00:00 2001 |
| From: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Date: Thu, 31 Oct 2019 11:07:13 +0200 |
| Subject: [PATCH] usb: dwc3: gadget: fix race when disabling ep with cancelled |
| xfers |
| |
| commit d8eca64eec7103ab1fbabc0a187dbf6acfb2af93 upstream. |
| |
| When disabling an endpoint which has cancelled requests, we should |
| make sure to giveback requests that are currently pending in the |
| cancelled list, otherwise we may fall into a situation where command |
| completion interrupt fires after endpoint has been disabled, therefore |
| causing a splat. |
| |
| Fixes: fec9095bdef4 "usb: dwc3: gadget: remove wait_end_transfer" |
| Reported-by: Roger Quadros <rogerq@ti.com> |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191031090713.1452818-1-felipe.balbi@linux.intel.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
| index d67655384eb2..caf8f8edb77a 100644 |
| --- a/drivers/usb/dwc3/gadget.c |
| +++ b/drivers/usb/dwc3/gadget.c |
| @@ -707,6 +707,12 @@ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) |
| |
| dwc3_gadget_giveback(dep, req, -ESHUTDOWN); |
| } |
| + |
| + while (!list_empty(&dep->cancelled_list)) { |
| + req = next_request(&dep->cancelled_list); |
| + |
| + dwc3_gadget_giveback(dep, req, -ESHUTDOWN); |
| + } |
| } |
| |
| /** |
| -- |
| 2.7.4 |
| |