diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index e1aed082fcd8..c09a09a2d192 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -319,6 +319,8 @@ int dwc3_event_buffers_setup(struct dwc3 *dwc) evt->buf, (unsigned long long) evt->dma, evt->length); + memset(evt->buf, 0, evt->length); + evt->lpos = 0; dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n), diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index a9186eac9f2b..81ef0aacaba1 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1691,6 +1691,10 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) dwc->pullups_connected = true; } else { + dwc3_gadget_disable_irq(dwc); + __dwc3_gadget_ep_disable(dwc->eps[0]); + __dwc3_gadget_ep_disable(dwc->eps[1]); + reg &= ~DWC3_DCTL_RUN_STOP; if (dwc->has_hibernation && !suspend) @@ -2942,6 +2946,12 @@ static void dwc3_process_event_entry(struct dwc3 *dwc, { trace_dwc3_event(event->raw); + /* If run/stop is cleared don't process any more events */ + if (!dwc->pullups_connected) { + dbg_print_reg("SKIP_EVT_PULLUP", event->raw); + return; + } + /* Endpoint IRQ, handle it and return early */ if (event->type.is_devspec == 0) { /* depevt */