]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
usb: dwc3: gadget: always use frame number from XferNotReady
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Tue, 27 Mar 2018 08:14:31 +0000 (11:14 +0300)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 21 May 2018 07:00:51 +0000 (10:00 +0300)
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.balbi@linux.intel.com>
drivers/usb/dwc3/gadget.c

index 127cb3e235ce5a74c3af401bad7e19a3d4965b09..f078054f71788aa955fdda2a6d080c9794b42134 100644 (file)
@@ -1275,7 +1275,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",
@@ -1288,7 +1288,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);
 }
 
@@ -1331,10 +1331,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;
@@ -2469,8 +2466,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,