]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
usb: dwc3: gadget: always start isochronous aligned to dep->interval
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Wed, 11 Apr 2018 07:34:34 +0000 (10:34 +0300)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 21 May 2018 07:01:00 +0000 (10:01 +0300)
We will *always* start transfer to the next uFrame number aligned to
dep->interval.

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

index e9e0e280543164f0bae66e3e83db2481c0b24b2f..abdc3ac24cc66ee572b118d3a08998abfad8ac7e 100644 (file)
@@ -27,6 +27,9 @@
 #include "gadget.h"
 #include "io.h"
 
+#define DWC3_ALIGN_FRAME(d)    (((d)->frame_number + (d)->interval) \
+                                       & ~((d)->interval - 1))
+
 /**
  * dwc3_gadget_set_test_mode - enables usb2 test modes
  * @dwc: pointer to our context structure
@@ -1267,11 +1270,7 @@ static void __dwc3_gadget_start_isoc(struct dwc3_ep *dep)
                return;
        }
 
-       /*
-        * Schedule the first trb for one interval in the future or at
-        * least 4 microframes.
-        */
-       dep->frame_number += max_t(u32, 4, dep->interval);
+       dep->frame_number = DWC3_ALIGN_FRAME(dep);
        __dwc3_gadget_kick_transfer(dep);
 }
 
@@ -2377,11 +2376,7 @@ static void dwc3_gadget_ep_cleanup_completed_requests(struct dwc3_ep *dep,
 static void dwc3_gadget_endpoint_frame_from_event(struct dwc3_ep *dep,
                const struct dwc3_event_depevt *event)
 {
-       u32 cur_uf, mask;
-
-       mask = ~(dep->interval - 1);
-       cur_uf = event->parameters & mask;
-       dep->frame_number = cur_uf;
+       dep->frame_number = event->parameters;
 }
 
 static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,