From 4b4b6715b7549e52efe144a834e034531356646e Mon Sep 17 00:00:00 2001 From: Elson Roy Serrao Date: Mon, 20 Jan 2020 09:10:25 -0800 Subject: [PATCH] usb: ep0: complete the pending control request before soft-disconnect We abort the control request enqueue during a device initiated disconnect as soon as the softconnect flag gets cleared. Whenever there is a race between a control request and soft disconnect, the pending control request is aborted before dwc3_gadget_pullup() function tries to complete it. As a result the subsequent soft reconnect fails resulting in usb connection loss. Avoid this by deciding the enqueue() operation based on pullups_connected flag which gets cleared after completing the pending request and putting the core in setup phase. Change-Id: Ie21ecead7ed73569a426cd8bac586a5576c72993 Signed-off-by: Elson Roy Serrao --- drivers/usb/dwc3/ep0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 68f7a35b73b5..83b912cf1846 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c @@ -197,7 +197,7 @@ 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->softconnect || + if (!dep->endpoint.desc || !dwc->pullups_connected || !dwc->vbus_active) { dev_err(dwc->dev, "%s: can't queue to disabled endpoint\n", dep->name);