diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index a412277d1818..1c9bbdee3c89 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2830,8 +2830,19 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, const struct dwc3_event_depevt *event, struct dwc3_request *req, int status) { + struct dwc3 *dwc = dep->dwc; int ret; + /* + * If the HWO is set, it implies the TRB is still being + * processed by the core. Hence do not reclaim it until + * it is processed by the core. + */ + if (req->trb->ctrl & DWC3_TRB_CTRL_HWO) { + dbg_event(0xFF, "PEND TRB", dep->number); + return 1; + } + if (req->num_pending_sgs) ret = dwc3_gadget_ep_reclaim_trb_sg(dep, req, event, status);