scsi: megaraid_sas: Do not set HBA Operational if FW is not in operational state
authorAnand Lodnoor <anand.lodnoor@broadcom.com>
Tue, 14 Jan 2020 11:21:17 +0000 (16:51 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 16 Jan 2020 04:21:03 +0000 (23:21 -0500)
After issuing a adapter reset, driver blindly used to set adprecovery flag
to OPERATIONAL state.  Add a check to see if the FW is operational before
setting the flag and marking reset adapter successful.

Link: https://lore.kernel.org/r/1579000882-20246-7-git-send-email-anand.lodnoor@broadcom.com
Signed-off-by: Shivasharan S <shivasharan.srikanteshwara@broadcom.com>
Signed-off-by: Anand Lodnoor <anand.lodnoor@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/megaraid/megaraid_sas_fusion.c

index ef20234660aca1c15f50fc8605184ecfea1b0603..6860fd288d0f5aafb6dbfe83ca40c642037b3730 100644 (file)
@@ -4991,6 +4991,15 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason)
                                megasas_set_dynamic_target_properties(sdev, is_target_prop);
                        }
 
+                       status_reg = instance->instancet->read_fw_status_reg
+                                       (instance);
+                       abs_state = status_reg & MFI_STATE_MASK;
+                       if (abs_state != MFI_STATE_OPERATIONAL) {
+                               dev_info(&instance->pdev->dev,
+                                        "Adapter is not OPERATIONAL, state 0x%x for scsi:%d\n",
+                                        abs_state, instance->host->host_no);
+                               goto out;
+                       }
                        atomic_set(&instance->adprecovery, MEGASAS_HBA_OPERATIONAL);
 
                        dev_info(&instance->pdev->dev,