Skip to content
Snippets Groups Projects
Commit eaa05dfc authored by Namjae Jeon's avatar Namjae Jeon Committed by James Bottomley
Browse files

[SCSI] usb-storage: add support for write cache quirk


Add support for write cache quirk on usb hdd. scsi driver will be set to wce
by detecting write cache quirk in quirk list when plugging usb hdd.

Signed-off-by: default avatarNamjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: default avatarPankaj Kumar <pankaj.km@samsung.com>
Signed-off-by: default avatarAmit Sahrawat <a.sahrawat@samsung.com>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent b81478d8
No related branches found
No related tags found
No related merge requests found
...@@ -2932,6 +2932,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. ...@@ -2932,6 +2932,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
initial READ(10) command); initial READ(10) command);
o = CAPACITY_OK (accept the capacity o = CAPACITY_OK (accept the capacity
reported by the device); reported by the device);
p = WRITE_CACHE (the device cache is ON
by default);
r = IGNORE_RESIDUE (the device reports r = IGNORE_RESIDUE (the device reports
bogus residue values); bogus residue values);
s = SINGLE_LUN (the device has only one s = SINGLE_LUN (the device has only one
......
...@@ -236,6 +236,11 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -236,6 +236,11 @@ static int slave_configure(struct scsi_device *sdev)
US_FL_SCM_MULT_TARG)) && US_FL_SCM_MULT_TARG)) &&
us->protocol == USB_PR_BULK) us->protocol == USB_PR_BULK)
us->use_last_sector_hacks = 1; us->use_last_sector_hacks = 1;
/* Check if write cache default on flag is set or not */
if (us->fflags & US_FL_WRITE_CACHE)
sdev->wce_default_on = 1;
} else { } else {
/* Non-disk-type devices don't need to blacklist any pages /* Non-disk-type devices don't need to blacklist any pages
......
...@@ -473,7 +473,7 @@ static void adjust_quirks(struct us_data *us) ...@@ -473,7 +473,7 @@ static void adjust_quirks(struct us_data *us)
US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE | US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE |
US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT | US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT |
US_FL_NO_READ_DISC_INFO | US_FL_NO_READ_CAPACITY_16 | US_FL_NO_READ_DISC_INFO | US_FL_NO_READ_CAPACITY_16 |
US_FL_INITIAL_READ10); US_FL_INITIAL_READ10 | US_FL_WRITE_CACHE);
p = quirks; p = quirks;
while (*p) { while (*p) {
...@@ -529,6 +529,9 @@ static void adjust_quirks(struct us_data *us) ...@@ -529,6 +529,9 @@ static void adjust_quirks(struct us_data *us)
case 'o': case 'o':
f |= US_FL_CAPACITY_OK; f |= US_FL_CAPACITY_OK;
break; break;
case 'p':
f |= US_FL_WRITE_CACHE;
break;
case 'r': case 'r':
f |= US_FL_IGNORE_RESIDUE; f |= US_FL_IGNORE_RESIDUE;
break; break;
......
...@@ -64,7 +64,9 @@ ...@@ -64,7 +64,9 @@
US_FLAG(NO_READ_CAPACITY_16, 0x00080000) \ US_FLAG(NO_READ_CAPACITY_16, 0x00080000) \
/* cannot handle READ_CAPACITY_16 */ \ /* cannot handle READ_CAPACITY_16 */ \
US_FLAG(INITIAL_READ10, 0x00100000) \ US_FLAG(INITIAL_READ10, 0x00100000) \
/* Initial READ(10) (and others) must be retried */ /* Initial READ(10) (and others) must be retried */ \
US_FLAG(WRITE_CACHE, 0x00200000) \
/* Write Cache status is not available */
#define US_FLAG(name, value) US_FL_##name = value , #define US_FLAG(name, value) US_FL_##name = value ,
enum { US_DO_ALL_FLAGS }; enum { US_DO_ALL_FLAGS };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment