[SCSI] hpsa: use extended report luns command for HP SSD SmartPath
authorMatt Gates <matthew.gates@hp.com>
Tue, 18 Feb 2014 19:55:07 +0000 (13:55 -0600)
committerJames Bottomley <JBottomley@Parallels.com>
Sat, 15 Mar 2014 17:19:01 +0000 (10:19 -0700)
There is an extended report luns command which contains
additional information about physical devices.  In particular
we need to get the physical device handle so we can use an
alternate i/o path for fast physical devices like SSDs so
we can speed up certain i/o's by bypassing the RAID stack
code in the controller firmware.

Signed-off-by: Matt Gates <matthew.gates@hp.com>
Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/hpsa.c
drivers/scsi/hpsa_cmd.h

index 40989eea8f97b230f265e3a410082f1777690c5d..eed5f03206d1fcac1c5446805f173983d24fbbf7 100644 (file)
@@ -1888,11 +1888,12 @@ static int hpsa_gather_lun_info(struct ctlr_info *h,
        struct ReportLUNdata *physdev, u32 *nphysicals,
        struct ReportLUNdata *logdev, u32 *nlogicals)
 {
-       if (hpsa_scsi_do_report_phys_luns(h, physdev, reportlunsize, 0)) {
+       if (hpsa_scsi_do_report_phys_luns(h, physdev, reportlunsize,
+                                       HPSA_REPORT_PHYS_EXTENDED)) {
                dev_err(&h->pdev->dev, "report physical LUNs failed.\n");
                return -1;
        }
-       *nphysicals = be32_to_cpu(*((__be32 *)physdev->LUNListLength)) / 8;
+       *nphysicals = be32_to_cpu(*((__be32 *)physdev->LUNListLength)) / 24;
        if (*nphysicals > HPSA_MAX_PHYS_LUN) {
                dev_warn(&h->pdev->dev, "maximum physical LUNs (%d) exceeded."
                        "  %d LUNs ignored.\n", HPSA_MAX_PHYS_LUN,
@@ -1923,7 +1924,8 @@ static int hpsa_gather_lun_info(struct ctlr_info *h,
 }
 
 u8 *figure_lunaddrbytes(struct ctlr_info *h, int raid_ctlr_position, int i,
-       int nphysicals, int nlogicals, struct ReportLUNdata *physdev_list,
+       int nphysicals, int nlogicals,
+       struct ReportExtendedLUNdata *physdev_list,
        struct ReportLUNdata *logdev_list)
 {
        /* Helper function, figure out where the LUN ID info is coming from
@@ -1959,7 +1961,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
         * tell which devices we already know about, vs. new
         * devices, vs.  disappearing devices.
         */
-       struct ReportLUNdata *physdev_list = NULL;
+       struct ReportExtendedLUNdata *physdev_list = NULL;
        struct ReportLUNdata *logdev_list = NULL;
        u32 nphysicals = 0;
        u32 nlogicals = 0;
@@ -1982,7 +1984,8 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
        }
        memset(lunzerobits, 0, sizeof(lunzerobits));
 
-       if (hpsa_gather_lun_info(h, reportlunsize, physdev_list, &nphysicals,
+       if (hpsa_gather_lun_info(h, reportlunsize,
+                       (struct ReportLUNdata *) physdev_list, &nphysicals,
                        logdev_list, &nlogicals))
                goto out;
 
index bfc8c4ea66f8fe53315f91fbb36fa3eb77b320d1..3f96b66e5761677e74c031d1fac224b3b4166571 100644 (file)
@@ -162,6 +162,7 @@ struct InquiryData {
 
 #define HPSA_REPORT_LOG 0xc2    /* Report Logical LUNs */
 #define HPSA_REPORT_PHYS 0xc3   /* Report Physical LUNs */
+#define HPSA_REPORT_PHYS_EXTENDED 0x02
 struct ReportLUNdata {
        u8 LUNListLength[4];
        u32 reserved;