On Tue, 30 Dec 2014, James Bottomley wrote: > > _Is_ there any way to communicate the maximum transfer size? I'm not > > aware of any SCSI command for it. It isn't part of the USB > > mass-storage spec. > > For the device, it's in the Block limits VPD page. However, what the > device supports isn't necessarily what the bridge or host bus adapter > will support. We need to set the limit to the lowest of what the > device, the bridge and the HBA support. We know the device (provided > the bridge allows VPD inquiries ... not all do) and host, so we really > need to know what the bridge will support. From the error it does look > like we're running into a bridge limit. I see. > > usb-storage has no clear idea what sort of device lies on the other > > side of the USB bridge. It might be an ATA drive, it might be a flash > > drive, it might not be a disk at all -- usb-storage does its best not > > to know or care. > > That's fine, but is there any way in USB to query the bridge to get it's > transfer characteristics? No, there isn't. The only query that a USB mass-storage bridge accepts is for the maximum LUN value. > > If you think that usb-storage needs to set a maximum transfer size for > > disk drives, it won't be hard to write a patch. But what about all the > > other possible transports? Will they each have to implement the same > > transfer limit? If so, shouldn't the limit be set up from a more > > central location, such as the sd driver? > > This isn't a transport problem, this is a bridge problem. T10 has > always recognised there might be a bridge issue linking two transports, > so it did initially come up with a bridge spec (BCC) but it was > abandoned a decade ago in favour of transparent bridges (every switch in > a FC topology is effectively a transparent bridge) or making them > explicit in the standards, like SAS expanders. > > > Why not have sd always set max_sectors_kb to 32767 if it isn't already > > smaller? Would that cause any problems? > > This wouldn't be sd ... we have lots of requirements for large transfer > sizes for efficiency. It has to be the layer that knows there's a > bridge, so that would make it usb. All right. How does this patch look? Alan Stern Index: usb-3.18/drivers/usb/storage/scsiglue.c =================================================================== --- usb-3.18.orig/drivers/usb/storage/scsiglue.c +++ usb-3.18/drivers/usb/storage/scsiglue.c @@ -114,26 +114,30 @@ static int slave_alloc (struct scsi_devi static int slave_configure(struct scsi_device *sdev) { struct us_data *us = host_to_us(sdev->host); + unsigned int max_sectors; - /* Many devices have trouble transferring more than 32KB at a time, - * while others have trouble with more than 64K. At this time we - * are limiting both to 32K (64 sectores). + /* + * Many devices have trouble transferring more than 32 KB at a time, + * while others have trouble with more than 64 KB. At this time we + * are limiting both to 32 KB (64 sectores). + * Still other devices have trouble unless the transfer size is as + * small as possible (one memory page). + * + * Tape drives need much higher max_sector limits, so just + * raise it to the maximum possible (4 GB / 512) and let the + * queue segment size sort out the real limit. + * For safety, limit all other devices to 32 MB transfer size. */ - if (us->fflags & (US_FL_MAX_SECTORS_64 | US_FL_MAX_SECTORS_MIN)) { - unsigned int max_sectors = 64; - - if (us->fflags & US_FL_MAX_SECTORS_MIN) - max_sectors = PAGE_CACHE_SIZE >> 9; - if (queue_max_hw_sectors(sdev->request_queue) > max_sectors) - blk_queue_max_hw_sectors(sdev->request_queue, - max_sectors); - } else if (sdev->type == TYPE_TAPE) { - /* Tapes need much higher max_sector limits, so just - * raise it to the maximum possible (4 GB / 512) and - * let the queue segment size sort out the real limit. - */ - blk_queue_max_hw_sectors(sdev->request_queue, 0x7FFFFF); - } + if (us->fflags & US_FL_MAX_SECTORS_MIN) + max_sectors = PAGE_CACHE_SIZE >> 9; + else if (us->fflags & US_FL_MAX_SECTORS_64) + max_sectors = 64; + else if (sdev->type == TYPE_TAPE) + max_sectors = 0x7FFFFF; + else + max_sectors = 65535; + if (queue_max_hw_sectors(sdev->request_queue) > max_sectors) + blk_queue_max_hw_sectors(sdev->request_queue, max_sectors); /* Some USB host controllers can't do DMA; they have to use PIO. * They indicate this by setting their dma_mask to NULL. For -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html