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

Commit b14bf2d0 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman
Browse files

usb-storage/SCSI: Add broken_fua blacklist flag



Some buggy JMicron USB-ATA bridges don't know how to translate the FUA
bit in READs or WRITEs.  This patch adds an entry in unusual_devs.h
and a blacklist flag to tell the sd driver not to use FUA.

Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Reported-by: default avatarMichael Büsch <m@bues.ch>
Tested-by: default avatarMichael Büsch <m@bues.ch>
Acked-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
CC: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
CC: <stable@vger.kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ba1ba3a4
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -2441,7 +2441,10 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
		}

		sdkp->DPOFUA = (data.device_specific & 0x10) != 0;
		if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) {
		if (sdp->broken_fua) {
			sd_first_printk(KERN_NOTICE, sdkp, "Disabling FUA\n");
			sdkp->DPOFUA = 0;
		} else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) {
			sd_first_printk(KERN_NOTICE, sdkp,
				  "Uses READ/WRITE(6), disabling FUA\n");
			sdkp->DPOFUA = 0;
+4 −0
Original line number Diff line number Diff line
@@ -256,6 +256,10 @@ static int slave_configure(struct scsi_device *sdev)
		if (us->fflags & US_FL_WRITE_CACHE)
			sdev->wce_default_on = 1;

		/* A few buggy USB-ATA bridges don't understand FUA */
		if (us->fflags & US_FL_BROKEN_FUA)
			sdev->broken_fua = 1;

	} else {

		/* Non-disk-type devices don't need to blacklist any pages
+7 −0
Original line number Diff line number Diff line
@@ -1936,6 +1936,13 @@ UNUSUAL_DEV( 0x14cd, 0x6600, 0x0201, 0x0201,
		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
		US_FL_IGNORE_RESIDUE ),

/* Reported by Michael Büsch <m@bues.ch> */
UNUSUAL_DEV(  0x152d, 0x0567, 0x0114, 0x0114,
		"JMicron",
		"USB to ATA/ATAPI Bridge",
		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
		US_FL_BROKEN_FUA ),

/* Reported by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
 * JMicron responds to USN and several other SCSI ioctls with a
 * residue that causes subsequent I/O requests to fail.  */
+3 −1
Original line number Diff line number Diff line
@@ -70,7 +70,9 @@
	US_FLAG(NEEDS_CAP16,	0x00400000)			\
		/* cannot handle READ_CAPACITY_10 */		\
	US_FLAG(IGNORE_UAS,	0x00800000)			\
		/* Device advertises UAS but it is broken */
		/* Device advertises UAS but it is broken */	\
	US_FLAG(BROKEN_FUA,	0x01000000)			\
		/* Cannot handle FUA in WRITE or READ CDBs */	\

#define US_FLAG(name, value)	US_FL_##name = value ,
enum { US_DO_ALL_FLAGS };
+1 −0
Original line number Diff line number Diff line
@@ -173,6 +173,7 @@ struct scsi_device {
	unsigned is_visible:1;	/* is the device visible in sysfs */
	unsigned wce_default_on:1;	/* Cache is ON by default */
	unsigned no_dif:1;	/* T10 PI (DIF) should be disabled */
	unsigned broken_fua:1;		/* Don't set FUA bit */

	atomic_t disk_events_disable_depth; /* disable depth for disk events */