@@ -231,14 +231,20 @@ megasas_clear_intr_fusion(struct megasas_instance *instance)
/**
* megasas_get_cmd_fusion - Get a command from the free pool
* @instance: Adapter soft state
+ * @scmd: SCSI command
+ * @is_raid: true if the command is a RAID1 fastpath command
*
* Returns a blk_tag indexed mpt frame
*/
-inline struct megasas_cmd_fusion *megasas_get_cmd_fusion(struct megasas_instance
- *instance, u32 blk_tag)
+inline struct megasas_cmd_fusion *
+megasas_get_cmd_fusion(struct megasas_instance *instance,
+ struct scsi_cmnd *scmd, bool is_raid)
{
struct fusion_context *fusion;
+ u32 blk_tag = scmd->request->tag;
+ if (is_raid)
+ blk_tag += instance->max_fw_cmds;
fusion = instance->ctrl_context;
return fusion->cmd_list[blk_tag];
}
@@ -3396,7 +3402,7 @@ megasas_build_and_issue_cmd_fusion(struct megasas_instance *instance,
return SCSI_MLQUEUE_HOST_BUSY;
}
- cmd = megasas_get_cmd_fusion(instance, scmd->request->tag);
+ cmd = megasas_get_cmd_fusion(instance, scmd, false);
if (!cmd) {
atomic_dec(&instance->fw_outstanding);
@@ -3436,8 +3442,7 @@ megasas_build_and_issue_cmd_fusion(struct megasas_instance *instance,
* to get new command
*/
if (cmd->r1_alt_dev_handle != MR_DEVHANDLE_INVALID) {
- r1_cmd = megasas_get_cmd_fusion(instance,
- (scmd->request->tag + instance->max_fw_cmds));
+ r1_cmd = megasas_get_cmd_fusion(instance, scmd, true);
megasas_prepare_secondRaid1_IO(instance, cmd, r1_cmd);
}
@@ -3832,7 +3837,7 @@ build_mpt_mfi_pass_thru(struct megasas_instance *instance,
fusion = instance->ctrl_context;
- cmd = megasas_get_cmd_fusion(instance, mfi_cmd->index);
+ cmd = fusion->cmd_list[mfi_cmd->index];
/* Save the smid. To be used for returning the cmd */
mfi_cmd->context.smid = cmd->index;
@@ -4475,7 +4480,7 @@ megasas_issue_tm(struct megasas_instance *instance, u16 device_handle,
return -ENOMEM;
}
- cmd_fusion = megasas_get_cmd_fusion(instance, cmd_mfi->index);
+ cmd_fusion = fusion->cmd_list[cmd_mfi->index];
/* Save the smid. To be used for returning the cmd */
cmd_mfi->context.smid = cmd_fusion->index;
@@ -4578,36 +4583,6 @@ megasas_issue_tm(struct megasas_instance *instance, u16 device_handle,
}
-/*
- * megasas_fusion_smid_lookup : Look for fusion command correpspodning to SCSI
- * @instance: per adapter struct
- *
- * Return Non Zero index, if SMID found in outstanding commands
- */
-static u16 megasas_fusion_smid_lookup(struct scsi_cmnd *scmd)
-{
- int i, ret = 0;
- struct megasas_instance *instance;
- struct megasas_cmd_fusion *cmd_fusion;
- struct fusion_context *fusion;
-
- instance = (struct megasas_instance *)scmd->device->host->hostdata;
-
- fusion = instance->ctrl_context;
-
- for (i = instance->max_mfi_cmds; i < instance->max_fw_cmds; i++) {
- cmd_fusion = fusion->cmd_list[i];
- if (cmd_fusion->scmd && (cmd_fusion->scmd == scmd)) {
- scmd_printk(KERN_NOTICE, scmd, "Abort request is for"
- " SMID: %d\n", cmd_fusion->index);
- ret = cmd_fusion->index;
- break;
- }
- }
-
- return ret;
-}
-
/*
* megasas_get_tm_devhandle - Get devhandle for TM request
* @sdev- OS provided scsi device
@@ -4655,7 +4630,8 @@ static u16 megasas_get_tm_devhandle(struct scsi_device *sdev)
int megasas_task_abort_fusion(struct scsi_cmnd *scmd)
{
struct megasas_instance *instance;
- u16 smid, devhandle;
+ struct megasas_cmd_fusion *cmd_fusion;
+ u16 smid = 0, devhandle;
int ret;
struct MR_PRIV_DEVICE *mr_device_priv_data;
mr_device_priv_data = scmd->device->hostdata;
@@ -4684,7 +4660,9 @@ int megasas_task_abort_fusion(struct scsi_cmnd *scmd)
mutex_lock(&instance->reset_mutex);
- smid = megasas_fusion_smid_lookup(scmd);
+ cmd_fusion = megasas_get_cmd_fusion(instance, scmd, false);
+ if (cmd_fusion)
+ smid = cmd_fusion->index;
if (!smid) {
ret = SUCCESS;
Use megasas_get_cmd_fusion() to lookup a command from a scsi command, and use direct array lookup whenever we already have an index. Signed-off-by: Hannes Reinecke <hare@suse.de> --- drivers/scsi/megaraid/megaraid_sas_fusion.c | 56 +++++++++-------------------- 1 file changed, 17 insertions(+), 39 deletions(-)