trace_dwc3_prepare_trb(dep, trb);
 }
 
+static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
+{
+       struct dwc3_trb         *tmp;
+
+       /*
+        * If enqueue & dequeue are equal than it is either full or empty.
+        *
+        * One way to know for sure is if the TRB right before us has HWO bit
+        * set or not. If it has, then we're definitely full and can't fit any
+        * more transfers in our ring.
+        */
+       if (dep->trb_enqueue == dep->trb_dequeue) {
+               /* If we're full, enqueue/dequeue are > 0 */
+               if (dep->trb_enqueue) {
+                       tmp = &dep->trb_pool[dep->trb_enqueue - 1];
+                       if (tmp->ctrl & DWC3_TRB_CTRL_HWO)
+                               return 0;
+               }
+
+               return DWC3_TRB_NUM - 1;
+       }
+
+       return dep->trb_dequeue - dep->trb_enqueue;
+}
+
 /*
  * dwc3_prepare_trbs - setup TRBs from requests
  * @dep: endpoint for which requests are being prepared
- * @starting: true if the endpoint is idle and no requests are queued.
  *
  * The function goes through the requests list and sets up TRBs for the
  * transfers. The function returns once there are no more TRBs available or
  * it runs out of requests.
  */
-static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting)
+static void dwc3_prepare_trbs(struct dwc3_ep *dep)
 {
        struct dwc3_request     *req, *n;
        u32                     trbs_left;
 
        BUILD_BUG_ON_NOT_POWER_OF_2(DWC3_TRB_NUM);
 
-       trbs_left = dep->trb_dequeue - dep->trb_enqueue;
-
-       /*
-        * If enqueue & dequeue are equal than it is either full or empty. If we
-        * are starting to process requests then we are empty. Otherwise we are
-        * full and don't do anything
-        */
-       if (!trbs_left) {
-               if (!starting)
-                       return;
-
-               trbs_left = DWC3_TRB_NUM;
-       }
-
-       /* The last TRB is a link TRB, not used for xfer */
-       if (trbs_left <= 1)
-               return;
+       trbs_left = dwc3_calc_trbs_left(dep);
 
        list_for_each_entry_safe(req, n, &dep->pending_list, list) {
                unsigned        length;
         */
        if (start_new) {
                if (list_empty(&dep->started_list))
-                       dwc3_prepare_trbs(dep, start_new);
+                       dwc3_prepare_trbs(dep);
 
                /* req points to the first request which will be sent */
                req = next_request(&dep->started_list);
        } else {
-               dwc3_prepare_trbs(dep, start_new);
+               dwc3_prepare_trbs(dep);
 
                /*
                 * req points to the first request where HWO changed from 0 to 1