Skip to content

Commit

Permalink
USB: UAS: introduce a quirk to set no_write_same
Browse files Browse the repository at this point in the history
commit 8010622 upstream.

UAS does not share the pessimistic assumption storage is making that
devices cannot deal with WRITE_SAME.  A few devices supported by UAS,
are reported to not deal well with WRITE_SAME. Those need a quirk.

Add it to the device that needs it.

Reported-by: David C. Partridge <david.partridge@perdrix.co.uk>
Signed-off-by: Oliver Neukum <oneukum@suse.com>
Cc: stable <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20201209152639.9195-1-oneukum@suse.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
oneukum authored and gregkh committed Dec 21, 2020
1 parent d769a22 commit 2440c1c
Show file tree
Hide file tree
Showing 5 changed files with 14 additions and 2 deletions.
1 change: 1 addition & 0 deletions Documentation/admin-guide/kernel-parameters.txt
Expand Up @@ -5663,6 +5663,7 @@
device);
j = NO_REPORT_LUNS (don't use report luns
command, uas only);
k = NO_SAME (do not use WRITE_SAME, uas only)
l = NOT_LOCKABLE (don't try to lock and
unlock ejectable media, not on uas);
m = MAX_SECTORS_64 (don't transfer more
Expand Down
3 changes: 3 additions & 0 deletions drivers/usb/storage/uas.c
Expand Up @@ -867,6 +867,9 @@ static int uas_slave_configure(struct scsi_device *sdev)
if (devinfo->flags & US_FL_NO_READ_CAPACITY_16)
sdev->no_read_capacity_16 = 1;

/* Some disks cannot handle WRITE_SAME */
if (devinfo->flags & US_FL_NO_SAME)
sdev->no_write_same = 1;
/*
* Some disks return the total number of blocks in response
* to READ CAPACITY rather than the highest block number.
Expand Down
7 changes: 5 additions & 2 deletions drivers/usb/storage/unusual_uas.h
Expand Up @@ -35,12 +35,15 @@ UNUSUAL_DEV(0x054c, 0x087d, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_NO_REPORT_OPCODES),

/* Reported-by: Julian Groß <julian.g@posteo.de> */
/*
* Initially Reported-by: Julian Groß <julian.g@posteo.de>
* Further reports David C. Partridge <david.partridge@perdrix.co.uk>
*/
UNUSUAL_DEV(0x059f, 0x105f, 0x0000, 0x9999,
"LaCie",
"2Big Quadra USB3",
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_NO_REPORT_OPCODES),
US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME),

/*
* Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI
Expand Down
3 changes: 3 additions & 0 deletions drivers/usb/storage/usb.c
Expand Up @@ -541,6 +541,9 @@ void usb_stor_adjust_quirks(struct usb_device *udev, unsigned long *fflags)
case 'j':
f |= US_FL_NO_REPORT_LUNS;
break;
case 'k':
f |= US_FL_NO_SAME;
break;
case 'l':
f |= US_FL_NOT_LOCKABLE;
break;
Expand Down
2 changes: 2 additions & 0 deletions include/linux/usb_usual.h
Expand Up @@ -84,6 +84,8 @@
/* Cannot handle REPORT_LUNS */ \
US_FLAG(ALWAYS_SYNC, 0x20000000) \
/* lies about caching, so always sync */ \
US_FLAG(NO_SAME, 0x40000000) \
/* Cannot handle WRITE_SAME */ \

#define US_FLAG(name, value) US_FL_##name = value ,
enum { US_DO_ALL_FLAGS };
Expand Down

0 comments on commit 2440c1c

Please sign in to comment.