Commit 7b9cc7a2 authored by Konrad Leszczynski's avatar Konrad Leszczynski Committed by Felipe Balbi

usb: dwc3: gadget: give better command return code

if Start Transfer command fails, let's try a little
harder to figure out why the command failed and give
slightly better return codes. This will be usefulf
or isochronous endpoints, at least, which could
decide to retry a given request.
Signed-off-by: default avatarKonrad Leszczynski <konrad.leszczynski@intel.com>
Signed-off-by: default avatarRafal Redzimski <rafal.f.redzimski@intel.com>
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
parent 0878263b
...@@ -970,6 +970,10 @@ struct dwc3_event_depevt { ...@@ -970,6 +970,10 @@ struct dwc3_event_depevt {
#define DEPEVT_STATUS_CONTROL_DATA 1 #define DEPEVT_STATUS_CONTROL_DATA 1
#define DEPEVT_STATUS_CONTROL_STATUS 2 #define DEPEVT_STATUS_CONTROL_STATUS 2
/* In response to Start Transfer */
#define DEPEVT_TRANSFER_NO_RESOURCE 1
#define DEPEVT_TRANSFER_BUS_EXPIRY 2
u32 parameters:16; u32 parameters:16;
} __packed; } __packed;
......
...@@ -287,12 +287,39 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, ...@@ -287,12 +287,39 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep,
do { do {
reg = dwc3_readl(dwc->regs, DWC3_DEPCMD(ep)); reg = dwc3_readl(dwc->regs, DWC3_DEPCMD(ep));
if (!(reg & DWC3_DEPCMD_CMDACT)) { if (!(reg & DWC3_DEPCMD_CMDACT)) {
int cmd_status = DWC3_DEPCMD_STATUS(reg);
dwc3_trace(trace_dwc3_gadget, dwc3_trace(trace_dwc3_gadget,
"Command Complete --> %d", "Command Complete --> %d",
DWC3_DEPCMD_STATUS(reg)); cmd_status);
if (DWC3_DEPCMD_STATUS(reg))
switch (cmd_status) {
case 0:
ret = 0;
break;
case DEPEVT_TRANSFER_NO_RESOURCE:
dwc3_trace(trace_dwc3_gadget, "%s: no resource available");
ret = -EINVAL;
break; break;
ret = 0; case DEPEVT_TRANSFER_BUS_EXPIRY:
/*
* SW issues START TRANSFER command to
* isochronous ep with future frame interval. If
* future interval time has already passed when
* core receives the command, it will respond
* with an error status of 'Bus Expiry'.
*
* Instead of always returning -EINVAL, let's
* give a hint to the gadget driver that this is
* the case by returning -EAGAIN.
*/
dwc3_trace(trace_dwc3_gadget, "%s: bus expiry");
ret = -EAGAIN;
break;
default:
dev_WARN(dwc->dev, "UNKNOWN cmd status\n");
}
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment