|
@@ -375,19 +375,9 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned cmd,
|
|
|
|
|
|
|
|
trace_dwc3_gadget_ep_cmd(dep, cmd, params, cmd_status);
|
|
trace_dwc3_gadget_ep_cmd(dep, cmd, params, cmd_status);
|
|
|
|
|
|
|
|
- if (ret == 0) {
|
|
|
|
|
- switch (DWC3_DEPCMD_CMD(cmd)) {
|
|
|
|
|
- case DWC3_DEPCMD_STARTTRANSFER:
|
|
|
|
|
- dep->flags |= DWC3_EP_TRANSFER_STARTED;
|
|
|
|
|
- dwc3_gadget_ep_get_transfer_index(dep);
|
|
|
|
|
- break;
|
|
|
|
|
- case DWC3_DEPCMD_ENDTRANSFER:
|
|
|
|
|
- dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
|
|
|
|
|
- break;
|
|
|
|
|
- default:
|
|
|
|
|
- /* nothing */
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (ret == 0 && DWC3_DEPCMD_CMD(cmd) == DWC3_DEPCMD_STARTTRANSFER) {
|
|
|
|
|
+ dep->flags |= DWC3_EP_TRANSFER_STARTED;
|
|
|
|
|
+ dwc3_gadget_ep_get_transfer_index(dep);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (unlikely(susphy)) {
|
|
if (unlikely(susphy)) {
|
|
@@ -633,7 +623,6 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, unsigned int action)
|
|
|
|
|
|
|
|
dep->type = usb_endpoint_type(desc);
|
|
dep->type = usb_endpoint_type(desc);
|
|
|
dep->flags |= DWC3_EP_ENABLED;
|
|
dep->flags |= DWC3_EP_ENABLED;
|
|
|
- dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING;
|
|
|
|
|
|
|
|
|
|
reg = dwc3_readl(dwc->regs, DWC3_DALEPENA);
|
|
reg = dwc3_readl(dwc->regs, DWC3_DALEPENA);
|
|
|
reg |= DWC3_DALEPENA_EP(dep->number);
|
|
reg |= DWC3_DALEPENA_EP(dep->number);
|
|
@@ -739,7 +728,7 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
|
|
|
|
|
|
|
|
dep->stream_capable = false;
|
|
dep->stream_capable = false;
|
|
|
dep->type = 0;
|
|
dep->type = 0;
|
|
|
- dep->flags &= DWC3_EP_END_TRANSFER_PENDING;
|
|
|
|
|
|
|
+ dep->flags = 0;
|
|
|
|
|
|
|
|
/* Clear out the ep descriptors for non-ep0 */
|
|
/* Clear out the ep descriptors for non-ep0 */
|
|
|
if (dep->number > 1) {
|
|
if (dep->number > 1) {
|
|
@@ -1410,7 +1399,10 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
|
|
|
goto out0;
|
|
goto out0;
|
|
|
|
|
|
|
|
dwc3_gadget_move_cancelled_request(req);
|
|
dwc3_gadget_move_cancelled_request(req);
|
|
|
- goto out0;
|
|
|
|
|
|
|
+ if (dep->flags & DWC3_EP_TRANSFER_STARTED)
|
|
|
|
|
+ goto out0;
|
|
|
|
|
+ else
|
|
|
|
|
+ goto out1;
|
|
|
}
|
|
}
|
|
|
dev_err(dwc->dev, "request %pK was not queued to %s\n",
|
|
dev_err(dwc->dev, "request %pK was not queued to %s\n",
|
|
|
request, ep->name);
|
|
request, ep->name);
|
|
@@ -1418,6 +1410,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
|
|
|
goto out0;
|
|
goto out0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+out1:
|
|
|
dwc3_gadget_giveback(dep, req, -ECONNRESET);
|
|
dwc3_gadget_giveback(dep, req, -ECONNRESET);
|
|
|
|
|
|
|
|
out0:
|
|
out0:
|
|
@@ -2389,7 +2382,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
|
|
|
dep = dwc->eps[epnum];
|
|
dep = dwc->eps[epnum];
|
|
|
|
|
|
|
|
if (!(dep->flags & DWC3_EP_ENABLED)) {
|
|
if (!(dep->flags & DWC3_EP_ENABLED)) {
|
|
|
- if (!(dep->flags & DWC3_EP_END_TRANSFER_PENDING))
|
|
|
|
|
|
|
+ if (!(dep->flags & DWC3_EP_TRANSFER_STARTED))
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
/* Handle only EPCMDCMPLT when EP disabled */
|
|
/* Handle only EPCMDCMPLT when EP disabled */
|
|
@@ -2413,7 +2406,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
|
|
|
cmd = DEPEVT_PARAMETER_CMD(event->parameters);
|
|
cmd = DEPEVT_PARAMETER_CMD(event->parameters);
|
|
|
|
|
|
|
|
if (cmd == DWC3_DEPCMD_ENDTRANSFER) {
|
|
if (cmd == DWC3_DEPCMD_ENDTRANSFER) {
|
|
|
- dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING;
|
|
|
|
|
|
|
+ dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
|
|
|
dwc3_gadget_ep_cleanup_cancelled_requests(dep);
|
|
dwc3_gadget_ep_cleanup_cancelled_requests(dep);
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
@@ -2470,8 +2463,7 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force)
|
|
|
u32 cmd;
|
|
u32 cmd;
|
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
|
|
- if ((dep->flags & DWC3_EP_END_TRANSFER_PENDING) ||
|
|
|
|
|
- !dep->resource_index)
|
|
|
|
|
|
|
+ if (!(dep->flags & DWC3_EP_TRANSFER_STARTED))
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -2514,10 +2506,8 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force)
|
|
|
WARN_ON_ONCE(ret);
|
|
WARN_ON_ONCE(ret);
|
|
|
dep->resource_index = 0;
|
|
dep->resource_index = 0;
|
|
|
|
|
|
|
|
- if (dwc3_is_usb31(dwc) || dwc->revision < DWC3_REVISION_310A) {
|
|
|
|
|
- dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
|
|
|
|
|
|
|
+ if (dwc3_is_usb31(dwc) || dwc->revision < DWC3_REVISION_310A)
|
|
|
udelay(100);
|
|
udelay(100);
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void dwc3_clear_stall_all_ep(struct dwc3 *dwc)
|
|
static void dwc3_clear_stall_all_ep(struct dwc3 *dwc)
|
|
@@ -3141,7 +3131,6 @@ int dwc3_gadget_init(struct dwc3 *dwc)
|
|
|
dwc->gadget.speed = USB_SPEED_UNKNOWN;
|
|
dwc->gadget.speed = USB_SPEED_UNKNOWN;
|
|
|
dwc->gadget.sg_supported = true;
|
|
dwc->gadget.sg_supported = true;
|
|
|
dwc->gadget.name = "dwc3-gadget";
|
|
dwc->gadget.name = "dwc3-gadget";
|
|
|
- dwc->gadget.is_otg = dwc->dr_mode == USB_DR_MODE_OTG;
|
|
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
* FIXME We might be setting max_speed to <SUPER, however versions
|
|
* FIXME We might be setting max_speed to <SUPER, however versions
|