diff options
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r-- | drivers/scsi/sd.c | 49 |
1 files changed, 10 insertions, 39 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 5a5457ac9cdb..f52b74cf8d1e 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -1275,18 +1275,19 @@ static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
1275 | struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk); | 1275 | struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk); |
1276 | struct scsi_device *sdp = sdkp->device; | 1276 | struct scsi_device *sdp = sdkp->device; |
1277 | struct Scsi_Host *host = sdp->host; | 1277 | struct Scsi_Host *host = sdp->host; |
1278 | sector_t capacity = logical_to_sectors(sdp, sdkp->capacity); | ||
1278 | int diskinfo[4]; | 1279 | int diskinfo[4]; |
1279 | 1280 | ||
1280 | /* default to most commonly used values */ | 1281 | /* default to most commonly used values */ |
1281 | diskinfo[0] = 0x40; /* 1 << 6 */ | 1282 | diskinfo[0] = 0x40; /* 1 << 6 */ |
1282 | diskinfo[1] = 0x20; /* 1 << 5 */ | 1283 | diskinfo[1] = 0x20; /* 1 << 5 */ |
1283 | diskinfo[2] = sdkp->capacity >> 11; | 1284 | diskinfo[2] = capacity >> 11; |
1284 | 1285 | ||
1285 | /* override with calculated, extended default, or driver values */ | 1286 | /* override with calculated, extended default, or driver values */ |
1286 | if (host->hostt->bios_param) | 1287 | if (host->hostt->bios_param) |
1287 | host->hostt->bios_param(sdp, bdev, sdkp->capacity, diskinfo); | 1288 | host->hostt->bios_param(sdp, bdev, capacity, diskinfo); |
1288 | else | 1289 | else |
1289 | scsicam_bios_param(bdev, sdkp->capacity, diskinfo); | 1290 | scsicam_bios_param(bdev, capacity, diskinfo); |
1290 | 1291 | ||
1291 | geo->heads = diskinfo[0]; | 1292 | geo->heads = diskinfo[0]; |
1292 | geo->sectors = diskinfo[1]; | 1293 | geo->sectors = diskinfo[1]; |
@@ -2337,14 +2338,6 @@ got_data: | |||
2337 | if (sdkp->capacity > 0xffffffff) | 2338 | if (sdkp->capacity > 0xffffffff) |
2338 | sdp->use_16_for_rw = 1; | 2339 | sdp->use_16_for_rw = 1; |
2339 | 2340 | ||
2340 | /* Rescale capacity to 512-byte units */ | ||
2341 | if (sector_size == 4096) | ||
2342 | sdkp->capacity <<= 3; | ||
2343 | else if (sector_size == 2048) | ||
2344 | sdkp->capacity <<= 2; | ||
2345 | else if (sector_size == 1024) | ||
2346 | sdkp->capacity <<= 1; | ||
2347 | |||
2348 | blk_queue_physical_block_size(sdp->request_queue, | 2341 | blk_queue_physical_block_size(sdp->request_queue, |
2349 | sdkp->physical_block_size); | 2342 | sdkp->physical_block_size); |
2350 | sdkp->device->sector_size = sector_size; | 2343 | sdkp->device->sector_size = sector_size; |
@@ -2795,28 +2788,6 @@ static void sd_read_write_same(struct scsi_disk *sdkp, unsigned char *buffer) | |||
2795 | sdkp->ws10 = 1; | 2788 | sdkp->ws10 = 1; |
2796 | } | 2789 | } |
2797 | 2790 | ||
2798 | static int sd_try_extended_inquiry(struct scsi_device *sdp) | ||
2799 | { | ||
2800 | /* Attempt VPD inquiry if the device blacklist explicitly calls | ||
2801 | * for it. | ||
2802 | */ | ||
2803 | if (sdp->try_vpd_pages) | ||
2804 | return 1; | ||
2805 | /* | ||
2806 | * Although VPD inquiries can go to SCSI-2 type devices, | ||
2807 | * some USB ones crash on receiving them, and the pages | ||
2808 | * we currently ask for are for SPC-3 and beyond | ||
2809 | */ | ||
2810 | if (sdp->scsi_level > SCSI_SPC_2 && !sdp->skip_vpd_pages) | ||
2811 | return 1; | ||
2812 | return 0; | ||
2813 | } | ||
2814 | |||
2815 | static inline u32 logical_to_sectors(struct scsi_device *sdev, u32 blocks) | ||
2816 | { | ||
2817 | return blocks << (ilog2(sdev->sector_size) - 9); | ||
2818 | } | ||
2819 | |||
2820 | /** | 2791 | /** |
2821 | * sd_revalidate_disk - called the first time a new disk is seen, | 2792 | * sd_revalidate_disk - called the first time a new disk is seen, |
2822 | * performs disk spin up, read_capacity, etc. | 2793 | * performs disk spin up, read_capacity, etc. |
@@ -2856,7 +2827,7 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
2856 | if (sdkp->media_present) { | 2827 | if (sdkp->media_present) { |
2857 | sd_read_capacity(sdkp, buffer); | 2828 | sd_read_capacity(sdkp, buffer); |
2858 | 2829 | ||
2859 | if (sd_try_extended_inquiry(sdp)) { | 2830 | if (scsi_device_supports_vpd(sdp)) { |
2860 | sd_read_block_provisioning(sdkp); | 2831 | sd_read_block_provisioning(sdkp); |
2861 | sd_read_block_limits(sdkp); | 2832 | sd_read_block_limits(sdkp); |
2862 | sd_read_block_characteristics(sdkp); | 2833 | sd_read_block_characteristics(sdkp); |
@@ -2891,7 +2862,7 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
2891 | if (sdkp->opt_xfer_blocks && | 2862 | if (sdkp->opt_xfer_blocks && |
2892 | sdkp->opt_xfer_blocks <= dev_max && | 2863 | sdkp->opt_xfer_blocks <= dev_max && |
2893 | sdkp->opt_xfer_blocks <= SD_DEF_XFER_BLOCKS && | 2864 | sdkp->opt_xfer_blocks <= SD_DEF_XFER_BLOCKS && |
2894 | sdkp->opt_xfer_blocks * sdp->sector_size >= PAGE_CACHE_SIZE) | 2865 | sdkp->opt_xfer_blocks * sdp->sector_size >= PAGE_SIZE) |
2895 | rw_max = q->limits.io_opt = | 2866 | rw_max = q->limits.io_opt = |
2896 | sdkp->opt_xfer_blocks * sdp->sector_size; | 2867 | sdkp->opt_xfer_blocks * sdp->sector_size; |
2897 | else | 2868 | else |
@@ -2900,7 +2871,7 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
2900 | /* Combine with controller limits */ | 2871 | /* Combine with controller limits */ |
2901 | q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q)); | 2872 | q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q)); |
2902 | 2873 | ||
2903 | set_capacity(disk, sdkp->capacity); | 2874 | set_capacity(disk, logical_to_sectors(sdp, sdkp->capacity)); |
2904 | sd_config_write_same(sdkp); | 2875 | sd_config_write_same(sdkp); |
2905 | kfree(buffer); | 2876 | kfree(buffer); |
2906 | 2877 | ||