|
@@ -581,7 +581,7 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
|
|
|
|
|
|
/* make sure HW endpoint isn't stalled */
|
|
|
if (dep->flags & DWC3_EP_STALL)
|
|
|
- __dwc3_gadget_ep_set_halt(dep, 0);
|
|
|
+ __dwc3_gadget_ep_set_halt(dep, 0, false);
|
|
|
|
|
|
reg = dwc3_readl(dwc->regs, DWC3_DALEPENA);
|
|
|
reg &= ~DWC3_DALEPENA_EP(dep->number);
|
|
@@ -1202,7 +1202,7 @@ out0:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value)
|
|
|
+int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol)
|
|
|
{
|
|
|
struct dwc3_gadget_ep_cmd_params params;
|
|
|
struct dwc3 *dwc = dep->dwc;
|
|
@@ -1216,6 +1216,14 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value)
|
|
|
memset(¶ms, 0x00, sizeof(params));
|
|
|
|
|
|
if (value) {
|
|
|
+ if (!protocol && ((dep->direction && dep->flags & DWC3_EP_BUSY) ||
|
|
|
+ (!list_empty(&dep->req_queued) ||
|
|
|
+ !list_empty(&dep->request_list)))) {
|
|
|
+ dev_dbg(dwc->dev, "%s: pending request, cannot halt\n",
|
|
|
+ dep->name);
|
|
|
+ return -EAGAIN;
|
|
|
+ }
|
|
|
+
|
|
|
ret = dwc3_send_gadget_ep_cmd(dwc, dep->number,
|
|
|
DWC3_DEPCMD_SETSTALL, ¶ms);
|
|
|
if (ret)
|
|
@@ -1246,7 +1254,7 @@ static int dwc3_gadget_ep_set_halt(struct usb_ep *ep, int value)
|
|
|
int ret;
|
|
|
|
|
|
spin_lock_irqsave(&dwc->lock, flags);
|
|
|
- ret = __dwc3_gadget_ep_set_halt(dep, value);
|
|
|
+ ret = __dwc3_gadget_ep_set_halt(dep, value, false);
|
|
|
spin_unlock_irqrestore(&dwc->lock, flags);
|
|
|
|
|
|
return ret;
|
|
@@ -1265,7 +1273,7 @@ static int dwc3_gadget_ep_set_wedge(struct usb_ep *ep)
|
|
|
if (dep->number == 0 || dep->number == 1)
|
|
|
ret = __dwc3_gadget_ep0_set_halt(ep, 1);
|
|
|
else
|
|
|
- ret = __dwc3_gadget_ep_set_halt(dep, 1);
|
|
|
+ ret = __dwc3_gadget_ep_set_halt(dep, 1, false);
|
|
|
spin_unlock_irqrestore(&dwc->lock, flags);
|
|
|
|
|
|
return ret;
|