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

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
......@@ -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;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment