* @number: endpoint number (1 - 15)
  * @type: set to bmAttributes & USB_ENDPOINT_XFERTYPE_MASK
  * @resource_index: Resource transfer index
- * @current_uf: Current uf received through last event parameter
  * @interval: the intervall on which the ISOC transfer is started
  * @name: a human readable name e.g. ep1out-bulk
  * @direction: true for TX, false for RX
        u8                      number;
        u8                      type;
        u8                      resource_index;
-       u16                     current_uf;
        u32                     interval;
 
        char                    name[20];
 
                                        dep->name);
        }
 
-       /*
-        * 3. Missed ISOC Handling. We need to start isoc transfer on the saved
-        * uframe number.
-        */
-       if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
-               (dep->flags & DWC3_EP_MISSED_ISOC)) {
-                       __dwc3_gadget_start_isoc(dwc, dep, dep->current_uf);
-                       dep->flags &= ~DWC3_EP_MISSED_ISOC;
-       }
-
        return 0;
 }
 
                                if (trb_status == DWC3_TRBSTS_MISSED_ISOC) {
                                        dev_dbg(dwc->dev, "incomplete IN transfer %s\n",
                                                        dep->name);
-                                       dep->current_uf = event->parameters &
-                                               ~(dep->interval - 1);
+                                       /*
+                                        * If missed isoc occurred and there is
+                                        * no request queued then issue END
+                                        * TRANSFER, so that core generates
+                                        * next xfernotready and we will issue
+                                        * a fresh START TRANSFER.
+                                        * If there are still queued request
+                                        * then wait, do not issue either END
+                                        * or UPDATE TRANSFER, just attach next
+                                        * request in request_list during
+                                        * giveback.If any future queued request
+                                        * is successfully transferred then we
+                                        * will issue UPDATE TRANSFER for all
+                                        * request in the request_list.
+                                        */
                                        dep->flags |= DWC3_EP_MISSED_ISOC;
                                } else {
                                        dev_err(dwc->dev, "incomplete IN transfer %s\n",
                                                        dep->name);
                                        status = -ECONNRESET;
                                }
+                       } else {
+                               dep->flags &= ~DWC3_EP_MISSED_ISOC;
                        }
                } else {
                        if (count && (event->status & DEPEVT_STATUS_SHORT))
                        break;
        } while (1);
 
+       if (list_empty(&dep->req_queued) &&
+                       (dep->flags & DWC3_EP_MISSED_ISOC)) {
+               dwc3_stop_active_transfer(dwc, dep->number);
+               dep->flags &= ~DWC3_EP_MISSED_ISOC;
+               return 1;
+       }
+
        if ((event->status & DEPEVT_STATUS_IOC) &&
                        (trb->ctrl & DWC3_TRB_CTRL_IOC))
                return 0;