Commit 786e898c authored by Raghava Aditya Renukunta's avatar Raghava Aditya Renukunta Committed by Martin K. Petersen
Browse files

scsi: aacraid: Enable ctrl reset for both hba and arc



Make sure that IOP and SOFT reset are enabled for both for both arc and
hba1000 controllers.

Signed-off-by: default avatarRaghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>
Reviewed-by: default avatarDavid Carroll <david.carroll@microsemi.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 8c41b9b7
Loading
Loading
Loading
Loading
+40 −37
Original line number Diff line number Diff line
@@ -828,6 +828,11 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
	u32 bus, cid;
	int ret = FAILED;
	int status = 0;
	__le32 supported_options2 = 0;
	bool is_mu_reset;
	bool is_ignore_reset;
	bool is_doorbell_reset;


	bus = aac_logical_to_phys(scmd_channel(cmd));
	cid = scmd_id(cmd);
@@ -900,9 +905,9 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
			msleep(1000);
		}

		if (ret != SUCCESS)
			pr_err("%s: Host adapter reset request timed out\n",
			AAC_DRIVERNAME);
		if (ret == SUCCESS)
			goto out;

	} else {

		/* Mark the assoc. FIB to not complete, eh handler does this */
@@ -918,44 +923,42 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
				cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
			}
		}
	}

		pr_err("%s: Host adapter reset request. SCSI hang ?\n",
					AAC_DRIVERNAME);
	pr_err("%s: Host adapter reset request. SCSI hang ?\n", AAC_DRIVERNAME);

	/*
	 * Check the health of the controller
	 */
	status = aac_adapter_check_health(aac);
	if (status)
			dev_err(&aac->pdev->dev, "Adapter health - %d\n",
									status);
		dev_err(&aac->pdev->dev, "Adapter health - %d\n", status);

	count = get_num_of_incomplete_fibs(aac);
	if (count == 0)
		return SUCCESS;

	/*
	 * Check if reset is supported by the firmware
	 */
	supported_options2 = aac->supplement_adapter_info.supported_options2;
	is_mu_reset = supported_options2 & AAC_OPTION_MU_RESET;
	is_doorbell_reset = supported_options2 & AAC_OPTION_DOORBELL_RESET;
	is_ignore_reset = supported_options2 & AAC_OPTION_IGNORE_RESET;
	/*
	 * This adapter needs a blind reset, only do so for
	 * Adapters that support a register, instead of a commanded,
	 * reset.
	 */
		if (((aac->supplement_adapter_info.supported_options2 &
			  AAC_OPTION_MU_RESET) ||
			  (aac->supplement_adapter_info.supported_options2 &
			  AAC_OPTION_DOORBELL_RESET)) &&
			  aac_check_reset &&
			  ((aac_check_reset != 1) ||
			   !(aac->supplement_adapter_info.supported_options2 &
			    AAC_OPTION_IGNORE_RESET))) {
	if ((is_mu_reset || is_doorbell_reset)
	 && aac_check_reset
	 && (aac_check_reset != -1 || !is_ignore_reset)) {
		/* Bypass wait for command quiesce */
		aac_reset_adapter(aac, 2, IOP_HWSOFT_RESET);
	}
	ret = SUCCESS;
	}
	/*
	 * Cause an immediate retry of the command with a ten second delay
	 * after successful tur
	 */

out:
	return ret;
}