Usual tests passed (but only transaction errors are covered). I noticed that with your new fix to the frame length bug, error_mid_td always equals urb_length_set. So the new flag is perhaps not necessary after all. The test in handle_tx_event() could be: if (usb_pipeisoc(td->urb->pipe) && td->urb_length_set && !list_is_last(... )) I tried it and it works just as well. While disconnecting my test camera from the VIA, I got this: [95511.647441] xhci_hcd 0000:03:00.0: finishing TD with status -75 (comp_code 3 error_mid_td 0) [95511.647453] xhci_hcd 0000:03:00.0: ERROR Transfer event TRB DMA ptr not part of current TD ep_index 2 comp_code 1 [95511.647457] xhci_hcd 0000:03:00.0: Looking for event-dma 0000000135121710 trb-start 0000000135121720 trb-end 0000000135121720 seg-start 0000000135121000 seg-end 0000000135121ff0 ... followed by some ordinary transaction errors 2 milliseconds later. Apparently a babble error, and it seems to have generated a "success" which the event handler tried to match with the next TD. So a mid TD babble may need the same treatment, which is not surprising. Unfortunately I didn't print enough debug info to confirm this with certainty and it is absolutely unreproducible, I have no idea why it happened.