Skip to content

Commit

Permalink
usb: dwc3: gadget: avoid while (1) loop on completion
Browse files Browse the repository at this point in the history
We know that we have to iterate over the list of
started requests. Instead of looping forever, we can
rely on list_for_each_entry(). Likewise, instead of
a do {} while loop over all, maybe available,
scatterlist entries, we can detect if $this request
uses scatterlist and rely on for_each_sg().

This makes the code easier to follow while making
sure that we will *always* break out of the loop.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
  • Loading branch information
Felipe Balbi committed Aug 22, 2016
1 parent 08a36b5 commit 31162af
Showing 1 changed file with 19 additions and 13 deletions.
32 changes: 19 additions & 13 deletions drivers/usb/dwc3/gadget.c
Original file line number Diff line number Diff line change
Expand Up @@ -1926,31 +1926,37 @@ static int __dwc3_cleanup_done_trbs(struct dwc3 *dwc, struct dwc3_ep *dep,
static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
const struct dwc3_event_depevt *event, int status)
{
struct dwc3_request *req;
struct dwc3_request *req, *n;
struct dwc3_trb *trb;
unsigned int i;
int count = 0;
int ret;

do {
int chain;
list_for_each_entry_safe(req, n, &dep->started_list, list) {

req = next_request(&dep->started_list);
if (!req)
return 1;
int chain;

chain = req->request.num_mapped_sgs > 0;
i = 0;
do {
if (chain) {
struct scatterlist *sg = req->request.sg;
struct scatterlist *s;
unsigned int i;

for_each_sg(sg, s, req->request.num_mapped_sgs, i) {
trb = &dep->trb_pool[dep->trb_dequeue];
count += trb->size & DWC3_TRB_SIZE_MASK;
dwc3_ep_inc_deq(dep);

ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb,
event, status, chain);
}
} else {
trb = &dep->trb_pool[dep->trb_dequeue];
count += trb->size & DWC3_TRB_SIZE_MASK;
dwc3_ep_inc_deq(dep);

ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb,
event, status, chain);
if (ret)
break;
} while (++i < req->request.num_mapped_sgs);
}

/*
* We assume here we will always receive the entire data block
Expand All @@ -1964,7 +1970,7 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,

if (ret)
break;
} while (1);
}

/*
* Our endpoint might get disabled by another thread during
Expand Down

0 comments on commit 31162af

Please sign in to comment.