Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32c37fc3 authored by Oliver Neukum's avatar Oliver Neukum Committed by Greg Kroah-Hartman
Browse files

usb-storage: add quirk for mandatory READ_CAPACITY_16



Some USB drive enclosures do not correctly report an
overflow condition if they hold a drive with a capacity
over 2TB and are confronted with a READ_CAPACITY_10.
They answer with their capacity modulo 2TB.
The generic layer cannot cope with that. It must be told
to use READ_CAPACITY_16 from the beginning.

Signed-off-by: default avatarOliver Neukum <oneukum@suse.de>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent fd8573f5
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -211,7 +211,10 @@ static int slave_configure(struct scsi_device *sdev)
		/*
		 * Many devices do not respond properly to READ_CAPACITY_16.
		 * Tell the SCSI layer to try READ_CAPACITY_10 first.
		 * However some USB 3.0 drive enclosures return capacity
		 * modulo 2TB. Those must use READ_CAPACITY_16
		 */
		if (!(us->fflags & US_FL_NEEDS_CAP16))
			sdev->try_rc_10_first = 1;

		/* assume SPC3 or latter devices support sense size > 18 */
+7 −0
Original line number Diff line number Diff line
@@ -1925,6 +1925,13 @@ UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201,
		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
		US_FL_IGNORE_RESIDUE ),

/* Reported by Oliver Neukum <oneukum@suse.com> */
UNUSUAL_DEV(  0x174c, 0x55aa, 0x0100, 0x0100,
		"ASMedia",
		"AS2105",
		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
		US_FL_NEEDS_CAP16),

/* Reported by Jesse Feddema <jdfeddema@gmail.com> */
UNUSUAL_DEV(  0x177f, 0x0400, 0x0000, 0x0000,
		"Yarvik",
+3 −1
Original line number Diff line number Diff line
@@ -66,7 +66,9 @@
	US_FLAG(INITIAL_READ10,	0x00100000)			\
		/* Initial READ(10) (and others) must be retried */	\
	US_FLAG(WRITE_CACHE,	0x00200000)			\
		/* Write Cache status is not available */
		/* Write Cache status is not available */	\
	US_FLAG(NEEDS_CAP16,	0x00400000)
		/* cannot handle READ_CAPACITY_10 */

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