[PATCH 4.8 35/35] usb: dwc3: gadget: properly account queued requests

From: Greg Kroah-Hartman
Date: Sun Nov 13 2016 - 06:31:03 EST


4.8-stable review patch. If anyone has any objections, please let me know.

------------------

From: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx>

commit a9c3ca5fae6bf73770f0576eaf57d5f1305ef4b3 upstream.

Some requests could be accounted for multiple
times. Let's fix that so each and every requests is
accounted for only once.

Fixes: 55a0237f8f47 ("usb: dwc3: gadget: use allocated/queued reqs for LST bit")
Signed-off-by: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>

---
drivers/usb/dwc3/gadget.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)

--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -789,6 +789,7 @@ static void dwc3_prepare_one_trb(struct
req->trb = trb;
req->trb_dma = dwc3_trb_dma_offset(dep, trb);
req->first_trb_index = dep->trb_enqueue;
+ dep->queued_requests++;
}

dwc3_ep_inc_enq(dep);
@@ -841,8 +842,6 @@ static void dwc3_prepare_one_trb(struct

trb->ctrl |= DWC3_TRB_CTRL_HWO;

- dep->queued_requests++;
-
trace_dwc3_prepare_trb(dep, trb);
}

@@ -1963,7 +1962,9 @@ static int __dwc3_cleanup_done_trbs(stru
unsigned int s_pkt = 0;
unsigned int trb_status;

- dep->queued_requests--;
+ if (req->trb == trb)
+ dep->queued_requests--;
+
trace_dwc3_complete_trb(dep, trb);

/*