Hello All,

We recently have run into a problem using a USB 3.0 thumb drive over USBIP 
where the driver will unlink URBs when trying to mount a FAT partition.  This 
happens because of the remote XHCI controller returning errno 75 during IN URB 
processing.  I've traced the failure to the following steps:

1. usb-storage sends a SCSI READ_10 request OUT URB to vhci
2. vhci forwards to remote workstation over USBIP and submits the URB
3. usb-storage sends a 32K IN URB using a SG table
4. usb_sg_init notices that vhci bus doesn't support SG (usb/core/message.c:399)
5. usb_sg_init breaks the SG table into an URB for each SG entry 
(usb/core/message.c:418)
6. vhci forwards to remote and submits the URBs
7. XHCI processes the first URB, but the buffer is too small to contain the 
bulk of the data and sets errno -75 when it would overflow the URB buffer 
(xhci-ring.c:2371)

It appears to me when the SG read is broken into multiple URBs, the latency in 
processing the remote URBs is causing XHCI to fail the IN.  A similar error 
sometimes occurs on OUTs as well.  I apologize, but I don't remember the errno 
off the top of my head for the OUT.

I patched usb_sg_init to alloc/free a contiguous URB so as not to fragment 
INS/OUTS and this is working well so far.

1. Does that seem like the correct fix?
2. Is this fix something the community would be interested in?

I'm open to working on a more "correct" patch if prompted to do so (as long as 
we're not talking weeks of work...).

Thanks,

Seth

Reply via email to