This will give us a simpler way of figuring out how
many bytes were left in each TRB. It's useful for
cases where we queue only part of an SG-list due to
amount of available TRBs at the time of kicking the
transfer.

Signed-off-by: Felipe Balbi <felipe.ba...@linux.intel.com>
---
 drivers/usb/dwc3/core.h   |  2 ++
 drivers/usb/dwc3/gadget.c | 19 ++++++-------------
 2 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 180239fb021a..b585a3020f28 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -715,6 +715,7 @@ struct dwc3_hwparams {
  * @dep: struct dwc3_ep owning this request
  * @sg: pointer to first incomplete sg
  * @num_pending_sgs: counter to pending sgs
+ * @remaining: amount of data remaining
  * @epnum: endpoint number to which this request refers
  * @trb: pointer to struct dwc3_trb
  * @trb_dma: DMA address of @trb
@@ -729,6 +730,7 @@ struct dwc3_request {
        struct scatterlist      *sg;
 
        unsigned                num_pending_sgs;
+       unsigned                remaining;
        u8                      epnum;
        struct dwc3_trb         *trb;
        dma_addr_t              trb_dma;
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 310535e9b731..84b449b17160 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -178,6 +178,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct 
dwc3_request *req,
        req->started = false;
        list_del(&req->list);
        req->trb = NULL;
+       req->remaining = 0;
 
        if (req->request.status == -EINPROGRESS)
                req->request.status = status;
@@ -2016,7 +2017,7 @@ static int __dwc3_cleanup_done_trbs(struct dwc3 *dwc, 
struct dwc3_ep *dep,
                return 1;
 
        count = trb->size & DWC3_TRB_SIZE_MASK;
-       req->request.actual += count;
+       req->remaining += count;
 
        if (dep->direction) {
                if (count) {
@@ -2070,11 +2071,10 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, 
struct dwc3_ep *dep,
        struct dwc3_request     *req, *n;
        struct dwc3_trb         *trb;
        bool                    ioc = false;
-       int                     ret;
+       int                     ret = 0;
 
        list_for_each_entry_safe(req, n, &dep->started_list, list) {
                unsigned length;
-               unsigned actual;
                int chain;
 
                length = req->request.length;
@@ -2102,17 +2102,10 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, 
struct dwc3_ep *dep,
                                        event, status, chain);
                }
 
-               /*
-                * We assume here we will always receive the entire data block
-                * which we should receive. Meaning, if we program RX to
-                * receive 4K but we receive only 2K, we assume that's all we
-                * should receive and we simply bounce the request back to the
-                * gadget driver for further processing.
-                */
-               actual = length - req->request.actual;
-               req->request.actual = actual;
+               req->request.actual = length - req->remaining;
 
-               if (ret && chain && (actual < length) && req->num_pending_sgs)
+               if (ret && chain && (req->request.actual < length)
+                               && req->num_pending_sgs)
                        return __dwc3_gadget_kick_transfer(dep, 0);
 
                dwc3_gadget_giveback(dep, req, status);
-- 
2.10.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to