mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
BACKPORT: usb: dwc3: gadget: Do not clear ep delayed stop flag during ep disable
DWC3_EP_DELAYED_STOP is utilized to defer issuing the end transfer command until the subsequent SETUP stage, in order to avoid end transfer timeouts. During cable disconnect scenarios, __dwc3_gadget_ep_disable() is responsible for ensuring endpoints have no active transfers pending. Since dwc3_remove_request() can now exit early if the EP delayed stop is set, avoid clearing all DEP flags, otherwise the transition back into the SETUP stage won't issue an endxfer command. Bug: 280698396 Bug: 276227797 Fixes:2b2da6574e("usb: dwc3: Avoid unmapping USB requests if endxfer is not complete") Reviewed-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> Change-Id: I4453c4ddfe7ad15e9c5b1ba2be09d20cac72b0bf Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com> Link: https://lore.kernel.org/r/20220919231213.21364-1-quic_wcheng@quicinc.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> (cherry picked from commit76bff31c7f) (cherry picked from commit c0b28ac8b3976be4277de828aefc914ce2741f95)
This commit is contained in:
committed by
Matthias Männich
parent
66cba6260a
commit
57f609a261
@@ -1013,6 +1013,7 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
|
|||||||
{
|
{
|
||||||
struct dwc3 *dwc = dep->dwc;
|
struct dwc3 *dwc = dep->dwc;
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
u32 mask;
|
||||||
|
|
||||||
trace_dwc3_gadget_ep_disable(dep);
|
trace_dwc3_gadget_ep_disable(dep);
|
||||||
|
|
||||||
@@ -1028,7 +1029,15 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
|
|||||||
|
|
||||||
dep->stream_capable = false;
|
dep->stream_capable = false;
|
||||||
dep->type = 0;
|
dep->type = 0;
|
||||||
dep->flags &= DWC3_EP_TXFIFO_RESIZED;
|
mask = DWC3_EP_TXFIFO_RESIZED;
|
||||||
|
/*
|
||||||
|
* dwc3_remove_requests() can exit early if DWC3 EP delayed stop is
|
||||||
|
* set. Do not clear DEP flags, so that the end transfer command will
|
||||||
|
* be reattempted during the next SETUP stage.
|
||||||
|
*/
|
||||||
|
if (dep->flags & DWC3_EP_DELAY_STOP)
|
||||||
|
mask |= (DWC3_EP_DELAY_STOP | DWC3_EP_TRANSFER_STARTED);
|
||||||
|
dep->flags &= mask;
|
||||||
|
|
||||||
/* Clear out the ep descriptors for non-ep0 */
|
/* Clear out the ep descriptors for non-ep0 */
|
||||||
if (dep->number > 1) {
|
if (dep->number > 1) {
|
||||||
|
|||||||
Reference in New Issue
Block a user