Commit d3692953 authored by Felipe Balbi's avatar Felipe Balbi

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
...@@ -2271,24 +2271,16 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep, ...@@ -2271,24 +2271,16 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep,
return 0; return 0;
} }
static void dwc3_gadget_ep_cleanup_completed_requests(struct dwc3_ep *dep, static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep,
const struct dwc3_event_depevt *event, int status) struct dwc3_request *req, const struct dwc3_event_depevt *event,
int status)
{ {
struct dwc3_request *req, *n; struct dwc3_trb *trb = &dep->trb_pool[dep->trb_dequeue];
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 scatterlist *sg = req->sg; struct scatterlist *sg = req->sg;
struct scatterlist *s; struct scatterlist *s;
unsigned int pending = req->num_pending_sgs; unsigned int pending = req->num_pending_sgs;
unsigned int i; unsigned int i;
int ret = 0;
for_each_sg(sg, s, pending, i) { for_each_sg(sg, s, pending, i) {
trb = &dep->trb_pool[dep->trb_dequeue]; trb = &dep->trb_pool[dep->trb_dequeue];
...@@ -2299,17 +2291,44 @@ static void dwc3_gadget_ep_cleanup_completed_requests(struct dwc3_ep *dep, ...@@ -2299,17 +2291,44 @@ static void dwc3_gadget_ep_cleanup_completed_requests(struct dwc3_ep *dep,
req->sg = sg_next(s); req->sg = sg_next(s);
req->num_pending_sgs--; req->num_pending_sgs--;
ret = dwc3_gadget_ep_reclaim_completed_trb(dep, ret = dwc3_gadget_ep_reclaim_completed_trb(dep, req,
req, trb, event, status, trb, event, status, true);
chain);
if (ret) if (ret)
break; break;
} }
} else {
trb = &dep->trb_pool[dep->trb_dequeue]; return ret;
ret = dwc3_gadget_ep_reclaim_completed_trb(dep, req, }
trb, event, status, chain);
} 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) { if (req->unaligned || req->zero) {
trb = &dep->trb_pool[dep->trb_dequeue]; trb = &dep->trb_pool[dep->trb_dequeue];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment