The core requires the extra two bits of information for properly
scheduling Isochronous transfers. This means that we can't rely on
__dwc3_gadget_get_frame(). Let's always cache uFrame number from
XferNotReady instead.

Signed-off-by: Felipe Balbi <felipe.ba...@linux.intel.com>
---
 drivers/usb/dwc3/gadget.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 97ae480e4999..00a429db158b 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1250,7 +1250,7 @@ static int __dwc3_gadget_get_frame(struct dwc3 *dwc)
        return DWC3_DSTS_SOFFN(reg);
 }
 
-static void __dwc3_gadget_start_isoc(struct dwc3_ep *dep, u32 cur_uf)
+static void __dwc3_gadget_start_isoc(struct dwc3_ep *dep)
 {
        if (list_empty(&dep->pending_list)) {
                dev_info(dep->dwc->dev, "%s: ran out of requests\n",
@@ -1263,7 +1263,7 @@ static void __dwc3_gadget_start_isoc(struct dwc3_ep *dep, 
u32 cur_uf)
         * Schedule the first trb for one interval in the future or at
         * least 4 microframes.
         */
-       dep->frame_number = cur_uf + max_t(u32, 4, dep->interval);
+       dep->frame_number += max_t(u32, 4, dep->interval);
        __dwc3_gadget_kick_transfer(dep);
 }
 
@@ -1306,10 +1306,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, 
struct dwc3_request *req)
                                dwc3_stop_active_transfer(dep, true);
                                dep->flags = DWC3_EP_ENABLED;
                        } else {
-                               u32 cur_uf;
-
-                               cur_uf = __dwc3_gadget_get_frame(dwc);
-                               __dwc3_gadget_start_isoc(dep, cur_uf);
+                               __dwc3_gadget_start_isoc(dep);
                                dep->flags &= ~DWC3_EP_PENDING_REQUEST;
                        }
                        return 0;
@@ -2433,8 +2430,9 @@ static void 
dwc3_gadget_endpoint_transfer_not_ready(struct dwc3_ep *dep,
 
        mask = ~(dep->interval - 1);
        cur_uf = event->parameters & mask;
+       dep->frame_number = cur_uf;
 
-       __dwc3_gadget_start_isoc(dep, cur_uf);
+       __dwc3_gadget_start_isoc(dep);
 }
 
 static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
-- 
2.16.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