summaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc3
diff options
context:
space:
mode:
authorFelipe Balbi <felipe.balbi@linux.intel.com>2016-08-11 12:24:27 +0300
committerFelipe Balbi <felipe.balbi@linux.intel.com>2016-08-22 10:45:37 +0300
commit737f1ae2556a5d219c24fbea2e1c63b7d9e10869 (patch)
tree927a2cf8dcd029196938c8b92a46d5a1f326cef1 /drivers/usb/dwc3
parent4bc48c9747084dad4b258821a69026bcc552e8ff (diff)
downloadlinux-stable-737f1ae2556a5d219c24fbea2e1c63b7d9e10869.tar.gz
linux-stable-737f1ae2556a5d219c24fbea2e1c63b7d9e10869.tar.bz2
linux-stable-737f1ae2556a5d219c24fbea2e1c63b7d9e10869.zip
usb: dwc3: gadget: increment dequeue pointer on completion
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>
Diffstat (limited to 'drivers/usb/dwc3')
-rw-r--r--drivers/usb/dwc3/gadget.c17
1 files changed, 3 insertions, 14 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 15df5ed546da..18045997b593 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -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);