Hello.
On 07-09-2012 8:33, Pratyush Anand wrote:
There were still some corner cases where isoc transfer was not able to
restart, specially when missed does not happen , and gadget does
Missed what does not happen?
not queue any new request during giveback.
Cleanup function calls giveback first, which provides a way to queue
another request to gadget. But gadget did not had any data so , it did
^^^ have
not call ep_queue. To twist it further, gadget did not queue till
cleanup for last queued TRB is called. If we ever reach this scenario,
we must call END TRANSFER.
Signed-off-by: Pratyush Anand <[email protected]>
---
drivers/usb/dwc3/gadget.c | 22 ++++++++++++++++------
1 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 0f6874c..ef4d9ef 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1115,9 +1115,13 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep,
struct dwc3_request *req)
* notion of current microframe.
*/
if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
- dwc3_stop_active_transfer(dwc, dep->number);
+ if (list_empty(&dep->req_queued)) {
+ dwc3_stop_active_transfer(dwc, dep->number);
+ dep->flags = DWC3_EP_ENABLED;
+ }
return 0;
}
+
ret = __dwc3_gadget_kick_transfer(dep, 0, true);
if (ret && ret != -EBUSY) {
struct dwc3 *dwc = dep->dwc;
@@ -1760,11 +1764,17 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc,
struct dwc3_ep *dep,
break;
} while (1);
- if (list_empty(&dep->req_queued) &&
- (dep->flags & DWC3_EP_MISSED_ISOC)) {
- dwc3_stop_active_transfer(dwc, dep->number);
- dep->flags &= ~DWC3_EP_MISSED_ISOC;
- return 1;
+ if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
+ if (list_empty(&dep->req_queued)) {
+ if (list_empty(&dep->request_list) ||
Looks like this *if* is indented too much... BTW, all three *if*
statements could be collapsed into one...
WBR, Sergei
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html