mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 03:10:12 +00:00
megaraid_sas : Add separate function for refiring MFI commands
This patch will add separate function for refiring MFI commands in Fusion adapters's OCR code. Signed-off-by: Kashyap Desai <kashyap.desai@avagotech.com> Signed-off-by: Sumit Saxena <sumit.saxena@avagotech.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: James Bottomley <JBottomley@Odin.com>
This commit is contained in:
parent
d3557fc8be
commit
9b82818286
1 changed files with 39 additions and 41 deletions
|
@ -2511,6 +2511,43 @@ void megasas_reset_reply_desc(struct megasas_instance *instance)
|
||||||
reply_desc->Words = ULLONG_MAX;
|
reply_desc->Words = ULLONG_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* megasas_refire_mgmt_cmd : Re-fire management commands
|
||||||
|
* @instance: Controller's soft instance
|
||||||
|
*/
|
||||||
|
void megasas_refire_mgmt_cmd(struct megasas_instance *instance)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
struct megasas_cmd_fusion *cmd_fusion;
|
||||||
|
struct fusion_context *fusion;
|
||||||
|
struct megasas_cmd *cmd_mfi;
|
||||||
|
union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc;
|
||||||
|
u16 smid;
|
||||||
|
|
||||||
|
fusion = instance->ctrl_context;
|
||||||
|
|
||||||
|
/* Re-fire management commands.
|
||||||
|
* Do not traverse complet MPT frame pool. Start from max_scsi_cmds.
|
||||||
|
*/
|
||||||
|
for (j = instance->max_scsi_cmds ; j < instance->max_fw_cmds; j++) {
|
||||||
|
cmd_fusion = fusion->cmd_list[j];
|
||||||
|
cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx];
|
||||||
|
smid = le16_to_cpu(cmd_mfi->context.smid);
|
||||||
|
|
||||||
|
if (!smid)
|
||||||
|
continue;
|
||||||
|
req_desc = megasas_get_request_descriptor
|
||||||
|
(instance, smid - 1);
|
||||||
|
if (req_desc && (cmd_mfi->frame->dcmd.opcode !=
|
||||||
|
cpu_to_le32(MR_DCMD_LD_MAP_GET_INFO))) {
|
||||||
|
instance->instancet->fire_cmd(instance,
|
||||||
|
req_desc->u.low, req_desc->u.high,
|
||||||
|
instance->reg_set);
|
||||||
|
} else
|
||||||
|
megasas_return_cmd(instance, cmd_mfi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Check for a second path that is currently UP */
|
/* Check for a second path that is currently UP */
|
||||||
int megasas_check_mpio_paths(struct megasas_instance *instance,
|
int megasas_check_mpio_paths(struct megasas_instance *instance,
|
||||||
struct scsi_cmnd *scmd)
|
struct scsi_cmnd *scmd)
|
||||||
|
@ -2538,12 +2575,10 @@ int megasas_check_mpio_paths(struct megasas_instance *instance,
|
||||||
/* Core fusion reset function */
|
/* Core fusion reset function */
|
||||||
int megasas_reset_fusion(struct Scsi_Host *shost, int iotimeout)
|
int megasas_reset_fusion(struct Scsi_Host *shost, int iotimeout)
|
||||||
{
|
{
|
||||||
int retval = SUCCESS, i, j, retry = 0, convert = 0;
|
int retval = SUCCESS, i, retry = 0, convert = 0;
|
||||||
struct megasas_instance *instance;
|
struct megasas_instance *instance;
|
||||||
struct megasas_cmd_fusion *cmd_fusion;
|
struct megasas_cmd_fusion *cmd_fusion;
|
||||||
struct fusion_context *fusion;
|
struct fusion_context *fusion;
|
||||||
struct megasas_cmd *cmd_mfi;
|
|
||||||
union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc;
|
|
||||||
u32 host_diag, abs_state, status_reg, reset_adapter;
|
u32 host_diag, abs_state, status_reg, reset_adapter;
|
||||||
u32 io_timeout_in_crash_mode = 0;
|
u32 io_timeout_in_crash_mode = 0;
|
||||||
|
|
||||||
|
@ -2790,44 +2825,7 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int iotimeout)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Re-fire management commands */
|
megasas_refire_mgmt_cmd(instance);
|
||||||
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 ==
|
|
||||||
cpu_to_le32(MR_DCMD_LD_MAP_GET_INFO)) {
|
|
||||||
megasas_return_mfi_mpt_pthr(instance, cmd_mfi, cmd_fusion);
|
|
||||||
} else {
|
|
||||||
req_desc =
|
|
||||||
megasas_get_request_descriptor(
|
|
||||||
instance,
|
|
||||||
cmd_mfi->context.smid
|
|
||||||
-1);
|
|
||||||
if (!req_desc) {
|
|
||||||
printk(KERN_WARNING
|
|
||||||
"req_desc NULL"
|
|
||||||
" for scsi%d\n",
|
|
||||||
instance->host->host_no);
|
|
||||||
/* Return leaked MPT
|
|
||||||
frame */
|
|
||||||
megasas_return_cmd_fusion(instance, cmd_fusion);
|
|
||||||
} else {
|
|
||||||
instance->instancet->
|
|
||||||
fire_cmd(instance,
|
|
||||||
req_desc->
|
|
||||||
u.low,
|
|
||||||
req_desc->
|
|
||||||
u.high,
|
|
||||||
instance->
|
|
||||||
reg_set);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (megasas_get_ctrl_info(instance)) {
|
if (megasas_get_ctrl_info(instance)) {
|
||||||
dev_info(&instance->pdev->dev,
|
dev_info(&instance->pdev->dev,
|
||||||
|
|
Loading…
Reference in a new issue