[SCSI] Disable DIF on Hitachi Ultrastar 15K300
authorMartin K. Petersen <martin.petersen@oracle.com>
Tue, 28 Aug 2012 18:29:35 +0000 (14:29 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Mon, 24 Sep 2012 08:11:00 +0000 (12:11 +0400)
Hitachi Ultrastar 15K300 is quirky. Disable T10 PI (DIF).

Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/scsi_devinfo.c
drivers/scsi/scsi_scan.c
include/scsi/scsi_device.h
include/scsi/scsi_devinfo.h

index cf8dfab9489fc9e0ff035c5b3699e95fff435171..43fca9170bf26e7a119e3674965b77b296887e05 100644 (file)
@@ -172,6 +172,7 @@ static struct {
        {"HITACHI", "DF400", "*", BLIST_REPORTLUN2},
        {"HITACHI", "DF500", "*", BLIST_REPORTLUN2},
        {"HITACHI", "DISK-SUBSYSTEM", "*", BLIST_REPORTLUN2},
+       {"HITACHI", "HUS1530", "*", BLIST_NO_DIF},
        {"HITACHI", "OPEN-", "*", BLIST_REPORTLUN2},
        {"HITACHI", "OP-C-", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
        {"HITACHI", "3380-", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
index 56a93794c470ae99d603426f15eaccb1dd3ae727..0a224e29c3f1c6d14f6676ab526198d860590b99 100644 (file)
@@ -911,6 +911,9 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
        if (*bflags & BLIST_RETRY_HWERROR)
                sdev->retry_hwerror = 1;
 
+       if (*bflags & BLIST_NO_DIF)
+               sdev->no_dif = 1;
+
        transport_configure_device(&sdev->sdev_gendev);
 
        if (sdev->host->hostt->slave_configure) {
index 9895f69294fc4a65113f3368155f087e86d42807..88fae8d2015471885972da8407d0077106b527cc 100644 (file)
@@ -156,6 +156,7 @@ struct scsi_device {
        unsigned is_visible:1;  /* is the device visible in sysfs */
        unsigned can_power_off:1; /* Device supports runtime power off */
        unsigned wce_default_on:1;      /* Cache is ON by default */
+       unsigned no_dif:1;      /* T10 PI (DIF) should be disabled */
 
        DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
        struct list_head event_list;    /* asserted events */
@@ -476,6 +477,9 @@ static inline int scsi_device_enclosure(struct scsi_device *sdev)
 
 static inline int scsi_device_protection(struct scsi_device *sdev)
 {
+       if (sdev->no_dif)
+               return 0;
+
        return sdev->scsi_level > SCSI_2 && sdev->inquiry[5] & (1<<0);
 }
 
index b4ddd3b18b4c1619fb7c7d9b4c484ed0bca89b2b..cc1f3e786ad71e863bc1fc5d0d3e2e91b884998a 100644 (file)
@@ -30,4 +30,5 @@
 #define BLIST_RETRY_HWERROR    0x400000 /* retry HARDWARE_ERROR */
 #define BLIST_MAX_512          0x800000 /* maximum 512 sector cdb length */
 #define BLIST_ATTACH_PQ3       0x1000000 /* Scan: Attach to PQ3 devices */
+#define BLIST_NO_DIF           0x2000000 /* Disable T10 PI (DIF) */
 #endif