|
@@ -1440,6 +1440,7 @@ sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer)
|
|
{
|
|
{
|
|
int sector_size;
|
|
int sector_size;
|
|
struct scsi_device *sdp = sdkp->device;
|
|
struct scsi_device *sdp = sdkp->device;
|
|
|
|
+ sector_t old_capacity = sdkp->capacity;
|
|
|
|
|
|
if (sd_try_rc16_first(sdp)) {
|
|
if (sd_try_rc16_first(sdp)) {
|
|
sector_size = read_capacity_16(sdkp, sdp, buffer);
|
|
sector_size = read_capacity_16(sdkp, sdp, buffer);
|
|
@@ -1531,10 +1532,11 @@ got_data:
|
|
string_get_size(sz, STRING_UNITS_10, cap_str_10,
|
|
string_get_size(sz, STRING_UNITS_10, cap_str_10,
|
|
sizeof(cap_str_10));
|
|
sizeof(cap_str_10));
|
|
|
|
|
|
- sd_printk(KERN_NOTICE, sdkp,
|
|
|
|
- "%llu %d-byte hardware sectors: (%s/%s)\n",
|
|
|
|
- (unsigned long long)sdkp->capacity,
|
|
|
|
- sector_size, cap_str_10, cap_str_2);
|
|
|
|
|
|
+ if (sdkp->first_scan || old_capacity != sdkp->capacity)
|
|
|
|
+ sd_printk(KERN_NOTICE, sdkp,
|
|
|
|
+ "%llu %d-byte hardware sectors: (%s/%s)\n",
|
|
|
|
+ (unsigned long long)sdkp->capacity,
|
|
|
|
+ sector_size, cap_str_10, cap_str_2);
|
|
}
|
|
}
|
|
|
|
|
|
/* Rescale capacity to 512-byte units */
|
|
/* Rescale capacity to 512-byte units */
|
|
@@ -1571,6 +1573,7 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, unsigned char *buffer)
|
|
int res;
|
|
int res;
|
|
struct scsi_device *sdp = sdkp->device;
|
|
struct scsi_device *sdp = sdkp->device;
|
|
struct scsi_mode_data data;
|
|
struct scsi_mode_data data;
|
|
|
|
+ int old_wp = sdkp->write_prot;
|
|
|
|
|
|
set_disk_ro(sdkp->disk, 0);
|
|
set_disk_ro(sdkp->disk, 0);
|
|
if (sdp->skip_ms_page_3f) {
|
|
if (sdp->skip_ms_page_3f) {
|
|
@@ -1611,11 +1614,13 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, unsigned char *buffer)
|
|
} else {
|
|
} else {
|
|
sdkp->write_prot = ((data.device_specific & 0x80) != 0);
|
|
sdkp->write_prot = ((data.device_specific & 0x80) != 0);
|
|
set_disk_ro(sdkp->disk, sdkp->write_prot);
|
|
set_disk_ro(sdkp->disk, sdkp->write_prot);
|
|
- sd_printk(KERN_NOTICE, sdkp, "Write Protect is %s\n",
|
|
|
|
- sdkp->write_prot ? "on" : "off");
|
|
|
|
- sd_printk(KERN_DEBUG, sdkp,
|
|
|
|
- "Mode Sense: %02x %02x %02x %02x\n",
|
|
|
|
- buffer[0], buffer[1], buffer[2], buffer[3]);
|
|
|
|
|
|
+ if (sdkp->first_scan || old_wp != sdkp->write_prot) {
|
|
|
|
+ sd_printk(KERN_NOTICE, sdkp, "Write Protect is %s\n",
|
|
|
|
+ sdkp->write_prot ? "on" : "off");
|
|
|
|
+ sd_printk(KERN_DEBUG, sdkp,
|
|
|
|
+ "Mode Sense: %02x %02x %02x %02x\n",
|
|
|
|
+ buffer[0], buffer[1], buffer[2], buffer[3]);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1633,6 +1638,9 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
|
|
int modepage;
|
|
int modepage;
|
|
struct scsi_mode_data data;
|
|
struct scsi_mode_data data;
|
|
struct scsi_sense_hdr sshdr;
|
|
struct scsi_sense_hdr sshdr;
|
|
|
|
+ int old_wce = sdkp->WCE;
|
|
|
|
+ int old_rcd = sdkp->RCD;
|
|
|
|
+ int old_dpofua = sdkp->DPOFUA;
|
|
|
|
|
|
if (sdp->skip_ms_page_8)
|
|
if (sdp->skip_ms_page_8)
|
|
goto defaults;
|
|
goto defaults;
|
|
@@ -1704,12 +1712,14 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
|
|
sdkp->DPOFUA = 0;
|
|
sdkp->DPOFUA = 0;
|
|
}
|
|
}
|
|
|
|
|
|
- sd_printk(KERN_NOTICE, sdkp,
|
|
|
|
- "Write cache: %s, read cache: %s, %s\n",
|
|
|
|
- sdkp->WCE ? "enabled" : "disabled",
|
|
|
|
- sdkp->RCD ? "disabled" : "enabled",
|
|
|
|
- sdkp->DPOFUA ? "supports DPO and FUA"
|
|
|
|
- : "doesn't support DPO or FUA");
|
|
|
|
|
|
+ if (sdkp->first_scan || old_wce != sdkp->WCE ||
|
|
|
|
+ old_rcd != sdkp->RCD || old_dpofua != sdkp->DPOFUA)
|
|
|
|
+ sd_printk(KERN_NOTICE, sdkp,
|
|
|
|
+ "Write cache: %s, read cache: %s, %s\n",
|
|
|
|
+ sdkp->WCE ? "enabled" : "disabled",
|
|
|
|
+ sdkp->RCD ? "disabled" : "enabled",
|
|
|
|
+ sdkp->DPOFUA ? "supports DPO and FUA"
|
|
|
|
+ : "doesn't support DPO or FUA");
|
|
|
|
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -1805,15 +1815,6 @@ static int sd_revalidate_disk(struct gendisk *disk)
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
- /* defaults, until the device tells us otherwise */
|
|
|
|
- sdp->sector_size = 512;
|
|
|
|
- sdkp->capacity = 0;
|
|
|
|
- sdkp->media_present = 1;
|
|
|
|
- sdkp->write_prot = 0;
|
|
|
|
- sdkp->WCE = 0;
|
|
|
|
- sdkp->RCD = 0;
|
|
|
|
- sdkp->ATO = 0;
|
|
|
|
-
|
|
|
|
sd_spinup_disk(sdkp);
|
|
sd_spinup_disk(sdkp);
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -1827,6 +1828,8 @@ static int sd_revalidate_disk(struct gendisk *disk)
|
|
sd_read_app_tag_own(sdkp, buffer);
|
|
sd_read_app_tag_own(sdkp, buffer);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ sdkp->first_scan = 0;
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* We now have all cache related info, determine how we deal
|
|
* We now have all cache related info, determine how we deal
|
|
* with ordered requests. Note that as the current SCSI
|
|
* with ordered requests. Note that as the current SCSI
|
|
@@ -1937,6 +1940,16 @@ static void sd_probe_async(void *data, async_cookie_t cookie)
|
|
gd->private_data = &sdkp->driver;
|
|
gd->private_data = &sdkp->driver;
|
|
gd->queue = sdkp->device->request_queue;
|
|
gd->queue = sdkp->device->request_queue;
|
|
|
|
|
|
|
|
+ /* defaults, until the device tells us otherwise */
|
|
|
|
+ sdp->sector_size = 512;
|
|
|
|
+ sdkp->capacity = 0;
|
|
|
|
+ sdkp->media_present = 1;
|
|
|
|
+ sdkp->write_prot = 0;
|
|
|
|
+ sdkp->WCE = 0;
|
|
|
|
+ sdkp->RCD = 0;
|
|
|
|
+ sdkp->ATO = 0;
|
|
|
|
+ sdkp->first_scan = 1;
|
|
|
|
+
|
|
sd_revalidate_disk(gd);
|
|
sd_revalidate_disk(gd);
|
|
|
|
|
|
blk_queue_prep_rq(sdp->request_queue, sd_prep_fn);
|
|
blk_queue_prep_rq(sdp->request_queue, sd_prep_fn);
|