scsi: megaraid_sas: re-work DCMD refire code
No functional changes. This patch is a re-work of DCMD refire code to better manage all the different cases to decide whether to REFIRE or SKIP or COMPLETE certain DCMD. Signed-off-by: Sumit Saxena <sumit.saxena@broadcom.com> Signed-off-by: Shivasharan S <shivasharan.srikanteshwara@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
88d155c61a
commit
54b28049ac
|
@ -4694,10 +4694,12 @@ megasas_get_ctrl_info(struct megasas_instance *instance)
|
||||||
sizeof(struct megasas_ctrl_info));
|
sizeof(struct megasas_ctrl_info));
|
||||||
|
|
||||||
if ((instance->adapter_type != MFI_SERIES) &&
|
if ((instance->adapter_type != MFI_SERIES) &&
|
||||||
!instance->mask_interrupts)
|
!instance->mask_interrupts) {
|
||||||
ret = megasas_issue_blocked_cmd(instance, cmd, MFI_IO_TIMEOUT_SECS);
|
ret = megasas_issue_blocked_cmd(instance, cmd, MFI_IO_TIMEOUT_SECS);
|
||||||
else
|
} else {
|
||||||
ret = megasas_issue_polled(instance, cmd);
|
ret = megasas_issue_polled(instance, cmd);
|
||||||
|
cmd->flags |= DRV_DCMD_SKIP_REFIRE;
|
||||||
|
}
|
||||||
|
|
||||||
switch (ret) {
|
switch (ret) {
|
||||||
case DCMD_SUCCESS:
|
case DCMD_SUCCESS:
|
||||||
|
|
|
@ -3957,6 +3957,8 @@ void megasas_refire_mgmt_cmd(struct megasas_instance *instance)
|
||||||
union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc;
|
union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc;
|
||||||
u16 smid;
|
u16 smid;
|
||||||
bool refire_cmd = 0;
|
bool refire_cmd = 0;
|
||||||
|
u8 result;
|
||||||
|
u32 opcode = 0;
|
||||||
|
|
||||||
fusion = instance->ctrl_context;
|
fusion = instance->ctrl_context;
|
||||||
|
|
||||||
|
@ -3967,29 +3969,47 @@ void megasas_refire_mgmt_cmd(struct megasas_instance *instance)
|
||||||
cmd_fusion = fusion->cmd_list[j];
|
cmd_fusion = fusion->cmd_list[j];
|
||||||
cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx];
|
cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx];
|
||||||
smid = le16_to_cpu(cmd_mfi->context.smid);
|
smid = le16_to_cpu(cmd_mfi->context.smid);
|
||||||
|
result = REFIRE_CMD;
|
||||||
|
|
||||||
if (!smid)
|
if (!smid)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Do not refire shutdown command */
|
req_desc = megasas_get_request_descriptor(instance, smid - 1);
|
||||||
if (le32_to_cpu(cmd_mfi->frame->dcmd.opcode) ==
|
|
||||||
MR_DCMD_CTRL_SHUTDOWN) {
|
switch (cmd_mfi->frame->hdr.cmd) {
|
||||||
cmd_mfi->frame->dcmd.cmd_status = MFI_STAT_OK;
|
case MFI_CMD_DCMD:
|
||||||
megasas_complete_cmd(instance, cmd_mfi, DID_OK);
|
opcode = le32_to_cpu(cmd_mfi->frame->dcmd.opcode);
|
||||||
continue;
|
/* Do not refire shutdown command */
|
||||||
|
if (opcode == MR_DCMD_CTRL_SHUTDOWN) {
|
||||||
|
cmd_mfi->frame->dcmd.cmd_status = MFI_STAT_OK;
|
||||||
|
result = COMPLETE_CMD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
refire_cmd = ((opcode != MR_DCMD_LD_MAP_GET_INFO)) &&
|
||||||
|
(opcode != MR_DCMD_SYSTEM_PD_MAP_GET_INFO) &&
|
||||||
|
!(cmd_mfi->flags & DRV_DCMD_SKIP_REFIRE);
|
||||||
|
|
||||||
|
if (!refire_cmd)
|
||||||
|
result = RETURN_CMD;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
req_desc = megasas_get_request_descriptor
|
switch (result) {
|
||||||
(instance, smid - 1);
|
case REFIRE_CMD:
|
||||||
refire_cmd = req_desc && ((cmd_mfi->frame->dcmd.opcode !=
|
|
||||||
cpu_to_le32(MR_DCMD_LD_MAP_GET_INFO)) &&
|
|
||||||
(cmd_mfi->frame->dcmd.opcode !=
|
|
||||||
cpu_to_le32(MR_DCMD_SYSTEM_PD_MAP_GET_INFO)))
|
|
||||||
&& !(cmd_mfi->flags & DRV_DCMD_SKIP_REFIRE);
|
|
||||||
if (refire_cmd)
|
|
||||||
megasas_fire_cmd_fusion(instance, req_desc);
|
megasas_fire_cmd_fusion(instance, req_desc);
|
||||||
else
|
break;
|
||||||
|
case RETURN_CMD:
|
||||||
megasas_return_cmd(instance, cmd_mfi);
|
megasas_return_cmd(instance, cmd_mfi);
|
||||||
|
break;
|
||||||
|
case COMPLETE_CMD:
|
||||||
|
megasas_complete_cmd(instance, cmd_mfi, DID_OK);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4629,8 +4649,6 @@ transition_to_ready:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
megasas_refire_mgmt_cmd(instance);
|
|
||||||
|
|
||||||
if (megasas_get_ctrl_info(instance)) {
|
if (megasas_get_ctrl_info(instance)) {
|
||||||
dev_info(&instance->pdev->dev,
|
dev_info(&instance->pdev->dev,
|
||||||
"Failed from %s %d\n",
|
"Failed from %s %d\n",
|
||||||
|
@ -4639,6 +4657,9 @@ transition_to_ready:
|
||||||
retval = FAILED;
|
retval = FAILED;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
megasas_refire_mgmt_cmd(instance);
|
||||||
|
|
||||||
/* Reset load balance info */
|
/* Reset load balance info */
|
||||||
if (fusion->load_balance_info)
|
if (fusion->load_balance_info)
|
||||||
memset(fusion->load_balance_info, 0,
|
memset(fusion->load_balance_info, 0,
|
||||||
|
|
|
@ -1344,6 +1344,12 @@ union desc_value {
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum CMD_RET_VALUES {
|
||||||
|
REFIRE_CMD = 1,
|
||||||
|
COMPLETE_CMD = 2,
|
||||||
|
RETURN_CMD = 3,
|
||||||
|
};
|
||||||
|
|
||||||
void megasas_free_cmds_fusion(struct megasas_instance *instance);
|
void megasas_free_cmds_fusion(struct megasas_instance *instance);
|
||||||
int megasas_ioc_init_fusion(struct megasas_instance *instance);
|
int megasas_ioc_init_fusion(struct megasas_instance *instance);
|
||||||
u8 megasas_get_map_info(struct megasas_instance *instance);
|
u8 megasas_get_map_info(struct megasas_instance *instance);
|
||||||
|
|
Loading…
Reference in New Issue