Commit 201a810c authored by Anand Lodnoor's avatar Anand Lodnoor Committed by Martin K. Petersen

scsi: megaraid_sas: Re-Define enum DCMD_RETURN_STATUS

DCMD_INIT is introduced to indicate the initial DCMD status, which was
earlier set to MFI status.  DCMD_BUSY indicates the resource is busy or
locked.

Link: https://lore.kernel.org/r/1579000882-20246-8-git-send-email-anand.lodnoor@broadcom.comSigned-off-by: default avatarShivasharan S <shivasharan.srikanteshwara@broadcom.com>
Signed-off-by: default avatarAnand Lodnoor <anand.lodnoor@broadcom.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent eeb63c23
...@@ -2640,10 +2640,11 @@ enum MEGASAS_OCR_CAUSE { ...@@ -2640,10 +2640,11 @@ enum MEGASAS_OCR_CAUSE {
}; };
enum DCMD_RETURN_STATUS { enum DCMD_RETURN_STATUS {
DCMD_SUCCESS = 0, DCMD_SUCCESS = 0x00,
DCMD_TIMEOUT = 1, DCMD_TIMEOUT = 0x01,
DCMD_FAILED = 2, DCMD_FAILED = 0x02,
DCMD_NOT_FIRED = 3, DCMD_BUSY = 0x03,
DCMD_INIT = 0xff,
}; };
u8 u8
......
...@@ -1099,7 +1099,7 @@ megasas_issue_polled(struct megasas_instance *instance, struct megasas_cmd *cmd) ...@@ -1099,7 +1099,7 @@ megasas_issue_polled(struct megasas_instance *instance, struct megasas_cmd *cmd)
if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) { if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
dev_err(&instance->pdev->dev, "Failed from %s %d\n", dev_err(&instance->pdev->dev, "Failed from %s %d\n",
__func__, __LINE__); __func__, __LINE__);
return DCMD_NOT_FIRED; return DCMD_INIT;
} }
instance->instancet->issue_dcmd(instance, cmd); instance->instancet->issue_dcmd(instance, cmd);
...@@ -1123,19 +1123,19 @@ megasas_issue_blocked_cmd(struct megasas_instance *instance, ...@@ -1123,19 +1123,19 @@ megasas_issue_blocked_cmd(struct megasas_instance *instance,
struct megasas_cmd *cmd, int timeout) struct megasas_cmd *cmd, int timeout)
{ {
int ret = 0; int ret = 0;
cmd->cmd_status_drv = MFI_STAT_INVALID_STATUS; cmd->cmd_status_drv = DCMD_INIT;
if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) { if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
dev_err(&instance->pdev->dev, "Failed from %s %d\n", dev_err(&instance->pdev->dev, "Failed from %s %d\n",
__func__, __LINE__); __func__, __LINE__);
return DCMD_NOT_FIRED; return DCMD_INIT;
} }
instance->instancet->issue_dcmd(instance, cmd); instance->instancet->issue_dcmd(instance, cmd);
if (timeout) { if (timeout) {
ret = wait_event_timeout(instance->int_cmd_wait_q, ret = wait_event_timeout(instance->int_cmd_wait_q,
cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS, timeout * HZ); cmd->cmd_status_drv != DCMD_INIT, timeout * HZ);
if (!ret) { if (!ret) {
dev_err(&instance->pdev->dev, dev_err(&instance->pdev->dev,
"DCMD(opcode: 0x%x) is timed out, func:%s\n", "DCMD(opcode: 0x%x) is timed out, func:%s\n",
...@@ -1144,10 +1144,9 @@ megasas_issue_blocked_cmd(struct megasas_instance *instance, ...@@ -1144,10 +1144,9 @@ megasas_issue_blocked_cmd(struct megasas_instance *instance,
} }
} else } else
wait_event(instance->int_cmd_wait_q, wait_event(instance->int_cmd_wait_q,
cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS); cmd->cmd_status_drv != DCMD_INIT);
return (cmd->cmd_status_drv == MFI_STAT_OK) ? return cmd->cmd_status_drv;
DCMD_SUCCESS : DCMD_FAILED;
} }
/** /**
...@@ -1190,19 +1189,19 @@ megasas_issue_blocked_abort_cmd(struct megasas_instance *instance, ...@@ -1190,19 +1189,19 @@ megasas_issue_blocked_abort_cmd(struct megasas_instance *instance,
cpu_to_le32(upper_32_bits(cmd_to_abort->frame_phys_addr)); cpu_to_le32(upper_32_bits(cmd_to_abort->frame_phys_addr));
cmd->sync_cmd = 1; cmd->sync_cmd = 1;
cmd->cmd_status_drv = MFI_STAT_INVALID_STATUS; cmd->cmd_status_drv = DCMD_INIT;
if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) { if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
dev_err(&instance->pdev->dev, "Failed from %s %d\n", dev_err(&instance->pdev->dev, "Failed from %s %d\n",
__func__, __LINE__); __func__, __LINE__);
return DCMD_NOT_FIRED; return DCMD_INIT;
} }
instance->instancet->issue_dcmd(instance, cmd); instance->instancet->issue_dcmd(instance, cmd);
if (timeout) { if (timeout) {
ret = wait_event_timeout(instance->abort_cmd_wait_q, ret = wait_event_timeout(instance->abort_cmd_wait_q,
cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS, timeout * HZ); cmd->cmd_status_drv != DCMD_INIT, timeout * HZ);
if (!ret) { if (!ret) {
opcode = cmd_to_abort->frame->dcmd.opcode; opcode = cmd_to_abort->frame->dcmd.opcode;
dev_err(&instance->pdev->dev, dev_err(&instance->pdev->dev,
...@@ -1212,13 +1211,12 @@ megasas_issue_blocked_abort_cmd(struct megasas_instance *instance, ...@@ -1212,13 +1211,12 @@ megasas_issue_blocked_abort_cmd(struct megasas_instance *instance,
} }
} else } else
wait_event(instance->abort_cmd_wait_q, wait_event(instance->abort_cmd_wait_q,
cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS); cmd->cmd_status_drv != DCMD_INIT);
cmd->sync_cmd = 0; cmd->sync_cmd = 0;
megasas_return_cmd(instance, cmd); megasas_return_cmd(instance, cmd);
return (cmd->cmd_status_drv == MFI_STAT_OK) ? return cmd->cmd_status_drv;
DCMD_SUCCESS : DCMD_FAILED;
} }
/** /**
...@@ -2736,7 +2734,7 @@ static int megasas_wait_for_outstanding(struct megasas_instance *instance) ...@@ -2736,7 +2734,7 @@ static int megasas_wait_for_outstanding(struct megasas_instance *instance)
"reset queue\n", "reset queue\n",
reset_cmd); reset_cmd);
reset_cmd->cmd_status_drv = MFI_STAT_INVALID_STATUS; reset_cmd->cmd_status_drv = DCMD_INIT;
instance->instancet->fire_cmd(instance, instance->instancet->fire_cmd(instance,
reset_cmd->frame_phys_addr, reset_cmd->frame_phys_addr,
0, instance->reg_set); 0, instance->reg_set);
...@@ -3441,7 +3439,11 @@ static void ...@@ -3441,7 +3439,11 @@ static void
megasas_complete_int_cmd(struct megasas_instance *instance, megasas_complete_int_cmd(struct megasas_instance *instance,
struct megasas_cmd *cmd) struct megasas_cmd *cmd)
{ {
cmd->cmd_status_drv = cmd->frame->io.cmd_status; if (cmd->cmd_status_drv == DCMD_INIT)
cmd->cmd_status_drv =
(cmd->frame->io.cmd_status == MFI_STAT_OK) ?
DCMD_SUCCESS : DCMD_FAILED;
wake_up(&instance->int_cmd_wait_q); wake_up(&instance->int_cmd_wait_q);
} }
...@@ -3460,7 +3462,7 @@ megasas_complete_abort(struct megasas_instance *instance, ...@@ -3460,7 +3462,7 @@ megasas_complete_abort(struct megasas_instance *instance,
{ {
if (cmd->sync_cmd) { if (cmd->sync_cmd) {
cmd->sync_cmd = 0; cmd->sync_cmd = 0;
cmd->cmd_status_drv = 0; cmd->cmd_status_drv = DCMD_SUCCESS;
wake_up(&instance->abort_cmd_wait_q); wake_up(&instance->abort_cmd_wait_q);
} }
} }
...@@ -3736,7 +3738,7 @@ megasas_issue_pending_cmds_again(struct megasas_instance *instance) ...@@ -3736,7 +3738,7 @@ megasas_issue_pending_cmds_again(struct megasas_instance *instance)
dev_notice(&instance->pdev->dev, "%p synchronous cmd" dev_notice(&instance->pdev->dev, "%p synchronous cmd"
"on the internal reset queue," "on the internal reset queue,"
"issue it again.\n", cmd); "issue it again.\n", cmd);
cmd->cmd_status_drv = MFI_STAT_INVALID_STATUS; cmd->cmd_status_drv = DCMD_INIT;
instance->instancet->fire_cmd(instance, instance->instancet->fire_cmd(instance,
cmd->frame_phys_addr, cmd->frame_phys_addr,
0, instance->reg_set); 0, instance->reg_set);
...@@ -8072,6 +8074,7 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance, ...@@ -8072,6 +8074,7 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
dma_addr_t sense_handle; dma_addr_t sense_handle;
unsigned long *sense_ptr; unsigned long *sense_ptr;
u32 opcode = 0; u32 opcode = 0;
int ret = DCMD_SUCCESS;
memset(kbuff_arr, 0, sizeof(kbuff_arr)); memset(kbuff_arr, 0, sizeof(kbuff_arr));
...@@ -8212,13 +8215,18 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance, ...@@ -8212,13 +8215,18 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
* cmd to the SCSI mid-layer * cmd to the SCSI mid-layer
*/ */
cmd->sync_cmd = 1; cmd->sync_cmd = 1;
if (megasas_issue_blocked_cmd(instance, cmd, 0) == DCMD_NOT_FIRED) {
ret = megasas_issue_blocked_cmd(instance, cmd, 0);
switch (ret) {
case DCMD_INIT:
case DCMD_BUSY:
cmd->sync_cmd = 0; cmd->sync_cmd = 0;
dev_err(&instance->pdev->dev, dev_err(&instance->pdev->dev,
"return -EBUSY from %s %d cmd 0x%x opcode 0x%x cmd->cmd_status_drv 0x%x\n", "return -EBUSY from %s %d cmd 0x%x opcode 0x%x cmd->cmd_status_drv 0x%x\n",
__func__, __LINE__, cmd->frame->hdr.cmd, opcode, __func__, __LINE__, cmd->frame->hdr.cmd, opcode,
cmd->cmd_status_drv); cmd->cmd_status_drv);
return -EBUSY; error = -EBUSY;
goto out;
} }
cmd->sync_cmd = 0; cmd->sync_cmd = 0;
......
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