summaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorGilbert Wu <gilbert.wu@microsemi.com>2019-08-22 22:38:58 +0200
committerMartin K. Petersen <martin.petersen@oracle.com>2019-08-30 00:31:38 +0200
commit5e6a9760f7da4dd86cca43ac6423695d6cb0dff4 (patch)
tree13afa30ad2d684ff37192d17666b37cc06dadc24 /drivers/scsi
parentscsi: lpfc: fix 12.4.0.0 GPF at boot (diff)
downloadlinux-5e6a9760f7da4dd86cca43ac6423695d6cb0dff4.tar.xz
linux-5e6a9760f7da4dd86cca43ac6423695d6cb0dff4.zip
scsi: smartpqi: add module param for exposure order
Expose physical devices before logical devices. Reviewed-by: Scott Benesh <scott.benesh@microsemi.com> Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com> Signed-off-by: Gilbert Wu <gilbert.wu@microsemi.com> Signed-off-by: Don Brace <don.brace@microsemi.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/smartpqi/smartpqi_init.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index 8fd5ffc55792..4324234aa26c 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -145,6 +145,12 @@ MODULE_PARM_DESC(lockup_action, "Action to take when controller locked up.\n"
"\t\tSupported: none, reboot, panic\n"
"\t\tDefault: none");
+static int pqi_expose_ld_first;
+module_param_named(expose_ld_first,
+ pqi_expose_ld_first, int, 0644);
+MODULE_PARM_DESC(expose_ld_first,
+ "Expose logical drives before physical drives.");
+
static char *raid_levels[] = {
"RAID-0",
"RAID-4",
@@ -1988,6 +1994,8 @@ static int pqi_update_scsi_devices(struct pqi_ctrl_info *ctrl_info)
unsigned int num_valid_devices;
bool is_physical_device;
u8 *scsi3addr;
+ unsigned int physical_index;
+ unsigned int logical_index;
static char *out_of_memory_msg =
"failed to allocate memory, device discovery stopped";
@@ -2050,19 +2058,23 @@ static int pqi_update_scsi_devices(struct pqi_ctrl_info *ctrl_info)
device = NULL;
num_valid_devices = 0;
+ physical_index = 0;
+ logical_index = 0;
for (i = 0; i < num_new_devices; i++) {
- if (i < num_physicals) {
+ if ((!pqi_expose_ld_first && i < num_physicals) ||
+ (pqi_expose_ld_first && i >= num_logicals)) {
is_physical_device = true;
- phys_lun_ext_entry = &physdev_list->lun_entries[i];
+ phys_lun_ext_entry =
+ &physdev_list->lun_entries[physical_index++];
log_lun_ext_entry = NULL;
scsi3addr = phys_lun_ext_entry->lunid;
} else {
is_physical_device = false;
phys_lun_ext_entry = NULL;
log_lun_ext_entry =
- &logdev_list->lun_entries[i - num_physicals];
+ &logdev_list->lun_entries[logical_index++];
scsi3addr = log_lun_ext_entry->lunid;
}