*/
 static u32 xhci_td_remainder(struct xhci_hcd *xhci, int transferred,
                              int trb_buff_len, unsigned int td_total_len,
-                             struct urb *urb, unsigned int num_trbs_left)
+                             struct urb *urb, bool more_trbs_coming)
 {
        u32 maxp, total_packet_count;
 
                return ((td_total_len - transferred) >> 10);
 
        /* One TRB with a zero-length data packet. */
-       if (num_trbs_left == 0 || (transferred == 0 && trb_buff_len == 0) ||
+       if (!more_trbs_coming || (transferred == 0 && trb_buff_len == 0) ||
            trb_buff_len == td_total_len)
                return 0;
 
                        field |= TRB_CHAIN;
                } else {
                        field |= TRB_IOC;
-                       more_trbs_coming = need_zero_pkt;
+                       more_trbs_coming = false;
                        td->last_trb = ring->enqueue;
                }
 
                /* Set the TRB length, TD size, and interrupter fields. */
                remainder = xhci_td_remainder(xhci, running_total,
                                                        trb_buff_len, full_len,
-                                                       urb, num_trbs - i - 1);
-
+                                                       urb, more_trbs_coming);
                length_field = TRB_LEN(trb_buff_len) |
                        TRB_TD_SIZE(remainder) |
                        TRB_INTR_TARGET(0);
 
-               queue_trb(xhci, ring, more_trbs_coming,
+               queue_trb(xhci, ring, more_trbs_coming | need_zero_pkt,
                                lower_32_bits(addr),
                                upper_32_bits(addr),
                                length_field,
                        /* Set the TRB length, TD size, & interrupter fields. */
                        remainder = xhci_td_remainder(xhci, running_total,
                                                   trb_buff_len, td_len,
-                                                  urb, trbs_per_td - j - 1);
+                                                  urb, more_trbs_coming);
 
                        length_field = TRB_LEN(trb_buff_len) |
                                TRB_INTR_TARGET(0);