]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
scsi: megaraid_sas: Add check for reset adapter bit
authorShivasharan S <shivasharan.srikanteshwara@broadcom.com>
Wed, 17 Oct 2018 06:37:42 +0000 (23:37 -0700)
committerKhalid Elmously <khalid.elmously@canonical.com>
Thu, 26 Sep 2019 04:34:52 +0000 (00:34 -0400)
BugLink: https://bugs.launchpad.net/bugs/1844558
[ Upstream commit de93b40d98ead27ee2f7f7df93fdd4914a6c8d8d ]

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.saxena@broadcom.com>
Signed-off-by: Shivasharan S <shivasharan.srikanteshwara@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/scsi/megaraid/megaraid_sas_base.c

index 905e9465faa9b20613dde1fb5f3038e70ccdb2fd..87540daf208041d3f77e83dedadf7c356874206a 100644 (file)
@@ -5175,7 +5175,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;
@@ -5183,6 +5183,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;
 
@@ -5231,19 +5232,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__);
+
+                       /*waiting 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);