Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31162af4 authored by Felipe Balbi's avatar Felipe Balbi
Browse files

usb: dwc3: gadget: avoid while (1) loop on completion



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: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
parent 08a36b54
Loading
Loading
Loading
Loading
+19 −13
Original line number Original line Diff line number Diff line
@@ -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,
static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
		const struct dwc3_event_depevt *event, int status)
		const struct dwc3_event_depevt *event, int status)
{
{
	struct dwc3_request	*req;
	struct dwc3_request	*req, *n;
	struct dwc3_trb		*trb;
	struct dwc3_trb		*trb;
	unsigned int		i;
	int			count = 0;
	int			count = 0;
	int			ret;
	int			ret;


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


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


		chain = req->request.num_mapped_sgs > 0;
		chain = req->request.num_mapped_sgs > 0;
		i = 0;
		if (chain) {
		do {
			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];
				trb = &dep->trb_pool[dep->trb_dequeue];
				count += trb->size & DWC3_TRB_SIZE_MASK;
				count += trb->size & DWC3_TRB_SIZE_MASK;
				dwc3_ep_inc_deq(dep);
				dwc3_ep_inc_deq(dep);


				ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb,
				ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb,
						event, status, chain);
						event, status, chain);
			if (ret)
			}
				break;
		} else {
		} while (++i < req->request.num_mapped_sgs);
			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);
		}


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


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


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