On Wed, 6 Jun 2012, Namjae Jeon wrote: > Add support 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: Namjae Jeon <namjae.jeon@xxxxxxxxxxx> > Signed-off-by: Pankaj Kumar <pankaj.km@xxxxxxxxxxx> > Signed-off-by: Amit Sahrawat <a.sahrawat@xxxxxxxxxxx> > --- > drivers/usb/storage/scsiglue.c | 6 ++++++ > drivers/usb/storage/usb.c | 5 ++++- > include/linux/usb/quirks.h | 3 +++ > include/linux/usb_usual.h | 4 +++- > 4 files changed, 16 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c > index a324a5d..f7d0ea5 100644 > --- a/drivers/usb/storage/scsiglue.c > +++ b/drivers/usb/storage/scsiglue.c > @@ -51,6 +51,7 @@ > #include <scsi/scsi_devinfo.h> > #include <scsi/scsi_device.h> > #include <scsi/scsi_eh.h> > +#include <linux/usb/quirks.h> > > #include "usb.h" > #include "scsiglue.h" > @@ -230,6 +231,11 @@ static int slave_configure(struct scsi_device *sdev) > US_FL_SCM_MULT_TARG)) && > us->protocol == USB_PR_BULK) > us->use_last_sector_hacks = 1; > + > + /* Check for the cache quirk present or not */ > + if (us->pusb_dev->quirks & USB_QUIRK_WRITE_CACHE || > + us->fflags & US_FL_WRITE_CACHE) > + sdev->wce_quirk = 1; This is very wrong. Your new quirk should be added only to us->fflags, not to us->pusb_dev->quirks. > --- a/drivers/usb/storage/usb.c > +++ b/drivers/usb/storage/usb.c > @@ -473,7 +473,7 @@ static void adjust_quirks(struct us_data *us) > US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE | > US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT | > 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; > while (*p) { > @@ -538,6 +538,9 @@ static void adjust_quirks(struct us_data *us) > case 'w': > f |= US_FL_NO_WP_DETECT; > break; > + case 'p': > + f |= US_FL_WRITE_CACHE; > + break; These cases are in alphabetical order. Please keep them that way. Also, if you're going to change a module parameter like this then you _must_ update the description in Documentation/kernel-parameters.txt. > --- a/include/linux/usb/quirks.h > +++ b/include/linux/usb/quirks.h > @@ -30,4 +30,7 @@ > descriptor */ > #define USB_QUIRK_DELAY_INIT 0x00000040 > > +/* Device can't handle cache status request */ > +#define USB_QUIRK_WRITE_CACHE 0x00000080 As mentioned above, this is wrong. > --- a/include/linux/usb_usual.h > +++ b/include/linux/usb_usual.h > @@ -64,7 +64,9 @@ > US_FLAG(NO_READ_CAPACITY_16, 0x00080000) \ > /* cannot handle READ_CAPACITY_16 */ \ > 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) \ And this is right. But please try to make your '\' characters line up with the existing ones. > + /* Cache read status is not correct */ This comment, however is wrong. The flag applies when the cache status is not _available_ rather than when it is not _correct_. Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html