For SAS3 and later controllers, FW sets the reset adapter bit indicating
the driver to perform a controller reset.
Driver needs to check if this bit is set before doing a reset.
This reduces the driver probe failure time to 180seconds in case there
is a faulty controller connected.

Signed-off-by: Sumit Saxena <sumit.sax...@broadcom.com>
Signed-off-by: Shivasharan S <shivasharan.srikanteshw...@broadcom.com>
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 33 ++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index aefc4c936b60..e8b3d2185692 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5301,7 +5301,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 {
        u32 max_sectors_1;
        u32 max_sectors_2, tmp_sectors, msix_enable;
-       u32 scratch_pad_2, scratch_pad_3, scratch_pad_4;
+       u32 scratch_pad_2, scratch_pad_3, scratch_pad_4, status_reg;
        resource_size_t base_addr;
        struct megasas_register_set __iomem *reg_set;
        struct megasas_ctrl_info *ctrl_info = NULL;
@@ -5309,6 +5309,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
        int i, j, loop, fw_msix_count = 0;
        struct IOV_111 *iovPtr;
        struct fusion_context *fusion;
+       bool do_adp_reset = true;
 
        fusion = instance->ctrl_context;
 
@@ -5357,19 +5358,29 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
        }
 
        if (megasas_transition_to_ready(instance, 0)) {
-               atomic_set(&instance->fw_reset_no_pci_access, 1);
-               instance->instancet->adp_reset
-                       (instance, instance->reg_set);
-               atomic_set(&instance->fw_reset_no_pci_access, 0);
-               dev_info(&instance->pdev->dev,
-                       "FW restarted successfully from %s!\n",
-                       __func__);
+               if (instance->adapter_type >= INVADER_SERIES) {
+                       status_reg = instance->instancet->read_fw_status_reg(
+                                       instance->reg_set);
+                       do_adp_reset = status_reg & MFI_RESET_ADAPTER;
+               }
 
-               /*waitting for about 30 second before retry*/
-               ssleep(30);
+               if (do_adp_reset) {
+                       atomic_set(&instance->fw_reset_no_pci_access, 1);
+                       instance->instancet->adp_reset
+                               (instance, instance->reg_set);
+                       atomic_set(&instance->fw_reset_no_pci_access, 0);
+                       dev_info(&instance->pdev->dev,
+                                "FW restarted successfully from %s!\n",
+                                __func__);
+
+                       /*waitting for about 30 second before retry*/
+                       ssleep(30);
 
-               if (megasas_transition_to_ready(instance, 0))
+                       if (megasas_transition_to_ready(instance, 0))
+                               goto fail_ready_state;
+               } else {
                        goto fail_ready_state;
+               }
        }
 
        megasas_init_ctrl_params(instance);
-- 
2.16.1

Reply via email to