mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
megaraid_sas: SPERC OCR changes
This patch fixes online controller resets on SRIOV-enabled series of Avago controllers. 1) Remove late detection heartbeat. 2) Change in the behavior if the FW found in READY/OPERATIONAL state. Signed-off-by: Uday Lingala <uday.lingala@avagotech.com> Signed-off-by: Sumit Saxena <sumit.saxena@avagotech.com> Reviewed-by: Tomas Henzl <thenzl@redhat.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
e3d178ca77
commit
3885c26b77
1 changed files with 16 additions and 57 deletions
|
@ -3462,52 +3462,7 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason)
|
||||||
/* Let SR-IOV VF & PF sync up if there was a HB failure */
|
/* Let SR-IOV VF & PF sync up if there was a HB failure */
|
||||||
if (instance->requestorId && !reason) {
|
if (instance->requestorId && !reason) {
|
||||||
msleep(MEGASAS_OCR_SETTLE_TIME_VF);
|
msleep(MEGASAS_OCR_SETTLE_TIME_VF);
|
||||||
/* Look for a late HB update after VF settle time */
|
goto transition_to_ready;
|
||||||
if (abs_state == MFI_STATE_OPERATIONAL &&
|
|
||||||
(instance->hb_host_mem->HB.fwCounter !=
|
|
||||||
instance->hb_host_mem->HB.driverCounter)) {
|
|
||||||
instance->hb_host_mem->HB.driverCounter =
|
|
||||||
instance->hb_host_mem->HB.fwCounter;
|
|
||||||
dev_warn(&instance->pdev->dev, "SR-IOV:"
|
|
||||||
"Late FW heartbeat update for "
|
|
||||||
"scsi%d.\n",
|
|
||||||
instance->host->host_no);
|
|
||||||
} else {
|
|
||||||
/* In VF mode, first poll for FW ready */
|
|
||||||
for (i = 0;
|
|
||||||
i < (MEGASAS_RESET_WAIT_TIME * 1000);
|
|
||||||
i += 20) {
|
|
||||||
status_reg =
|
|
||||||
instance->instancet->
|
|
||||||
read_fw_status_reg(
|
|
||||||
instance->reg_set);
|
|
||||||
abs_state = status_reg &
|
|
||||||
MFI_STATE_MASK;
|
|
||||||
if (abs_state == MFI_STATE_READY) {
|
|
||||||
dev_warn(&instance->pdev->dev,
|
|
||||||
"SR-IOV: FW was found"
|
|
||||||
"to be in ready state "
|
|
||||||
"for scsi%d.\n",
|
|
||||||
instance->host->host_no);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
msleep(20);
|
|
||||||
}
|
|
||||||
if (abs_state != MFI_STATE_READY) {
|
|
||||||
dev_warn(&instance->pdev->dev, "SR-IOV: "
|
|
||||||
"FW not in ready state after %d"
|
|
||||||
" seconds for scsi%d, status_reg = "
|
|
||||||
"0x%x.\n",
|
|
||||||
MEGASAS_RESET_WAIT_TIME,
|
|
||||||
instance->host->host_no,
|
|
||||||
status_reg);
|
|
||||||
megaraid_sas_kill_hba(instance);
|
|
||||||
instance->skip_heartbeat_timer_del = 1;
|
|
||||||
atomic_set(&instance->adprecovery, MEGASAS_HW_CRITICAL_ERROR);
|
|
||||||
retval = FAILED;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now try to reset the chip */
|
/* Now try to reset the chip */
|
||||||
|
@ -3516,25 +3471,28 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason)
|
||||||
if (instance->instancet->adp_reset
|
if (instance->instancet->adp_reset
|
||||||
(instance, instance->reg_set))
|
(instance, instance->reg_set))
|
||||||
continue;
|
continue;
|
||||||
|
transition_to_ready:
|
||||||
/* Wait for FW to become ready */
|
/* Wait for FW to become ready */
|
||||||
if (megasas_transition_to_ready(instance, 1)) {
|
if (megasas_transition_to_ready(instance, 1)) {
|
||||||
dev_warn(&instance->pdev->dev, "Failed to "
|
dev_warn(&instance->pdev->dev,
|
||||||
"transition controller to ready "
|
"Failed to transition controller to ready for "
|
||||||
"for scsi%d.\n",
|
"scsi%d.\n", instance->host->host_no);
|
||||||
instance->host->host_no);
|
if (instance->requestorId && !reason)
|
||||||
continue;
|
goto fail_kill_adapter;
|
||||||
|
else
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
megasas_reset_reply_desc(instance);
|
megasas_reset_reply_desc(instance);
|
||||||
megasas_fusion_update_can_queue(instance, OCR_CONTEXT);
|
megasas_fusion_update_can_queue(instance, OCR_CONTEXT);
|
||||||
|
|
||||||
if (megasas_ioc_init_fusion(instance)) {
|
if (megasas_ioc_init_fusion(instance)) {
|
||||||
dev_warn(&instance->pdev->dev,
|
dev_warn(&instance->pdev->dev,
|
||||||
"megasas_ioc_init_fusion() failed!"
|
"megasas_ioc_init_fusion() failed! for "
|
||||||
" for scsi%d\n",
|
"scsi%d\n", instance->host->host_no);
|
||||||
instance->host->host_no);
|
if (instance->requestorId && !reason)
|
||||||
continue;
|
goto fail_kill_adapter;
|
||||||
|
else
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
megasas_refire_mgmt_cmd(instance);
|
megasas_refire_mgmt_cmd(instance);
|
||||||
|
@ -3591,6 +3549,7 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason)
|
||||||
retval = SUCCESS;
|
retval = SUCCESS;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
fail_kill_adapter:
|
||||||
/* Reset failed, kill the adapter */
|
/* Reset failed, kill the adapter */
|
||||||
dev_warn(&instance->pdev->dev, "Reset failed, killing "
|
dev_warn(&instance->pdev->dev, "Reset failed, killing "
|
||||||
"adapter scsi%d.\n", instance->host->host_no);
|
"adapter scsi%d.\n", instance->host->host_no);
|
||||||
|
|
Loading…
Reference in a new issue