Commit 1f310bde authored by Stephen M. Cameron's avatar Stephen M. Cameron Committed by James Bottomley

[SCSI] hpsa: refactor hpsa_figure_bus_target_lun

It should call hpsa_set_bus_target_lun rather
than individually setting bus, target and lun.
Signed-off-by: default avatarStephen M. Cameron <scameron@beardog.cce.hp.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent bbef6c0c
...@@ -1630,35 +1630,30 @@ static int is_msa2xxx(struct ctlr_info *h, struct hpsa_scsi_dev_t *device) ...@@ -1630,35 +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.) * in hpsa_find_target_lun, called by hpsa_scsi_add_entry.)
*/ */
static void figure_bus_target_lun(struct ctlr_info *h, static void figure_bus_target_lun(struct ctlr_info *h,
u8 *lunaddrbytes, int *bus, int *target, int *lun, u8 *lunaddrbytes, struct hpsa_scsi_dev_t *device)
struct hpsa_scsi_dev_t *device) {
{ u32 lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
u32 lunid;
if (!is_logical_dev_addr_mode(lunaddrbytes)) {
if (is_logical_dev_addr_mode(lunaddrbytes)) { /* physical device, target and lun filled in later */
/* 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 {
*bus = 0;
*target = 0;
*lun = (lunid & 0x3fff);
}
} else {
if (is_hba_lunid(lunaddrbytes)) if (is_hba_lunid(lunaddrbytes))
*bus = 3; /* controller */ hpsa_set_bus_target_lun(device, 3, 0, lunid & 0x3fff);
else else
*bus = 2; /* physical device */ /* defer target, lun assignment for physical devices */
*target = -1; hpsa_set_bus_target_lun(device, 2, -1, -1);
*lun = -1; /* we will fill these in later. */ 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);
} }
/* /*
...@@ -1675,12 +1670,11 @@ static void figure_bus_target_lun(struct ctlr_info *h, ...@@ -1675,12 +1670,11 @@ static void figure_bus_target_lun(struct ctlr_info *h,
static int add_msa2xxx_enclosure_device(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 *tmpdevice,
struct hpsa_scsi_dev_t *this_device, u8 *lunaddrbytes, struct hpsa_scsi_dev_t *this_device, u8 *lunaddrbytes,
int bus, int target, int lun, unsigned long lunzerobits[], unsigned long lunzerobits[], int *nmsa2xxx_enclosures)
int *nmsa2xxx_enclosures)
{ {
unsigned char scsi3addr[8]; 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. */ return 0; /* There is already a lun 0 on this target. */
if (!is_logical_dev_addr_mode(lunaddrbytes)) if (!is_logical_dev_addr_mode(lunaddrbytes))
...@@ -1689,11 +1683,11 @@ static int add_msa2xxx_enclosure_device(struct ctlr_info *h, ...@@ -1689,11 +1683,11 @@ static int add_msa2xxx_enclosure_device(struct ctlr_info *h,
if (!is_msa2xxx(h, tmpdevice)) if (!is_msa2xxx(h, tmpdevice))
return 0; /* It's only the MSA2xxx that have this problem. */ 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; return 0;
memset(scsi3addr, 0, 8); memset(scsi3addr, 0, 8);
scsi3addr[3] = target; scsi3addr[3] = tmpdevice->target;
if (is_hba_lunid(scsi3addr)) if (is_hba_lunid(scsi3addr))
return 0; /* Don't add the RAID controller here. */ return 0; /* Don't add the RAID controller here. */
...@@ -1710,8 +1704,9 @@ static int add_msa2xxx_enclosure_device(struct ctlr_info *h, ...@@ -1710,8 +1704,9 @@ static int add_msa2xxx_enclosure_device(struct ctlr_info *h,
if (hpsa_update_device_info(h, scsi3addr, this_device, NULL)) if (hpsa_update_device_info(h, scsi3addr, this_device, NULL))
return 0; return 0;
(*nmsa2xxx_enclosures)++; (*nmsa2xxx_enclosures)++;
hpsa_set_bus_target_lun(this_device, bus, target, 0); hpsa_set_bus_target_lun(this_device,
set_bit(target, lunzerobits); tmpdevice->bus, tmpdevice->target, 0);
set_bit(tmpdevice->target, lunzerobits);
return 1; return 1;
} }
...@@ -1806,7 +1801,6 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno) ...@@ -1806,7 +1801,6 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
int ncurrent = 0; int ncurrent = 0;
int reportlunsize = sizeof(*physdev_list) + HPSA_MAX_PHYS_LUN * 8; int reportlunsize = sizeof(*physdev_list) + HPSA_MAX_PHYS_LUN * 8;
int i, nmsa2xxx_enclosures, ndevs_to_allocate; int i, nmsa2xxx_enclosures, ndevs_to_allocate;
int bus, target, lun;
int raid_ctlr_position; int raid_ctlr_position;
DECLARE_BITMAP(lunzerobits, HPSA_MAX_TARGETS_PER_CTLR); DECLARE_BITMAP(lunzerobits, HPSA_MAX_TARGETS_PER_CTLR);
...@@ -1871,8 +1865,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno) ...@@ -1871,8 +1865,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
if (hpsa_update_device_info(h, lunaddrbytes, tmpdevice, if (hpsa_update_device_info(h, lunaddrbytes, tmpdevice,
&is_OBDR)) &is_OBDR))
continue; /* skip it if we can't talk to it. */ continue; /* skip it if we can't talk to it. */
figure_bus_target_lun(h, lunaddrbytes, &bus, &target, &lun, figure_bus_target_lun(h, lunaddrbytes, tmpdevice);
tmpdevice);
this_device = currentsd[ncurrent]; this_device = currentsd[ncurrent];
/* /*
...@@ -1883,14 +1876,13 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno) ...@@ -1883,14 +1876,13 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
* there is no lun 0. * there is no lun 0.
*/ */
if (add_msa2xxx_enclosure_device(h, tmpdevice, this_device, if (add_msa2xxx_enclosure_device(h, tmpdevice, this_device,
lunaddrbytes, bus, target, lun, lunzerobits, lunaddrbytes, lunzerobits,
&nmsa2xxx_enclosures)) { &nmsa2xxx_enclosures)) {
ncurrent++; ncurrent++;
this_device = currentsd[ncurrent]; this_device = currentsd[ncurrent];
} }
*this_device = *tmpdevice; *this_device = *tmpdevice;
hpsa_set_bus_target_lun(this_device, bus, target, lun);
switch (this_device->devtype) { switch (this_device->devtype) {
case TYPE_ROM: case TYPE_ROM:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment