[SCSI] hpsa: eliminate 8 external target limitation
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / hpsa.c
index 4e7df2e5701ef6fb23e58113acf93ad81b239b74..c8db43e9a38a8d054a0731a6eca514b01909d767 100644 (file)
@@ -1630,50 +1630,30 @@ static int is_msa2xxx(struct ctlr_info *h, struct hpsa_scsi_dev_t *device)
  * in hpsa_find_target_lun, called by hpsa_scsi_add_entry.)
  */
 static void figure_bus_target_lun(struct ctlr_info *h,
-       u8 *lunaddrbytes, int *bus, int *target, int *lun,
-       struct hpsa_scsi_dev_t *device)
-{
-       u32 lunid;
-
-       if (is_logical_dev_addr_mode(lunaddrbytes)) {
-               /* logical device */
-               lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
-               if (is_msa2xxx(h, device)) {
-                       /* msa2xxx way, put logicals on bus 1
-                        * and match target/lun numbers box
-                        * reports.
-                        */
-                       *bus = 1;
-                       *target = (lunid >> 16) & 0x3fff;
-                       *lun = lunid & 0x00ff;
-               } else {
-                       if (likely(is_scsi_rev_5(h))) {
-                               /* All current smart arrays (circa 2011) */
-                               *bus = 0;
-                               *target = 0;
-                               *lun = (lunid & 0x3fff) + 1;
-                       } else {
-                               /* Traditional old smart array way. */
-                               *bus = 0;
-                               *target = lunid & 0x3fff;
-                               *lun = 0;
-                       }
-               }
-       } else {
-               /* physical device */
+       u8 *lunaddrbytes, struct hpsa_scsi_dev_t *device)
+{
+       u32 lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
+
+       if (!is_logical_dev_addr_mode(lunaddrbytes)) {
+               /* physical device, target and lun filled in later */
                if (is_hba_lunid(lunaddrbytes))
-                       if (unlikely(is_scsi_rev_5(h))) {
-                               *bus = 0; /* put p1210m ctlr at 0,0,0 */
-                               *target = 0;
-                               *lun = 0;
-                               return;
-                       } else
-                               *bus = 3; /* traditional smartarray */
+                       hpsa_set_bus_target_lun(device, 3, 0, lunid & 0x3fff);
                else
-                       *bus = 2; /* physical disk */
-               *target = -1;
-               *lun = -1; /* we will fill these in later. */
+                       /* defer target, lun assignment for physical devices */
+                       hpsa_set_bus_target_lun(device, 2, -1, -1);
+               return;
+       }
+       /* It's a logical device */
+       if (is_msa2xxx(h, device)) {
+               /* msa2xxx way, put logicals on bus 1
+                * and match target/lun numbers box
+                * reports, other smart array, bus 0, target 0, match lunid
+                */
+               hpsa_set_bus_target_lun(device,
+                       1, (lunid >> 16) & 0x3fff, lunid & 0x00ff);
+               return;
        }
+       hpsa_set_bus_target_lun(device, 0, 0, lunid & 0x3fff);
 }
 
 /*
@@ -1690,12 +1670,11 @@ static void figure_bus_target_lun(struct ctlr_info *h,
 static int add_msa2xxx_enclosure_device(struct ctlr_info *h,
        struct hpsa_scsi_dev_t *tmpdevice,
        struct hpsa_scsi_dev_t *this_device, u8 *lunaddrbytes,
-       int bus, int target, int lun, unsigned long lunzerobits[],
-       int *nmsa2xxx_enclosures)
+       unsigned long lunzerobits[], int *nmsa2xxx_enclosures)
 {
        unsigned char scsi3addr[8];
 
-       if (test_bit(target, lunzerobits))
+       if (test_bit(tmpdevice->target, lunzerobits))
                return 0; /* There is already a lun 0 on this target. */
 
        if (!is_logical_dev_addr_mode(lunaddrbytes))
@@ -1704,20 +1683,20 @@ static int add_msa2xxx_enclosure_device(struct ctlr_info *h,
        if (!is_msa2xxx(h, tmpdevice))
                return 0; /* It's only the MSA2xxx that have this problem. */
 
-       if (lun == 0) /* if lun is 0, then obviously we have a lun 0. */
+       if (tmpdevice->lun == 0) /* if lun is 0, then we have a lun 0. */
                return 0;
 
        memset(scsi3addr, 0, 8);
-       scsi3addr[3] = target;
+       scsi3addr[3] = tmpdevice->target;
        if (is_hba_lunid(scsi3addr))
                return 0; /* Don't add the RAID controller here. */
 
        if (is_scsi_rev_5(h))
                return 0; /* p1210m doesn't need to do this. */
 
-       if (*nmsa2xxx_enclosures >= MAX_MSA2XXX_ENCLOSURES) {
-               dev_warn(&h->pdev->dev, "Maximum number of MSA2XXX "
-                       "enclosures exceeded.  Check your hardware "
+       if (*nmsa2xxx_enclosures >= MAX_EXT_TARGETS) {
+               dev_warn(&h->pdev->dev, "Maximum number of external "
+                       "target devices exceeded.  Check your hardware "
                        "configuration.");
                return 0;
        }
@@ -1725,8 +1704,9 @@ static int add_msa2xxx_enclosure_device(struct ctlr_info *h,
        if (hpsa_update_device_info(h, scsi3addr, this_device, NULL))
                return 0;
        (*nmsa2xxx_enclosures)++;
-       hpsa_set_bus_target_lun(this_device, bus, target, 0);
-       set_bit(target, lunzerobits);
+       hpsa_set_bus_target_lun(this_device,
+                               tmpdevice->bus, tmpdevice->target, 0);
+       set_bit(tmpdevice->target, lunzerobits);
        return 1;
 }
 
@@ -1821,9 +1801,8 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
        int ncurrent = 0;
        int reportlunsize = sizeof(*physdev_list) + HPSA_MAX_PHYS_LUN * 8;
        int i, nmsa2xxx_enclosures, ndevs_to_allocate;
-       int bus, target, lun;
        int raid_ctlr_position;
-       DECLARE_BITMAP(lunzerobits, HPSA_MAX_TARGETS_PER_CTLR);
+       DECLARE_BITMAP(lunzerobits, MAX_EXT_TARGETS);
 
        currentsd = kzalloc(sizeof(*currentsd) * HPSA_MAX_DEVICES, GFP_KERNEL);
        physdev_list = kzalloc(reportlunsize, GFP_KERNEL);
@@ -1840,11 +1819,11 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
                        logdev_list, &nlogicals))
                goto out;
 
-       /* We might see up to 32 MSA2xxx enclosures, actually 8 of them
-        * but each of them 4 times through different paths.  The plus 1
-        * is for the RAID controller.
+       /* We might see up to the maximum number of logical and physical disks
+        * plus external target devices, and a device for the local RAID
+        * controller.
         */
-       ndevs_to_allocate = nphysicals + nlogicals + MAX_MSA2XXX_ENCLOSURES + 1;
+       ndevs_to_allocate = nphysicals + nlogicals + MAX_EXT_TARGETS + 1;
 
        /* Allocate the per device structures */
        for (i = 0; i < ndevs_to_allocate; i++) {
@@ -1886,8 +1865,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
                if (hpsa_update_device_info(h, lunaddrbytes, tmpdevice,
                                                        &is_OBDR))
                        continue; /* skip it if we can't talk to it. */
-               figure_bus_target_lun(h, lunaddrbytes, &bus, &target, &lun,
-                       tmpdevice);
+               figure_bus_target_lun(h, lunaddrbytes, tmpdevice);
                this_device = currentsd[ncurrent];
 
                /*
@@ -1898,14 +1876,13 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
                 * there is no lun 0.
                 */
                if (add_msa2xxx_enclosure_device(h, tmpdevice, this_device,
-                               lunaddrbytes, bus, target, lun, lunzerobits,
+                               lunaddrbytes, lunzerobits,
                                &nmsa2xxx_enclosures)) {
                        ncurrent++;
                        this_device = currentsd[ncurrent];
                }
 
                *this_device = *tmpdevice;
-               hpsa_set_bus_target_lun(this_device, bus, target, lun);
 
                switch (this_device->devtype) {
                case TYPE_ROM: