usb: dwc3: gadget: interrupt on ring full too
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Fri, 12 Aug 2016 10:13:10 +0000 (13:13 +0300)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 22 Aug 2016 07:45:37 +0000 (10:45 +0300)
If the ring is full and we are processing a big
sglist, then let's interrupt so we can, later, add
more TRBs to the ring.

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

index c776fb7f524a41823b0dce0c45403e6789e2789d..90b3d796513635697551442b2486cd94010947d1 100644 (file)
@@ -758,6 +758,8 @@ static void dwc3_gadget_ep_free_request(struct usb_ep *ep,
        kfree(req);
 }
 
+static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep);
+
 /**
  * dwc3_prepare_one_trb - setup one TRB from one request
  * @dep: endpoint for which this request is prepared
@@ -818,7 +820,8 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
        /* always enable Continue on Short Packet */
        trb->ctrl |= DWC3_TRB_CTRL_CSP;
 
-       if (!req->request.no_interrupt && !chain)
+       if ((!req->request.no_interrupt && !chain) ||
+                       (dwc3_calc_trbs_left(dep) == 0))
                trb->ctrl |= DWC3_TRB_CTRL_IOC | DWC3_TRB_CTRL_ISP_IMI;
 
        if (chain)