Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01d7f03b authored by Christoph Hellwig's avatar Christoph Hellwig Committed by James Bottomley
Browse files

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.

[jejb: fix up 32 bit compile failure]
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarSumit Saxena <sumit.saxena@avagotech.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarTomas Henzl <thenzl@redhat.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Odin.com>
parent 2213a467
Loading
Loading
Loading
Loading
+31 −41
Original line number Original line Diff line number Diff line
@@ -181,6 +181,31 @@ inline void megasas_return_cmd_fusion(struct megasas_instance *instance,
	memset(cmd->io_request, 0, sizeof(struct MPI2_RAID_SCSI_IO_REQUEST));
	memset(cmd->io_request, 0, sizeof(struct MPI2_RAID_SCSI_IO_REQUEST));
}
}


/**
 * 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.high) << 32) |
			le32_to_cpu(req_desc->u.low));

	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
 * megasas_teardown_frame_pool_fusion -	Destroy the cmd frame DMA pool
 * @instance:				Adapter soft state
 * @instance:				Adapter soft state
@@ -679,8 +704,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
			break;
			break;
	}
	}


	instance->instancet->fire_cmd(instance, req_desc.u.low,
	megasas_fire_cmd_fusion(instance, &req_desc);
				      req_desc.u.high, instance->reg_set);


	wait_and_poll(instance, cmd, MFI_POLL_TIMEOUT_SECS);
	wait_and_poll(instance, cmd, MFI_POLL_TIMEOUT_SECS);


@@ -1095,34 +1119,6 @@ megasas_init_adapter_fusion(struct megasas_instance *instance)
	return 1;
	return 1;
}
}


/**
 * 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
 * map_cmd_status -	Maps FW cmd status to OS cmd status
 * @cmd :		Pointer to cmd
 * @cmd :		Pointer to cmd
@@ -1948,9 +1944,7 @@ megasas_build_and_issue_cmd_fusion(struct megasas_instance *instance,
	 */
	 */
	atomic_inc(&instance->fw_outstanding);
	atomic_inc(&instance->fw_outstanding);


	instance->instancet->fire_cmd(instance,
	megasas_fire_cmd_fusion(instance, req_desc);
				      req_desc->u.low, req_desc->u.high,
				      instance->reg_set);


	return 0;
	return 0;
}
}
@@ -2311,8 +2305,7 @@ megasas_issue_dcmd_fusion(struct megasas_instance *instance,
		printk(KERN_ERR "Couldn't issue MFI pass thru cmd\n");
		printk(KERN_ERR "Couldn't issue MFI pass thru cmd\n");
		return;
		return;
	}
	}
	instance->instancet->fire_cmd(instance, req_desc->u.low,
	megasas_fire_cmd_fusion(instance, req_desc);
				      req_desc->u.high, instance->reg_set);
}
}


/**
/**
@@ -2522,11 +2515,9 @@ void megasas_refire_mgmt_cmd(struct megasas_instance *instance)
		req_desc = megasas_get_request_descriptor
		req_desc = megasas_get_request_descriptor
					(instance, smid - 1);
					(instance, smid - 1);
		if (req_desc && (cmd_mfi->frame->dcmd.opcode !=
		if (req_desc && (cmd_mfi->frame->dcmd.opcode !=
				cpu_to_le32(MR_DCMD_LD_MAP_GET_INFO))) {
				cpu_to_le32(MR_DCMD_LD_MAP_GET_INFO)))
			instance->instancet->fire_cmd(instance,
			megasas_fire_cmd_fusion(instance, req_desc);
				req_desc->u.low, req_desc->u.high,
		else
				instance->reg_set);
		} else
			megasas_return_cmd(instance, cmd_mfi);
			megasas_return_cmd(instance, cmd_mfi);
	}
	}
}
}
@@ -2961,7 +2952,6 @@ void megasas_fusion_ocr_wq(struct work_struct *work)
}
}


struct megasas_instance_template megasas_instance_template_fusion = {
struct megasas_instance_template megasas_instance_template_fusion = {
	.fire_cmd = megasas_fire_cmd_fusion,
	.enable_intr = megasas_enable_intr_fusion,
	.enable_intr = megasas_enable_intr_fusion,
	.disable_intr = megasas_disable_intr_fusion,
	.disable_intr = megasas_disable_intr_fusion,
	.clear_intr = megasas_clear_intr_fusion,
	.clear_intr = megasas_clear_intr_fusion,