|
@@ -1840,6 +1840,18 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
|
|
|
kfree(buffer);
|
|
|
}
|
|
|
|
|
|
+static int sd_try_extended_inquiry(struct scsi_device *sdp)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Although VPD inquiries can go to SCSI-2 type devices,
|
|
|
+ * some USB ones crash on receiving them, and the pages
|
|
|
+ * we currently ask for are for SPC-3 and beyond
|
|
|
+ */
|
|
|
+ if (sdp->scsi_level > SCSI_SPC_2)
|
|
|
+ return 1;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* sd_revalidate_disk - called the first time a new disk is seen,
|
|
|
* performs disk spin up, read_capacity, etc.
|
|
@@ -1877,8 +1889,12 @@ static int sd_revalidate_disk(struct gendisk *disk)
|
|
|
*/
|
|
|
if (sdkp->media_present) {
|
|
|
sd_read_capacity(sdkp, buffer);
|
|
|
- sd_read_block_limits(sdkp);
|
|
|
- sd_read_block_characteristics(sdkp);
|
|
|
+
|
|
|
+ if (sd_try_extended_inquiry(sdp)) {
|
|
|
+ sd_read_block_limits(sdkp);
|
|
|
+ sd_read_block_characteristics(sdkp);
|
|
|
+ }
|
|
|
+
|
|
|
sd_read_write_protect_flag(sdkp, buffer);
|
|
|
sd_read_cache_type(sdkp, buffer);
|
|
|
sd_read_app_tag_own(sdkp, buffer);
|