My usual set of tests passes: - no spam on disconnection from NEC - no stream lockup on random errors on NEC - no spam on disconnection from VIA - finish_td called with right frame->status on VIA (checked by means of extra printks) > + /* Error mid TD, don't give TD back yet */ > + td->error_mid_td = true; > + td->urb_length_set = true; > + > + frame->actual_length = sum_trb_lengths(xhci, ep->ring, ep_trb) + > + ep_trb_len - remaining; Not a problem with this patch, but I noticed that every single use of this function ends up adding ep_trb_len, maybe it could be inclusive. > + td->urb->actual_length += frame->actual_length; In your first email you mentioned hosts responding to every single TRB, perhaps with the same error code repeated each time? I imagine it could be problematic here if such hosts really exist and if there are enough TRBs to execute this line twice. A check for the error_mid_td bit previously set could help, if this is a real risk. Thanks, Michal