On 9/8/20 6:59 PM, Frank Wunderlich wrote: [...] > +static u32 xhci_td_remainder(struct xhci_ctrl *ctrl, int transferred, > + int trb_buff_len, unsigned int td_total_len, > + int maxp, bool more_trbs_coming) > { > - int packets_transferred; > + u32 total_packet_count; > + > + if (ctrl->hci_version < 0x100) > + return ((td_total_len - transferred) >> 10);
Here and ... > /* One TRB with a zero-length data packet. */ > - if (num_trbs_left == 0 || (running_total == 0 && trb_buff_len == 0)) > + if (!more_trbs_coming || (transferred == 0 && trb_buff_len == 0) || > + trb_buff_len == td_total_len) > return 0; > > - /* > - * All the TRB queueing functions don't count the current TRB in > - * running_total. > - */ > - packets_transferred = (running_total + trb_buff_len) / maxpacketsize; > + total_packet_count = DIV_ROUND_UP(td_total_len, maxp); > > - if ((total_packet_count - packets_transferred) > 31) > - return 31 << 17; > - return (total_packet_count - packets_transferred) << 17; > + /* Queueing functions don't count the current TRB into transferred */ > + return (total_packet_count - ((transferred + trb_buff_len) / maxp)); ... here. The outer parenthesis are not needed, can you check them in other functions too and send a subsequent cleanup patch ? I applied the patcheset to u-boot-usb/next , thanks.