| From 084a804e01205bcd74cd0849bc72cb5c88f8e648 Mon Sep 17 00:00:00 2001 |
| From: Roger Quadros <rogerq@ti.com> |
| Date: Tue, 27 Feb 2018 12:41:41 +0200 |
| Subject: usb: dwc3: Fix lock-up on ID change during system suspend/resume |
| |
| From: Roger Quadros <rogerq@ti.com> |
| |
| commit 084a804e01205bcd74cd0849bc72cb5c88f8e648 upstream. |
| |
| To reproduce the lock up do the following |
| - connect otg host adapter and a USB device to the dual-role port |
| so that it is in host mode. |
| - suspend to mem. |
| - disconnect otg adapter. |
| - resume the system. |
| |
| If we call dwc3_host_exit() before tasks are thawed |
| xhci_plat_remove() seems to lock up at the second usb_remove_hcd() call. |
| |
| To work around this we queue the _dwc3_set_mode() work on |
| the system_freezable_wq. |
| |
| Fixes: 41ce1456e1db ("usb: dwc3: core: make dwc3_set_mode() work properly") |
| Cc: <stable@vger.kernel.org> # v4.12+ |
| Suggested-by: Manu Gautam <mgautam@codeaurora.org> |
| Signed-off-by: Roger Quadros <rogerq@ti.com> |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/dwc3/core.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/usb/dwc3/core.c |
| +++ b/drivers/usb/dwc3/core.c |
| @@ -186,7 +186,7 @@ void dwc3_set_mode(struct dwc3 *dwc, u32 |
| dwc->desired_dr_role = mode; |
| spin_unlock_irqrestore(&dwc->lock, flags); |
| |
| - queue_work(system_power_efficient_wq, &dwc->drd_work); |
| + queue_work(system_freezable_wq, &dwc->drd_work); |
| } |
| |
| u32 dwc3_core_fifo_space(struct dwc3_ep *dep, u8 type) |