usb: dwc3: gadget: use num_trbs when skipping TRBs on ->dequeue()
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Fri, 28 Jun 2019 18:24:08 +0000 (18:24 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Jul 2019 11:14:43 +0000 (13:14 +0200)
commit c3acd59014148470dc58519870fbc779785b4bf7 upstream

Now that we track how many TRBs a request uses, it's easier to skip
over them in case of a call to usb_ep_dequeue(). Let's do so and
simplify the code a bit.

Cc: Fei Yang <fei.yang@intel.com>
Cc: Sam Protsenko <semen.protsenko@linaro.org>
Cc: Felipe Balbi <balbi@kernel.org>
Cc: linux-usb@vger.kernel.org
Cc: stable@vger.kernel.org # 4.19.y
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
(cherry picked from commit c3acd59014148470dc58519870fbc779785b4bf7)
Signed-off-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/usb/dwc3/gadget.c

index fd91c49..4e08904 100644 (file)
@@ -1368,6 +1368,8 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
                                break;
                }
                if (r == req) {
+                       int i;
+
                        /* wait until it is processed */
                        dwc3_stop_active_transfer(dep, true);
 
@@ -1405,32 +1407,12 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
                        if (!r->trb)
                                goto out0;
 
-                       if (r->num_pending_sgs) {
+                       for (i = 0; i < r->num_trbs; i++) {
                                struct dwc3_trb *trb;
-                               int i = 0;
-
-                               for (i = 0; i < r->num_pending_sgs; i++) {
-                                       trb = r->trb + i;
-                                       trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
-                                       dwc3_ep_inc_deq(dep);
-                               }
-
-                               if (r->needs_extra_trb) {
-                                       trb = r->trb + r->num_pending_sgs + 1;
-                                       trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
-                                       dwc3_ep_inc_deq(dep);
-                               }
-                       } else {
-                               struct dwc3_trb *trb = r->trb;
 
+                               trb = r->trb + i;
                                trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
                                dwc3_ep_inc_deq(dep);
-
-                               if (r->needs_extra_trb) {
-                                       trb = r->trb + 1;
-                                       trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
-                                       dwc3_ep_inc_deq(dep);
-                               }
                        }
                        goto out1;
                }
@@ -1441,8 +1423,6 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
        }
 
 out1:
-       /* giveback the request */
-
        dwc3_gadget_giveback(dep, req, -ECONNRESET);
 
 out0: