1 From 12c4654fc2a90b57274113dfa075ad2f7326428b Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Thu, 24 Sep 2020 01:21:24 -0700
4 Subject: usb: dwc3: gadget: Reclaim extra TRBs after request completion
6 From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
8 [ Upstream commit 690e5c2dc29f8891fcfd30da67e0d5837c2c9df5 ]
10 An SG request may be partially completed (due to no available TRBs).
11 Don't reclaim extra TRBs and clear the needs_extra_trb flag until the
12 request is fully completed. Otherwise, the driver will reclaim the wrong
15 Cc: stable@vger.kernel.org
16 Fixes: 1f512119a08c ("usb: dwc3: gadget: add remaining sg entries to ring")
17 Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
18 Signed-off-by: Felipe Balbi <balbi@kernel.org>
19 Signed-off-by: Sasha Levin <sashal@kernel.org>
21 drivers/usb/dwc3/gadget.c | 10 +++++-----
22 1 file changed, 5 insertions(+), 5 deletions(-)
24 diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
25 index f24cfb3a6907b..6ab5c48f5d873 100644
26 --- a/drivers/usb/dwc3/gadget.c
27 +++ b/drivers/usb/dwc3/gadget.c
28 @@ -2386,6 +2386,11 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep,
29 ret = dwc3_gadget_ep_reclaim_trb_linear(dep, req, event,
32 + req->request.actual = req->request.length - req->remaining;
34 + if (!dwc3_gadget_ep_request_completed(req))
37 if (req->needs_extra_trb) {
38 unsigned int maxp = usb_endpoint_maxp(dep->endpoint.desc);
40 @@ -2401,11 +2406,6 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep,
41 req->needs_extra_trb = false;
44 - req->request.actual = req->request.length - req->remaining;
46 - if (!dwc3_gadget_ep_request_completed(req))
49 dwc3_gadget_giveback(dep, req, status);