提交 eaa05dfc 编写于 作者: N Namjae Jeon 提交者: James Bottomley

[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: NNamjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: NPankaj Kumar <pankaj.km@samsung.com>
Signed-off-by: NAmit Sahrawat <a.sahrawat@samsung.com>
Acked-by: NAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
上级 b81478d8
...@@ -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 };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册