From c8f612826ef7c88c2d4c9b06eaaa5099628f35f4 Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Wed, 20 Jun 2012 16:04:19 -0400 Subject: [PATCH] --- yaml --- r: 311336 b: refs/heads/master c: 6a0bdffa0073857870a4ed1b4489762146359eb4 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/scsi/sd.c | 2 ++ trunk/drivers/usb/storage/scsiglue.c | 6 ++++++ trunk/include/scsi/scsi_device.h | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 9adb0d6e64b7..80bcb835fe5c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1e2c4e59d2b8797973471b4a287a43eac12a0f40 +refs/heads/master: 6a0bdffa0073857870a4ed1b4489762146359eb4 diff --git a/trunk/drivers/scsi/sd.c b/trunk/drivers/scsi/sd.c index 6f0a4c612b3b..6f72b80121a0 100644 --- a/trunk/drivers/scsi/sd.c +++ b/trunk/drivers/scsi/sd.c @@ -1899,6 +1899,8 @@ static int sd_try_rc16_first(struct scsi_device *sdp) { if (sdp->host->max_cmd_len < 16) return 0; + if (sdp->try_rc_10_first) + return 0; if (sdp->scsi_level > SCSI_SPC_2) return 1; if (scsi_device_protection(sdp)) diff --git a/trunk/drivers/usb/storage/scsiglue.c b/trunk/drivers/usb/storage/scsiglue.c index a324a5d21e99..11418da9bc09 100644 --- a/trunk/drivers/usb/storage/scsiglue.c +++ b/trunk/drivers/usb/storage/scsiglue.c @@ -202,6 +202,12 @@ static int slave_configure(struct scsi_device *sdev) if (us->fflags & US_FL_NO_READ_CAPACITY_16) sdev->no_read_capacity_16 = 1; + /* + * Many devices do not respond properly to READ_CAPACITY_16. + * Tell the SCSI layer to try READ_CAPACITY_10 first. + */ + sdev->try_rc_10_first = 1; + /* assume SPC3 or latter devices support sense size > 18 */ if (sdev->scsi_level > SCSI_SPC_2) us->fflags |= US_FL_SANE_SENSE; diff --git a/trunk/include/scsi/scsi_device.h b/trunk/include/scsi/scsi_device.h index 6efb2e1416e0..ba9698852321 100644 --- a/trunk/include/scsi/scsi_device.h +++ b/trunk/include/scsi/scsi_device.h @@ -151,6 +151,7 @@ struct scsi_device { SD_LAST_BUGGY_SECTORS */ unsigned no_read_disc_info:1; /* Avoid READ_DISC_INFO cmds */ unsigned no_read_capacity_16:1; /* Avoid READ_CAPACITY_16 cmds */ + unsigned try_rc_10_first:1; /* Try READ_CAPACACITY_10 first */ unsigned is_visible:1; /* is the device visible in sysfs */ DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */