|
|
@@ -5218,7 +5218,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;
|
|
|
@@ -5226,6 +5226,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;
|
|
|
|
|
|
@@ -5274,19 +5275,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);
|