>-----Original Message-----
>From: Christoph Hellwig [mailto:[email protected]]
>Sent: Saturday, January 10, 2015 10:41 PM
>To: [email protected]; [email protected]
>Cc: [email protected]; [email protected]
>Subject: [PATCH 08/10] megaraid_sas: fix megasas_fire_cmd_fusion calling
>convention
>
>The fusion HBAs don't really use the instance template like the other
variants,
>as it branches off at a much higher level. So instead of trying to
squeeze
>megasas_fire_cmd_fusion into the wrong calling convention call it locally
with
>argument data types that match what is passed.
>
>Signed-off-by: Christoph Hellwig <[email protected]>
>---
> drivers/scsi/megaraid/megaraid_sas_fusion.c | 73
++++++++++++-------------
>----
> 1 file changed, 29 insertions(+), 44 deletions(-)
>
>diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c
>b/drivers/scsi/megaraid/megaraid_sas_fusion.c
>index b1e053b..5a45764 100644
>--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
>+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
>@@ -230,6 +230,31 @@ inline void megasas_return_mfi_mpt_pthr(struct
>megasas_instance *instance, }
>
> /**
>+ * megasas_fire_cmd_fusion - Sends command to the FW
>+ */
>+static void
>+megasas_fire_cmd_fusion(struct megasas_instance *instance,
>+ union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc)
>{ #if
>+defined(writeq) && defined(CONFIG_64BIT)
>+ u64 req_data = (((u64)le32_to_cpu(req_desc->u.low) << 32) |
>+ le32_to_cpu(req_desc->u.high));
In req_data building, positions of "req_desc->u.low" and
"req_desc->u.high" are swapped.
req_data should be like below:
u64 req_data = (((u64)le32_to_cpu(req_desc->u.high) << 32) |
le32_to_cpu(req_desc->u.low));
I will post new patch with this change.
Thanks,
Sumit
>+
>+ writeq(req_data, &instance->reg_set->inbound_low_queue_port);
>+#else
>+ unsigned long flags;
>+
>+ spin_lock_irqsave(&instance->hba_lock, flags);
>+ writel(le32_to_cpu(req_desc->u.low),
>+ &instance->reg_set->inbound_low_queue_port);
>+ writel(le32_to_cpu(req_desc.u.high),
>+ &instance->reg_set->inbound_high_queue_port);
>+ spin_unlock_irqrestore(&instance->hba_lock, flags); #endif }
>+
>+
>+/**
> * megasas_teardown_frame_pool_fusion - Destroy the cmd frame DMA
>pool
> * @instance: Adapter soft state
> */
>@@ -721,8 +746,7 @@ megasas_ioc_init_fusion(struct megasas_instance
>*instance)
> break;
> }
>
>- instance->instancet->fire_cmd(instance, req_desc.u.low,
>- req_desc.u.high, instance->reg_set);
>+ megasas_fire_cmd_fusion(instance, &req_desc);
>
> wait_and_poll(instance, cmd, MFI_POLL_TIMEOUT_SECS);
>
>@@ -1133,34 +1157,6 @@ fail_alloc_mfi_cmds:
> }
>
> /**
>- * megasas_fire_cmd_fusion - Sends command to the FW
>- * @frame_phys_addr : Physical address of cmd
>- * @frame_count : Number of frames for the command
>- * @regs : MFI register set
>- */
>-void
>-megasas_fire_cmd_fusion(struct megasas_instance *instance,
>- dma_addr_t req_desc_lo,
>- u32 req_desc_hi,
>- struct megasas_register_set __iomem *regs)
>-{
>-#if defined(writeq) && defined(CONFIG_64BIT)
>- u64 req_data = (((u64)le32_to_cpu(req_desc_hi) << 32) |
>- le32_to_cpu(req_desc_lo));
>-
>- writeq(req_data, &(regs)->inbound_low_queue_port);
>-#else
>- unsigned long flags;
>-
>- spin_lock_irqsave(&instance->hba_lock, flags);
>-
>- writel(le32_to_cpu(req_desc_lo), &(regs)-
>>inbound_low_queue_port);
>- writel(le32_to_cpu(req_desc_hi), &(regs)-
>>inbound_high_queue_port);
>- spin_unlock_irqrestore(&instance->hba_lock, flags);
>-#endif
>-}
>-
>-/**
> * map_cmd_status - Maps FW cmd status to OS cmd status
> * @cmd : Pointer to cmd
> * @status : status of cmd returned by FW
>@@ -1947,9 +1943,7 @@ megasas_build_and_issue_cmd_fusion(struct
>megasas_instance *instance,
> */
> atomic_inc(&instance->fw_outstanding);
>
>- instance->instancet->fire_cmd(instance,
>- req_desc->u.low, req_desc->u.high,
>- instance->reg_set);
>+ megasas_fire_cmd_fusion(instance, req_desc);
>
> return 0;
> }
>@@ -2328,8 +2322,7 @@ megasas_issue_dcmd_fusion(struct
>megasas_instance *instance,
> return;
> }
> atomic_set(&cmd->mfi_mpt_pthr, MFI_MPT_ATTACHED);
>- instance->instancet->fire_cmd(instance, req_desc->u.low,
>- req_desc->u.high,
instance->reg_set);
>+ megasas_fire_cmd_fusion(instance, req_desc);
> }
>
> /**
>@@ -2816,14 +2809,7 @@ int megasas_reset_fusion(struct Scsi_Host *shost,
>int iotimeout)
> 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);
>+
> megasas_fire_cmd_fusion(instance, req_desc);
> }
> }
> }
>@@ -2978,7 +2964,6 @@ void megasas_fusion_ocr_wq(struct work_struct
>*work)
> }
>
> struct megasas_instance_template megasas_instance_template_fusion = {
>- .fire_cmd = megasas_fire_cmd_fusion,
> .enable_intr = megasas_enable_intr_fusion,
> .disable_intr = megasas_disable_intr_fusion,
> .clear_intr = megasas_clear_intr_fusion,
>--
>1.9.1
--
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