Hannes:
We have already worked on "wait_event" usage in "megasas_issue_blocked_cmd".
That code will be posted by LSI once we received test result from LSI Q/A team.
If you see the current OCR code in Linux Driver we do "re-send the IOCTL
command".
MR product does not want IOCTL timeout due to some reason. That is why even if
FW faulted, Driver will do OCR and re-send all existing <Management commands>
(IOCTL comes under management commands).
Just for info. (see below snippet in OCR code)
/* Re-fire management commands */
for (j = 0 ; j < instance->max_fw_cmds; j++) {
cmd_fusion = fusion->cmd_list[j];
if (cmd_fusion->sync_cmd_idx != (u32)ULONG_MAX)
{
cmd_mfi =
instance->cmd_list[cmd_fusion->sync_cmd_idx];
if (cmd_mfi->frame->dcmd.opcode ==
MR_DCMD_LD_MAP_GET_INFO) {
megasas_return_cmd(instance,
cmd_mfi);
megasas_return_cmd_fusion(instance, cmd_fusion);
Current <MR> Driver is not designed to add <timeout> for DCMD and IOCTL path. [
I added timeout only for limited DCMDs, which are harmless to continue after
timeout ]
As of now, you can skip this patch and we will be submitting patch to fix
similar issue.
But note, we cannot add complete "wait_event_timeout" due to day-1 design, but
will try to cover wait_event_timout for some valid cases.
` Kashyap
> -----Original Message-----
> From: Hannes Reinecke [mailto:[email protected]]
> Sent: Thursday, January 16, 2014 3:56 PM
> To: James Bottomley
> Cc: [email protected]; Hannes Reinecke; Desai, Kashyap; Adam
> Radford
> Subject: [PATCH 1/6] megaraid_sas: Do not wait forever
>
> If the firmware is incommunicado for whatever reason the driver will wait
> forever during initialisation, causing all sorts of hangcheck timers to
> trigger.
> We should rather wait for a defined time, and give up on the command if no
> response was received.
>
> Cc: Kashyap Desai <[email protected]>
> Cc: Adam Radford <[email protected]>
> Signed-off-by: Hannes Reinecke <[email protected]>
> ---
> drivers/scsi/megaraid/megaraid_sas_base.c | 43 ++++++++++++++++++----
> ---------
> 1 file changed, 25 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c
> b/drivers/scsi/megaraid/megaraid_sas_base.c
> index 3b7ad10..95d4e5c 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_base.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
> @@ -911,9 +911,11 @@ megasas_issue_blocked_cmd(struct
> megasas_instance *instance,
>
> instance->instancet->issue_dcmd(instance, cmd);
>
> - wait_event(instance->int_cmd_wait_q, cmd->cmd_status !=
> ENODATA);
> + wait_event_timeout(instance->int_cmd_wait_q,
> + cmd->cmd_status != ENODATA,
> + MEGASAS_INTERNAL_CMD_WAIT_TIME * HZ);
>
> - return 0;
> + return cmd->cmd_status == ENODATA ? -ENODATA : 0;
> }
>
> /**
> @@ -932,11 +934,12 @@ megasas_issue_blocked_abort_cmd(struct
> megasas_instance *instance, {
> struct megasas_cmd *cmd;
> struct megasas_abort_frame *abort_fr;
> + int status;
>
> cmd = megasas_get_cmd(instance);
>
> if (!cmd)
> - return -1;
> + return -ENOMEM;
>
> abort_fr = &cmd->frame->abort;
>
> @@ -960,11 +963,14 @@ megasas_issue_blocked_abort_cmd(struct
> megasas_instance *instance,
> /*
> * Wait for this cmd to complete
> */
> - wait_event(instance->abort_cmd_wait_q, cmd->cmd_status !=
> 0xFF);
> + wait_event_timeout(instance->abort_cmd_wait_q,
> + cmd->cmd_status != 0xFF,
> + MEGASAS_INTERNAL_CMD_WAIT_TIME * HZ);
> cmd->sync_cmd = 0;
> + status = cmd->cmd_status;
>
> megasas_return_cmd(instance, cmd);
> - return 0;
> + return status == 0xFF ? -ENODATA : 0;
> }
>
> /**
> @@ -3902,6 +3908,7 @@ megasas_get_seq_num(struct megasas_instance
> *instance,
> struct megasas_dcmd_frame *dcmd;
> struct megasas_evt_log_info *el_info;
> dma_addr_t el_info_h = 0;
> + int rc;
>
> cmd = megasas_get_cmd(instance);
>
> @@ -3933,23 +3940,23 @@ megasas_get_seq_num(struct
> megasas_instance *instance,
> dcmd->sgl.sge32[0].phys_addr = cpu_to_le32(el_info_h);
> dcmd->sgl.sge32[0].length = cpu_to_le32(sizeof(struct
> megasas_evt_log_info));
>
> - megasas_issue_blocked_cmd(instance, cmd);
> -
> - /*
> - * Copy the data back into callers buffer
> - */
> - eli->newest_seq_num = le32_to_cpu(el_info->newest_seq_num);
> - eli->oldest_seq_num = le32_to_cpu(el_info->oldest_seq_num);
> - eli->clear_seq_num = le32_to_cpu(el_info->clear_seq_num);
> - eli->shutdown_seq_num = le32_to_cpu(el_info-
> >shutdown_seq_num);
> - eli->boot_seq_num = le32_to_cpu(el_info->boot_seq_num);
> -
> + rc = megasas_issue_blocked_cmd(instance, cmd);
> + if (!rc) {
> + /*
> + * Copy the data back into callers buffer
> + */
> + eli->newest_seq_num = le32_to_cpu(el_info-
> >newest_seq_num);
> + eli->oldest_seq_num = le32_to_cpu(el_info-
> >oldest_seq_num);
> + eli->clear_seq_num = le32_to_cpu(el_info-
> >clear_seq_num);
> + eli->shutdown_seq_num = le32_to_cpu(el_info-
> >shutdown_seq_num);
> + eli->boot_seq_num = le32_to_cpu(el_info-
> >boot_seq_num);
> + }
> pci_free_consistent(instance->pdev, sizeof(struct
> megasas_evt_log_info),
> el_info, el_info_h);
>
> megasas_return_cmd(instance, cmd);
>
> - return 0;
> + return rc;
> }
>
> /**
> @@ -5045,7 +5052,7 @@ megasas_mgmt_fw_ioctl(struct megasas_instance
> *instance,
> * cmd to the SCSI mid-layer
> */
> cmd->sync_cmd = 1;
> - megasas_issue_blocked_cmd(instance, cmd);
> + error = megasas_issue_blocked_cmd(instance, cmd);
> cmd->sync_cmd = 0;
>
> /*
> --
> 1.7.12.4
>
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html