mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-18 21:21:37 +00:00
usb: dwc3: Correct clean up code for requests
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@samsung.com>
This commit is contained in:
parent
afa093bfa7
commit
3621b3b8a7
1 changed files with 14 additions and 24 deletions
|
@ -1755,33 +1755,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;
|
||||
}
|
||||
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];
|
||||
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;
|
||||
|
||||
dwc3_gadget_giveback(dep, req, status);
|
||||
|
||||
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)) {
|
||||
|
|
Loading…
Add table
Reference in a new issue