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

Commit d3692953 authored by Felipe Balbi's avatar Felipe Balbi
Browse files

usb: dwc3: gadget: split scatterlist and linear handlers



instead of having one big loop, let's split it down into two smaller
handlers: one for linear buffers and one for scatterlist.

Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
parent d5044a04
Loading
Loading
Loading
Loading
+45 −26
Original line number Diff line number Diff line
@@ -2271,24 +2271,16 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep,
	return 0;
}

static void dwc3_gadget_ep_cleanup_completed_requests(struct dwc3_ep *dep,
		const struct dwc3_event_depevt *event, int status)
static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep,
		struct dwc3_request *req, const struct dwc3_event_depevt *event,
		int status)
{
	struct dwc3_request	*req, *n;
	struct dwc3_trb		*trb;
	int			ret = 0;

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

		length = req->request.length;
		chain = req->num_pending_sgs > 0;
		if (chain) {
	struct dwc3_trb *trb = &dep->trb_pool[dep->trb_dequeue];
	struct scatterlist *sg = req->sg;
	struct scatterlist *s;
	unsigned int pending = req->num_pending_sgs;
	unsigned int i;
	int ret = 0;

	for_each_sg(sg, s, pending, i) {
		trb = &dep->trb_pool[dep->trb_dequeue];
@@ -2299,18 +2291,45 @@ static void dwc3_gadget_ep_cleanup_completed_requests(struct dwc3_ep *dep,
		req->sg = sg_next(s);
		req->num_pending_sgs--;

				ret = dwc3_gadget_ep_reclaim_completed_trb(dep,
						req, trb, event, status,
						chain);
		ret = dwc3_gadget_ep_reclaim_completed_trb(dep, req,
				trb, event, status, true);
		if (ret)
			break;
	}
		} else {
			trb = &dep->trb_pool[dep->trb_dequeue];
			ret = dwc3_gadget_ep_reclaim_completed_trb(dep, req,
					trb, event, status, chain);

	return ret;
}

static int dwc3_gadget_ep_reclaim_trb_linear(struct dwc3_ep *dep,
		struct dwc3_request *req, const struct dwc3_event_depevt *event,
		int status)
{
	struct dwc3_trb *trb = &dep->trb_pool[dep->trb_dequeue];

	return dwc3_gadget_ep_reclaim_completed_trb(dep, req, trb,
			event, status, false);
}

static void dwc3_gadget_ep_cleanup_completed_requests(struct dwc3_ep *dep,
		const struct dwc3_event_depevt *event, int status)
{
	struct dwc3_request	*req, *n;
	struct dwc3_trb		*trb;
	int			ret = 0;

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

		length = req->request.length;
		chain = req->num_pending_sgs > 0;
		if (chain)
			ret = dwc3_gadget_ep_reclaim_trb_sg(dep, req, event,
					status);
		else
			ret = dwc3_gadget_ep_reclaim_trb_linear(dep, req, event,
					status);

		if (req->unaligned || req->zero) {
			trb = &dep->trb_pool[dep->trb_dequeue];
			ret = dwc3_gadget_ep_reclaim_completed_trb(dep, req,