>-----Original Message----- >From: Christoph Hellwig [mailto:hch@xxxxxx] >Sent: Saturday, January 10, 2015 10:41 PM >To: Sumit.Saxena@xxxxxxxxxxxxx; kashyap.desai@xxxxxxxxxxxxx >Cc: martin.petersen@xxxxxxxxxx; linux-scsi@xxxxxxxxxxxxxxx >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 <hch@xxxxxx> >--- > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html