usb: dwc3: gadget: increment dequeue pointer on completion
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Thu, 11 Aug 2016 09:24:27 +0000 (12:24 +0300)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 22 Aug 2016 07:45:37 +0000 (10:45 +0300)
Instead of waiting until giveback before
incrementing the dequeue pointer, we can increment
it from dwc3_cleanup_done_reqs(), that way we avoid
an extra loop over all TRBs during giveback.

While at that, also avoid using req->first_trb_index
as that's completely unnecessary. A follow-up patch
will clean up further uses of that and remove the
field altogether.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc3/gadget.c

index 15df5ed..1804599 100644 (file)
@@ -174,15 +174,8 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
                int status)
 {
        struct dwc3                     *dwc = dep->dwc;
-       int                             i;
 
-       if (req->started) {
-               i = 0;
-               do {
-                       dwc3_ep_inc_deq(dep);
-               } while(++i < req->request.num_mapped_sgs);
-               req->started = false;
-       }
+       req->started = false;
        list_del(&req->list);
        req->trb = NULL;
 
@@ -2004,7 +1997,6 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
 {
        struct dwc3_request     *req;
        struct dwc3_trb         *trb;
-       unsigned int            slot;
        unsigned int            i;
        int                     count = 0;
        int                     ret;
@@ -2019,12 +2011,9 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
                chain = req->request.num_mapped_sgs > 0;
                i = 0;
                do {
-                       slot = req->first_trb_index + i;
-                       if (slot == DWC3_TRB_NUM - 1)
-                               slot++;
-                       slot %= DWC3_TRB_NUM;
-                       trb = &dep->trb_pool[slot];
+                       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);