Instead of using complicated sleeps to emulate characters per second on usb writes, submit only as many characters as can be transferred per usb poll of 1ms, and use timeouts in bulk transfers, cancelling transfers only as a failsafe.
Use the callback timeout as a safety mechanism only on windows.
Use an int for usb_read/write to identify overruns.
Look for timeout overruns in usb read/write.
Add more debugging info for when usb details don't match.
Ignore iManufacturer from bitfury devices to support bluefury as well as redfury.
Treat timeout errors on usb writes as IO errors.
Ignore preferred packet size.
Copy known transferred amount back to buffer for usb reads instead of requested length.
Why are we reading extra again in usb read when buffering is enabled? Don't do that.
Deprecate preferred packet size functions in usbutils since they're unhelpful.
Always read a full sized transfer for bulk reads.
Discriminate between libusb transfer errors and regular libusb errors and make sure to capture them all.
Make hash_pop signal the work scheduler each time it waits on the conditional that it should look for more work.
Never wait indefinitely for a pthread conditional in the hash_pop loop in case the work scheduler misses the last wakeup.