RE: [PATCH 08/10] megaraid_sas: fix megasas_fire_cmd_fusion calling convention

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>-----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



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux