goto out;
                        }
                }
-               if (is_isoc(hw_ep, 0)) {
-                       schedule_work(&cppi41_channel->dma_completion);
-                       goto out;
-               }
                list_add_tail(&cppi41_channel->tx_check,
                                &controller->early_tx_list);
 -              if (!hrtimer_active(&controller->early_tx)) {
 +              if (!hrtimer_is_queued(&controller->early_tx)) {
+                       unsigned long usecs = cppi41_channel->total_len / 10;
+ 
                        hrtimer_start_range_ns(&controller->early_tx,
-                               ktime_set(0, 140 * NSEC_PER_USEC),
+                               ktime_set(0, usecs * NSEC_PER_USEC),
                                40 * NSEC_PER_USEC,
                                HRTIMER_MODE_REL);
                }
 
        __u8  bInterval;
  } __attribute__((packed));
  
 +/* Legacy format, deprecated as of 3.14. */
 +struct usb_functionfs_descs_head {
 +      __le32 magic;
 +      __le32 length;
 +      __le32 fs_count;
 +      __le32 hs_count;
 +} __attribute__((packed, deprecated));
 +
+ /* MS OS Descriptor header */
+ struct usb_os_desc_header {
+       __u8    interface;
+       __le32  dwLength;
+       __le16  bcdVersion;
+       __le16  wIndex;
+       union {
+               struct {
+                       __u8    bCount;
+                       __u8    Reserved;
+               };
+               __le16  wCount;
+       };
+ } __attribute__((packed));
+ 
+ struct usb_ext_compat_desc {
+       __u8    bFirstInterfaceNumber;
+       __u8    Reserved1;
+       __u8    CompatibleID[8];
+       __u8    SubCompatibleID[8];
+       __u8    Reserved2[6];
+ };
+ 
+ struct usb_ext_prop_desc {
+       __le32  dwSize;
+       __le32  dwPropertyDataType;
+       __le16  wPropertyNameLength;
+ } __attribute__((packed));
+ 
+ #ifndef __KERNEL__
+ 
  /*
   * Descriptors format:
   *