trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST;
                else
                        trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS;
+
+               /* always enable Interrupt on Missed ISOC */
+               trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI;
                break;
 
        case USB_ENDPOINT_XFER_BULK:
                BUG();
        }
 
-       if (!req->request.no_interrupt && !chain)
-               trb->ctrl |= DWC3_TRB_CTRL_IOC;
+       /* always enable Continue on Short Packet */
+       trb->ctrl |= DWC3_TRB_CTRL_CSP;
 
-       if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
-               trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI;
-               trb->ctrl |= DWC3_TRB_CTRL_CSP;
-       } else if (last) {
+       if (!req->request.no_interrupt)
+               trb->ctrl |= DWC3_TRB_CTRL_IOC | DWC3_TRB_CTRL_ISP_IMI;
+
+       if (last)
                trb->ctrl |= DWC3_TRB_CTRL_LST;
-       }
 
        if (chain)
                trb->ctrl |= DWC3_TRB_CTRL_CHN;