From 904ab34b5407ade62f5fd4a8ca2df08402bc9f0e Mon Sep 17 00:00:00 2001 From: Elson Roy Serrao Date: Tue, 15 Oct 2019 15:05:32 -0700 Subject: [PATCH] usb: dwc3: ep0: Fail enqueue() when racing with vbus_sess disconnect When the setup packet comes right before the disconnect notification there is a possible race between clearing the run stop bit and enqueuing the setup packet. This results in controller halt failure. Add a vbus_active check before enqueuing the packet to fix this issue. Change-Id: I3921a1fa92a0f5c6892f1cc3ffe9dda6366b72b1 Signed-off-by: Elson Roy Serrao Signed-off-by: Jack Pham --- drivers/usb/dwc3/ep0.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 83127b8a0e21..b7dfd93c4be9 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c @@ -197,7 +197,8 @@ int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, int ret; spin_lock_irqsave(&dwc->lock, flags); - if (!dep->endpoint.desc || !dwc->pullups_connected) { + if (!dep->endpoint.desc || !dwc->softconnect || + !dwc->vbus_active) { dev_err(dwc->dev, "%s: can't queue to disabled endpoint\n", dep->name); ret = -ESHUTDOWN;