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: Raghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>
Reviewed-by: David Carroll <david.carroll@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Raghava Aditya Renukunta 2017-05-10 09:39:50 -07:00 committed by Martin K. Petersen
parent 8c41b9b798
commit 786e898c86
1 changed files with 41 additions and 38 deletions

View File

@ -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;
}