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

Commit 8f05024c authored by Sumit Saxena's avatar Sumit Saxena Committed by Martin K. Petersen
Browse files

megaraid_sas: Fastpath region lock bypass



Firmware will fill out per-LD data to tell driver whether a particular
LD supports region lock bypass. If yes, then driver will send non-FP
LDIO to region lock bypass FIFO. With this change in driver, firmware
will optimize certain code to improve performance.

Signed-off-by: default avatarKashyap Desai <kashyap.desai@avagotech.com>
Signed-off-by: default avatarSumit Saxena <sumit.saxena@avagotech.com>
Reviewed-by: default avatarTomas Henzl <thenzl@redhat.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 2216c305
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -1528,7 +1528,9 @@ union megasas_sgl_frame {
typedef union _MFI_CAPABILITIES {
	struct {
#if   defined(__BIG_ENDIAN_BITFIELD)
		u32     reserved:23;
		u32     reserved:21;
		u32     support_fp_rlbypass:1;
		u32     support_vfid_in_ioframe:1;
		u32     support_ext_io_size:1;
		u32	support_ext_queue_depth:1;
		u32     security_protocol_cmds_fw:1;
@@ -1548,7 +1550,9 @@ typedef union _MFI_CAPABILITIES {
		u32     security_protocol_cmds_fw:1;
		u32	support_ext_queue_depth:1;
		u32     support_ext_io_size:1;
		u32     reserved:23;
		u32     support_vfid_in_ioframe:1;
		u32     support_fp_rlbypass:1;
		u32     reserved:21;
#endif
	} mfi_capabilities;
	__le32		reg;
+2 −0
Original line number Diff line number Diff line
@@ -1020,6 +1020,8 @@ MR_BuildRaidContext(struct megasas_instance *instance,
	/* assume this IO needs the full row - we'll adjust if not true */
	regSize             = stripSize;

	io_info->do_fp_rlbypass = raid->capability.fpBypassRegionLock;

	/* Check if we can send this I/O via FastPath */
	if (raid->capability.fpCapable) {
		if (isRead)
+4 −2
Original line number Diff line number Diff line
@@ -666,6 +666,8 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
	if (instance->max_chain_frame_sz > MEGASAS_CHAIN_FRAME_SZ_MIN)
		drv_ops->mfi_capabilities.support_ext_io_size = 1;

	drv_ops->mfi_capabilities.support_fp_rlbypass = 1;

	/* Convert capability to LE32 */
	cpu_to_le32s((u32 *)&init_frame->driver_operations.mfi_capabilities);

@@ -1710,8 +1712,8 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
			(MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO
			 << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
		if (fusion->adapter_type == INVADER_SERIES) {
			if (io_request->RaidContext.regLockFlags ==
			    REGION_TYPE_UNUSED)
			if (io_info.do_fp_rlbypass ||
				(io_request->RaidContext.regLockFlags == REGION_TYPE_UNUSED))
				cmd->request_desc->SCSIIO.RequestFlags =
					(MEGASAS_REQ_DESCRIPT_FLAGS_NO_LOCK <<
					MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
+5 −3
Original line number Diff line number Diff line
@@ -643,7 +643,8 @@ struct MR_SPAN_BLOCK_INFO {
struct MR_LD_RAID {
	struct {
#if   defined(__BIG_ENDIAN_BITFIELD)
		u32     reserved4:6;
		u32     reserved4:5;
		u32     fpBypassRegionLock:1;
		u32     tmCapable:1;
		u32	fpNonRWCapable:1;
		u32     fpReadAcrossStripe:1;
@@ -667,7 +668,8 @@ struct MR_LD_RAID {
		u32     fpReadAcrossStripe:1;
		u32	fpNonRWCapable:1;
		u32     tmCapable:1;
		u32     reserved4:6;
		u32     fpBypassRegionLock:1;
		u32     reserved4:5;
#endif
	} capability;
	__le32     reserved6;
@@ -737,7 +739,7 @@ struct IO_REQUEST_INFO {
	u8 fpOkForIo;
	u8 IoforUnevenSpan;
	u8 start_span;
	u8 reserved;
	u8 do_fp_rlbypass;
	u64 start_row;
	u8  span_arm;	/* span[7:5], arm[4:0] */
	u8  pd_after_lb;