diff options
Diffstat (limited to 'drivers/scsi/sd.c')
| -rw-r--r-- | drivers/scsi/sd.c | 20 | 
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 5616cd780ff..b7b9fec67a9 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -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);  |