scsi: set to WCE if usb cache quirk is present.
authorNamjae Jeon <namjae.jeon@samsung.com>
Sun, 8 Jul 2012 03:05:08 +0000 (23:05 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 16 Jul 2012 23:43:49 +0000 (16:43 -0700)
Make use of USB quirk method to identify such HDD while reading
the cache status in sd_probe(). If cache quirk is present for
the HDD, lets assume that cache is enabled and make WCE bit
equal to 1.

Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: Pankaj Kumar <pankaj.km@samsung.com>
Signed-off-by: Amit Sahrawat <a.sahrawat@samsung.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/scsi/sd.c
include/scsi/scsi_device.h

index 6f72b80121a02afdc9dda6fc82530af4e16017d9..4225064db797b0ceb041c0cdf1c148c50698f00c 100644 (file)
@@ -2261,8 +2261,13 @@ bad_sense:
                sd_printk(KERN_ERR, sdkp, "Asking for cache data failed\n");
 
 defaults:
-       sd_printk(KERN_ERR, sdkp, "Assuming drive cache: write through\n");
-       sdkp->WCE = 0;
+       if (sdp->wce_default_on) {
+               sd_printk(KERN_NOTICE, sdkp, "Assuming drive cache: write back\n");
+               sdkp->WCE = 1;
+       } else {
+               sd_printk(KERN_ERR, sdkp, "Assuming drive cache: write through\n");
+               sdkp->WCE = 0;
+       }
        sdkp->RCD = 0;
        sdkp->DPOFUA = 0;
 }
index ba969885232101e9eeed555e11c2385887b9cb85..6d65b55d47af8f9adfc3c59592f7c18ff37994d8 100644 (file)
@@ -153,6 +153,7 @@ struct scsi_device {
        unsigned no_read_capacity_16:1; /* Avoid READ_CAPACITY_16 cmds */
        unsigned try_rc_10_first:1;     /* Try READ_CAPACACITY_10 first */
        unsigned is_visible:1;  /* is the device visible in sysfs */
+       unsigned wce_default_on:1;      /* Cache is ON by default */
 
        DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
        struct list_head event_list;    /* asserted events */