|
@@ -142,6 +142,7 @@ sd_store_cache_type(struct device *dev, struct device_attribute *attr,
|
|
|
char *buffer_data;
|
|
|
struct scsi_mode_data data;
|
|
|
struct scsi_sense_hdr sshdr;
|
|
|
+ const char *temp = "temporary ";
|
|
|
int len;
|
|
|
|
|
|
if (sdp->type != TYPE_DISK)
|
|
@@ -150,6 +151,13 @@ sd_store_cache_type(struct device *dev, struct device_attribute *attr,
|
|
|
* it's not worth the risk */
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ if (strncmp(buf, temp, sizeof(temp) - 1) == 0) {
|
|
|
+ buf += sizeof(temp) - 1;
|
|
|
+ sdkp->cache_override = 1;
|
|
|
+ } else {
|
|
|
+ sdkp->cache_override = 0;
|
|
|
+ }
|
|
|
+
|
|
|
for (i = 0; i < ARRAY_SIZE(sd_cache_types); i++) {
|
|
|
len = strlen(sd_cache_types[i]);
|
|
|
if (strncmp(sd_cache_types[i], buf, len) == 0 &&
|
|
@@ -162,6 +170,13 @@ sd_store_cache_type(struct device *dev, struct device_attribute *attr,
|
|
|
return -EINVAL;
|
|
|
rcd = ct & 0x01 ? 1 : 0;
|
|
|
wce = ct & 0x02 ? 1 : 0;
|
|
|
+
|
|
|
+ if (sdkp->cache_override) {
|
|
|
+ sdkp->WCE = wce;
|
|
|
+ sdkp->RCD = rcd;
|
|
|
+ return count;
|
|
|
+ }
|
|
|
+
|
|
|
if (scsi_mode_sense(sdp, 0x08, 8, buffer, sizeof(buffer), SD_TIMEOUT,
|
|
|
SD_MAX_RETRIES, &data, NULL))
|
|
|
return -EINVAL;
|
|
@@ -2319,6 +2334,10 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
|
|
|
int old_rcd = sdkp->RCD;
|
|
|
int old_dpofua = sdkp->DPOFUA;
|
|
|
|
|
|
+
|
|
|
+ if (sdkp->cache_override)
|
|
|
+ return;
|
|
|
+
|
|
|
first_len = 4;
|
|
|
if (sdp->skip_ms_page_8) {
|
|
|
if (sdp->type == TYPE_RBC)
|
|
@@ -2812,6 +2831,7 @@ static void sd_probe_async(void *data, async_cookie_t cookie)
|
|
|
sdkp->capacity = 0;
|
|
|
sdkp->media_present = 1;
|
|
|
sdkp->write_prot = 0;
|
|
|
+ sdkp->cache_override = 0;
|
|
|
sdkp->WCE = 0;
|
|
|
sdkp->RCD = 0;
|
|
|
sdkp->ATO = 0;
|