[U-Boot] [PATCH 11/11] usb: dwc3: Correct clean up code for requests

Lukasz Majewski l.majewski at samsung.com
Mon Feb 23 15:02:32 CET 2015


For u-boot dwc3 driver the scatter gather list support has been removed
from original linux code. It is correct, since we try to send one request
at a time.
However, the cleanup left spurious break, which caused early exit from
loop at dwc3_cleanup_done_reqs() function. As a result the dwc3_gadget_giveback()
wasn't called and caused USB Mass Storage to hang.

This commit removes this problem and refactor the code to remove superfluous
do { } while(1) loop.

Test HW: Odroid XU3 (with ./test/ums/ums_gadget_test.sh)

Signed-off-by: Lukasz Majewski <l.majewski at samsung.com>
---
 drivers/usb/dwc3/gadget.c | 38 ++++++++++++++------------------------
 1 file changed, 14 insertions(+), 24 deletions(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 97f23e5..cb15a38 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1753,33 +1753,23 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
 	struct dwc3_request	*req;
 	struct dwc3_trb		*trb;
 	unsigned int		slot;
-	int			ret;
-
-	do {
-		req = next_request(&dep->req_queued);
-		if (!req) {
-			WARN_ON_ONCE(1);
-			return 1;
-		}
-
-		slot = req->start_slot;
-		if ((slot == DWC3_TRB_NUM - 1) &&
-			usb_endpoint_xfer_isoc(dep->endpoint.desc))
-			slot++;
-		slot %= DWC3_TRB_NUM;
-		trb = &dep->trb_pool[slot];
 
-		dwc3_flush_cache((int)trb, sizeof(*trb));
-		ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb,
-				event, status);
-		if (ret)
-			break;
+	req = next_request(&dep->req_queued);
+	if (!req) {
+		WARN_ON_ONCE(1);
+		return 1;
+	}
 
-		dwc3_gadget_giveback(dep, req, status);
+	slot = req->start_slot;
+	if ((slot == DWC3_TRB_NUM - 1) &&
+	    usb_endpoint_xfer_isoc(dep->endpoint.desc))
+		slot++;
+	slot %= DWC3_TRB_NUM;
+	trb = &dep->trb_pool[slot];
 
-		if (ret)
-			break;
-	} while (1);
+	dwc3_flush_cache((int)trb, sizeof(*trb));
+	__dwc3_cleanup_done_trbs(dwc, dep, req, trb, event, status);
+	dwc3_gadget_giveback(dep, req, status);
 
 	if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
 			list_empty(&dep->req_queued)) {
-- 
2.0.0.rc2



More information about the U-Boot mailing list