On Tue, 25 Sep 2012, Sarah Sharp wrote: > Alan, I'm wondering if the xHCI ring expansion is causing issues with > USB hard drives under xHCI. Testing with a Buffalo USB 3.0 hard drive > with an NEC uPD720200 xHCI host, I see that the usb-storage and SCSI > initialization produces I/O errors on random sectors in 3.4.0, 3.4.6, > and 3.5.0. I can't get those errors to be reproduced in 3.3.1. > > The xHCI ring expansion was added in 3.4, and we changed the xHCI's > sg_tablesize: > > int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) > { > ... > /* Accept arbitrarily long scatter-gather lists */ > hcd->self.sg_tablesize = ~0; > > The usb-storage driver sets the tablesize thus: > > static unsigned int usb_stor_sg_tablesize(struct usb_interface *intf) > { > struct usb_device *usb_dev = interface_to_usbdev(intf); > > if (usb_dev->bus->sg_tablesize) { > return usb_dev->bus->sg_tablesize; > } > return SG_ALL; > } > > I notice that SG_ALL is set to SCSI_MAX_SG_SEGMENTS, which is only 128. > Should we be passing an arbitrarily large number to the SCSI core? Yes, there's no reason not to. The block layer will make sure that each individual request has a sufficiently small number of segments. > There's some wording in include/scsi/scsi.h about also limiting the > number of chained sgs to 2048. I'm wondering if we're hitting some bugs > in the SCSI layer because we're setting the sg_tablesize so high. I doubt it. Anyway, this stuff is handled by the block layer now, not the SCSI layer. If you look through drivers/scsi, you'll see that SG_ALL is used only in various SCSI interface drivers, not in the core. > Alternately, we could be hitting bugs in the USB 3.0 firmware when we > attempt to issue a read or write that's too big. The read on Adrian's > hard drive failed on a bigger read request (122880 bytes). It would be > interesting to see if it works fine if the xHCI sg_tablesize is limited. > I'm going to try that with my own drive on 3.5.4 and see if it helps. There were examples in the earlier usbmon traces where 122880-byte reads succeeded, for whatever that's worth... I doubt very much that you are anywhere close to hitting that limit. If a 120-KB transfer has more than 128 SG segments then on average each segment would be under 1024 bytes, a lot smaller than a page, which seems unlikely. I don't think I've ever seen a transfer needing more than about 8 segments. Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html