]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
USB: UAS: introduce a quirk to set no_write_same
authorOliver Neukum <oneukum@suse.com>
Wed, 9 Dec 2020 15:26:39 +0000 (16:26 +0100)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Wed, 20 Jan 2021 13:25:17 +0000 (14:25 +0100)
BugLink: https://bugs.launchpad.net/bugs/1910817
commit 8010622c86ca5bb44bc98492f5968726fc7c7a21 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>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@canonical.com>
Documentation/admin-guide/kernel-parameters.txt
drivers/usb/storage/uas.c
drivers/usb/storage/unusual_uas.h
drivers/usb/storage/usb.c
include/linux/usb_usual.h

index 6351dd00e36364132f405f3ccb37d9b1a9b56dc1..9d66e884ebf53fb9c2e8d8ae9b4fc35bd7120ed6 100644 (file)
                                        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
index 1ec1baa7604edc28d6c98d421646fef4f2c7cc1f..678903d1ce4dad11fc7311c235e677c74ea8aa59 100644 (file)
@@ -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.
index dcdfcdfd2ad134a7fa5b9bec590a34ae1d9b9435..749c69be091cc9569287e568f5cd0594a7a4ff61 100644 (file)
@@ -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
index 9a79cd9762f31d50821cb84942a24e0e19290b57..2349dfa3b1762ed886806a8b8e20583c1426512f 100644 (file)
@@ -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;
index 000a5954b2e89b1397cee2852d597baf74c82b26..a7f7ebdd3069ed1155803190ee2d1ea36cfb7805 100644 (file)
@@ -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 };