usb: dwc3: gadget: Issue END_TRANSFER to retry isoc transfer
After a number of unsuccessful start isoc attempts due to bus-expiry status, issue END_TRANSFER command and retry on the next XferNotReady event. Signed-off-by: Thinh Nguyen <thinhn@synopsys.com> Signed-off-by: Felipe Balbi <balbi@kernel.org>
This commit is contained in:

committed by
Felipe Balbi

parent
9bc3395c24
commit
36f05d36b0
@@ -1413,7 +1413,8 @@ static int __dwc3_gadget_start_isoc(struct dwc3_ep *dep)
|
|||||||
int ret;
|
int ret;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (list_empty(&dep->pending_list)) {
|
if (list_empty(&dep->pending_list) &&
|
||||||
|
list_empty(&dep->started_list)) {
|
||||||
dep->flags |= DWC3_EP_PENDING_REQUEST;
|
dep->flags |= DWC3_EP_PENDING_REQUEST;
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
@@ -1436,6 +1437,27 @@ static int __dwc3_gadget_start_isoc(struct dwc3_ep *dep)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* After a number of unsuccessful start attempts due to bus-expiry
|
||||||
|
* status, issue END_TRANSFER command and retry on the next XferNotReady
|
||||||
|
* event.
|
||||||
|
*/
|
||||||
|
if (ret == -EAGAIN) {
|
||||||
|
struct dwc3_gadget_ep_cmd_params params;
|
||||||
|
u32 cmd;
|
||||||
|
|
||||||
|
cmd = DWC3_DEPCMD_ENDTRANSFER |
|
||||||
|
DWC3_DEPCMD_CMDIOC |
|
||||||
|
DWC3_DEPCMD_PARAM(dep->resource_index);
|
||||||
|
|
||||||
|
dep->resource_index = 0;
|
||||||
|
memset(¶ms, 0, sizeof(params));
|
||||||
|
|
||||||
|
ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
|
||||||
|
if (!ret)
|
||||||
|
dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2663,6 +2685,18 @@ static void dwc3_gadget_endpoint_transfer_not_ready(struct dwc3_ep *dep,
|
|||||||
const struct dwc3_event_depevt *event)
|
const struct dwc3_event_depevt *event)
|
||||||
{
|
{
|
||||||
dwc3_gadget_endpoint_frame_from_event(dep, event);
|
dwc3_gadget_endpoint_frame_from_event(dep, event);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The XferNotReady event is generated only once before the endpoint
|
||||||
|
* starts. It will be generated again when END_TRANSFER command is
|
||||||
|
* issued. For some controller versions, the XferNotReady event may be
|
||||||
|
* generated while the END_TRANSFER command is still in process. Ignore
|
||||||
|
* it and wait for the next XferNotReady event after the command is
|
||||||
|
* completed.
|
||||||
|
*/
|
||||||
|
if (dep->flags & DWC3_EP_END_TRANSFER_PENDING)
|
||||||
|
return;
|
||||||
|
|
||||||
(void) __dwc3_gadget_start_isoc(dep);
|
(void) __dwc3_gadget_start_isoc(dep);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user