Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3263f786 authored by Shivasharan S's avatar Shivasharan S Committed by Greg Kroah-Hartman
Browse files

scsi: megaraid_sas: Add check for reset adapter bit



[ 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: default avatarSumit Saxena <sumit.saxena@broadcom.com>
Signed-off-by: default avatarShivasharan S <shivasharan.srikanteshwara@broadcom.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent dc4e3ec9
Loading
Loading
Loading
Loading
+22 −11
Original line number Diff line number Diff line
@@ -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,6 +5275,13 @@ static int megasas_init_fw(struct megasas_instance *instance)
	}

	if (megasas_transition_to_ready(instance, 0)) {
		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;
		}

		if (do_adp_reset) {
			atomic_set(&instance->fw_reset_no_pci_access, 1);
			instance->instancet->adp_reset
				(instance, instance->reg_set);
@@ -5282,11 +5290,14 @@ static int megasas_init_fw(struct megasas_instance *instance)
				 "FW restarted successfully from %s!\n",
				 __func__);

		/*waitting for about 30 second before retry*/
			/*waiting for about 30 second before retry*/
			ssleep(30);

			if (megasas_transition_to_ready(instance, 0))
				goto fail_ready_state;
		} else {
			goto fail_ready_state;
		}
	}

	megasas_init_ctrl_params(instance);