diff options
Diffstat (limited to 'drivers/usb/dwc3/ep0.c')
| -rw-r--r-- | drivers/usb/dwc3/ep0.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 197af63f8d05..61de693461da 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->pullups_connected) { +	if (!dep->endpoint.desc || !dwc->pullups_connected || !dwc->connected) {  		dev_err(dwc->dev, "%s: can't queue to disabled endpoint\n",  				dep->name);  		ret = -ESHUTDOWN; @@ -293,7 +293,10 @@ void dwc3_ep0_out_start(struct dwc3 *dwc)  			continue;  		dwc3_ep->flags &= ~DWC3_EP_DELAY_STOP; -		dwc3_stop_active_transfer(dwc3_ep, true, true); +		if (dwc->connected) +			dwc3_stop_active_transfer(dwc3_ep, true, true); +		else +			dwc3_remove_requests(dwc, dwc3_ep, -ESHUTDOWN);  	}  } @@ -815,7 +818,7 @@ static void dwc3_ep0_inspect_setup(struct dwc3 *dwc,  	int ret = -EINVAL;  	u32 len; -	if (!dwc->gadget_driver || !dwc->connected) +	if (!dwc->gadget_driver || !dwc->softconnect || !dwc->connected)  		goto out;  	trace_dwc3_ctrl_req(ctrl); @@ -1118,6 +1121,8 @@ static void dwc3_ep0_xfernotready(struct dwc3 *dwc,  {  	switch (event->status) {  	case DEPEVT_STATUS_CONTROL_DATA: +		if (!dwc->softconnect || !dwc->connected) +			return;  		/*  		 * We already have a DATA transfer in the controller's cache,  		 * if we receive a XferNotReady(DATA) we will ignore it, unless  |