patch "usb: dwc3: gadget: Restart DWC3 gadget when enabling pullup" added to usb-linus
Subsystems (3)
This is a note to let you know that I've just added the patch titled
usb: dwc3: gadget: Restart DWC3 gadget when enabling pullup
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From a1383b3537a7bea1c213baa7878ccc4ecf4413b5 Mon Sep 17 00:00:00 2001
From: Wesley Cheng <[email protected]>
Date: Tue, 29 Dec 2020 15:00:37 -0800
Subject: usb: dwc3: gadget: Restart DWC3 gadget when enabling pullup
usb_gadget_deactivate/usb_gadget_activate does not execute the UDC start operation, which may leave EP0 disabled and event IRQs disabled when re-activating the function. Move the enabling/disabling of USB EP0 and device event IRQs to be performed in the pullup routine.
--- drivers/usb/dwc3/gadget.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-)
drivers/usb/dwc3/gadget.c +3 -11
@@ -2083,6 +2083,7 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend)static void dwc3_gadget_disable_irq (struct dwc3 *dwc);static void __dwc3_gadget_stop (struct dwc3 *dwc); +static int __dwc3_gadget_start (struct dwc3 *dwc);static int dwc3_gadget_pullup (struct usb_gadget *g,int is_on) {
@@ -2145,6 +2146,8 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) dwc->ev_buf->lpos = (dwc->ev_buf->lpos + count) % dwc->ev_buf->length; } + }else { +__dwc3_gadget_start (dwc); } ret =dwc3_gadget_run_stop (dwc, is_on, false);
@@ -2319,10 +2322,6 @@ static int dwc3_gadget_start(struct usb_gadget *g, } dwc->gadget_driver = driver; - -if (pm_runtime_active (dwc->dev)) -__dwc3_gadget_start (dwc); -spin_unlock_irqrestore (&dwc->lock, flags);return 0 ;
@@ -2348,13 +2347,6 @@ static int dwc3_gadget_stop(struct usb_gadget *g)unsigned long flags;spin_lock_irqsave (&dwc->lock, flags); - -if (pm_runtime_suspended (dwc->dev)) - goto out; - -__dwc3_gadget_stop (dwc); - -out: dwc->gadget_driver =NULL ;spin_unlock_irqrestore (&dwc->lock, flags);
Signature · 1 line
2.30.0