scsi: megaraid_sas: Rework code to get PD and LD list
authorShivasharan S <shivasharan.srikanteshwara@broadcom.com>
Tue, 29 Jan 2019 09:38:12 +0000 (01:38 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 5 Feb 2019 03:52:20 +0000 (22:52 -0500)
During FW init, combine the code to get the PD and LD list from FW into a
single function.  This patch is in preparation for adding support for
HOST_DEVICE_LIST DCMD.

Signed-off-by: Shivasharan S <shivasharan.srikanteshwara@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/megaraid/megaraid_sas_base.c

index f7bdd783360a96648def64add2d38f8181414d3d..8cd84abcce2bf1a97da0272478d4b206c3daf068 100644 (file)
@@ -5319,6 +5319,33 @@ fallback:
                instance->reply_map[cpu] = cpu % instance->msix_vectors;
 }
 
+/**
+ * megasas_get_device_list -   Get the PD and LD device list from FW.
+ * @instance:                  Adapter soft state
+ * @return:                    Success or failure
+ *
+ * Issue DCMDs to Firmware to get the PD and LD list.
+ */
+static
+int megasas_get_device_list(struct megasas_instance *instance)
+{
+       memset(instance->pd_list, 0,
+              (MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
+       memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
+
+       if (megasas_get_pd_list(instance) < 0) {
+               dev_err(&instance->pdev->dev, "failed to get PD list\n");
+               return FAILED;
+       }
+
+       if (megasas_ld_list_query(instance,
+                                 MR_LD_QUERY_TYPE_EXPOSED_TO_HOST)) {
+               dev_err(&instance->pdev->dev, "failed to get LD list\n");
+               return FAILED;
+       }
+
+       return SUCCESS;
+}
 /**
  * megasas_init_fw -   Initializes the FW
  * @instance:          Adapter soft state
@@ -5571,18 +5598,13 @@ static int megasas_init_fw(struct megasas_instance *instance)
 
        megasas_setup_jbod_map(instance);
 
-       /** for passthrough
-        * the following function will get the PD LIST.
-        */
-       memset(instance->pd_list, 0,
-               (MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
-       if (megasas_get_pd_list(instance) < 0) {
-               dev_err(&instance->pdev->dev, "failed to get PD list\n");
+       if (megasas_get_device_list(instance) != SUCCESS) {
+               dev_err(&instance->pdev->dev,
+                       "%s: megasas_get_device_list failed\n",
+                       __func__);
                goto fail_get_ld_pd_list;
        }
 
-       memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
-
        /* stream detection initialization */
        if (instance->adapter_type >= VENTURA_SERIES) {
                fusion->stream_detect_by_ld =
@@ -5612,10 +5634,6 @@ static int megasas_init_fw(struct megasas_instance *instance)
                }
        }
 
-       if (megasas_ld_list_query(instance,
-                                 MR_LD_QUERY_TYPE_EXPOSED_TO_HOST))
-               goto fail_get_ld_pd_list;
-
        /*
         * Compute the max allowed sectors per IO: The controller info has two
         * limits on max sectors. Driver should use the minimum of these two.