Hi, Thoughts about this? Thanks to asynchronous giveback we can give back TDs at any time we want without dropping xhci->lock and worrying what we might find when we take it back. So give back TDs as soon as they are no longer needed instead of keeping them around in TD_CLEARED state and using a second pass through the list to give them back. This turns out to be a surprisingly simple patch and I gave it a quick test and it's working fine. The second patch removes another almost meaningless cancel status and shortens the code a bit while adding functionality which may or may not turn out to be useful. And hopefully won't be harmful? That too was tested, by patching xhci_move_dequeue_past_td() to fail randomly and unlinking from multiple streams on UAS. Works exactly as described in the commit message. Overall, the driver lost 40 lines of code and 2KB in binary size. The latter is surprising, I think I haven't removed 2KB worth of code, but maybe it affects how gcc inlines or otherwise changes functions. YMMV. Regards, Michal