On Thu, 7 Apr 2016, Felipe Balbi wrote:
> USB3 devices, because they are much newer, have much
> less chance of having issues with larger transfers.
>
> We still keep a limit because anything above 2048
> sectors really rendered negligible speed
> improvements, so we will simply ignore
> that. Transferring 1MiB should already give us
> pretty good performance.
>
> Signed-off-by: Felipe Balbi <[email protected]>
> ---
> drivers/usb/storage/scsiglue.c | 16 +++++++++++-----
> drivers/usb/storage/usb.c | 4 ++++
> include/linux/usb_usual.h | 2 ++
> 3 files changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
> index 2a8c203a67dc..395d1ac43c59 100644
> --- a/drivers/usb/storage/scsiglue.c
> +++ b/drivers/usb/storage/scsiglue.c
> @@ -115,13 +115,19 @@ static int slave_configure(struct scsi_device *sdev)
> {
> struct us_data *us = host_to_us(sdev->host);
>
> - /* 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).
> - */
> - if (us->fflags & (US_FL_MAX_SECTORS_64 | US_FL_MAX_SECTORS_MIN)) {
> + if (us->fflags & US_FL_USB3) {
> + /* USB3 devices will be limited to 2048 sectors. This gives us
> + * better throughput on most devices.
> + */
> + blk_queue_max_hw_sectors(sdev->request_queue, 2048);
> + } else if (us->fflags & (US_FL_MAX_SECTORS_64 | US_FL_MAX_SECTORS_MIN))
> {
> unsigned int max_sectors = 64;
>
> + /* 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).
> + */
> +
> if (us->fflags & US_FL_MAX_SECTORS_MIN)
> max_sectors = PAGE_CACHE_SIZE >> 9;
> if (queue_max_hw_sectors(sdev->request_queue) > max_sectors)
> diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
> index 43576ed31ccd..b7735c9850f8 100644
> --- a/drivers/usb/storage/usb.c
> +++ b/drivers/usb/storage/usb.c
> @@ -594,6 +594,10 @@ static int get_device_info(struct us_data *us, const
> struct usb_device_id *id,
> return -ENODEV;
> }
>
> + /* Flag USB3 devices so we can increase max_sectors to 2048 sectors. */
> + if (dev->speed == USB_SPEED_SUPER)
> + us->fflags |= US_FL_USB3;
> +
> /*
> * This flag is only needed when we're in high-speed, so let's
> * disable it if we're in full-speed
> diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h
> index 7f5f78bd15ad..b76b0faaedc8 100644
> --- a/include/linux/usb_usual.h
> +++ b/include/linux/usb_usual.h
> @@ -79,6 +79,8 @@
> /* Cannot handle MI_REPORT_SUPPORTED_OPERATION_CODES */ \
> US_FLAG(MAX_SECTORS_240, 0x08000000) \
> /* Sets max_sectors to 240 */ \
> + US_FLAG(USB3, 0x10000000) \
> + /* This is a USB3 Storage Device */ \
>
> #define US_FLAG(name, value) US_FL_##name = value ,
> enum { US_DO_ALL_FLAGS };
Aside from the multi-line comment formatting, you should avoid adding a
new bitflag. It's not necessary in this case because it's easy to test
the connection speed directly:
if (us->pusbdev->speed >= USB_SPEED_SUPER) {
Alan Stern
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html