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

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
...@@ -1528,7 +1528,9 @@ union megasas_sgl_frame { ...@@ -1528,7 +1528,9 @@ union megasas_sgl_frame {
typedef union _MFI_CAPABILITIES { typedef union _MFI_CAPABILITIES {
struct { struct {
#if defined(__BIG_ENDIAN_BITFIELD) #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_io_size:1;
u32 support_ext_queue_depth:1; u32 support_ext_queue_depth:1;
u32 security_protocol_cmds_fw:1; u32 security_protocol_cmds_fw:1;
...@@ -1548,7 +1550,9 @@ typedef union _MFI_CAPABILITIES { ...@@ -1548,7 +1550,9 @@ typedef union _MFI_CAPABILITIES {
u32 security_protocol_cmds_fw:1; u32 security_protocol_cmds_fw:1;
u32 support_ext_queue_depth:1; u32 support_ext_queue_depth:1;
u32 support_ext_io_size: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 #endif
} mfi_capabilities; } mfi_capabilities;
__le32 reg; __le32 reg;
......
...@@ -1020,6 +1020,8 @@ MR_BuildRaidContext(struct megasas_instance *instance, ...@@ -1020,6 +1020,8 @@ MR_BuildRaidContext(struct megasas_instance *instance,
/* assume this IO needs the full row - we'll adjust if not true */ /* assume this IO needs the full row - we'll adjust if not true */
regSize = stripSize; regSize = stripSize;
io_info->do_fp_rlbypass = raid->capability.fpBypassRegionLock;
/* Check if we can send this I/O via FastPath */ /* Check if we can send this I/O via FastPath */
if (raid->capability.fpCapable) { if (raid->capability.fpCapable) {
if (isRead) if (isRead)
......
...@@ -666,6 +666,8 @@ megasas_ioc_init_fusion(struct megasas_instance *instance) ...@@ -666,6 +666,8 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
if (instance->max_chain_frame_sz > MEGASAS_CHAIN_FRAME_SZ_MIN) 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_ext_io_size = 1;
drv_ops->mfi_capabilities.support_fp_rlbypass = 1;
/* Convert capability to LE32 */ /* Convert capability to LE32 */
cpu_to_le32s((u32 *)&init_frame->driver_operations.mfi_capabilities); cpu_to_le32s((u32 *)&init_frame->driver_operations.mfi_capabilities);
...@@ -1710,8 +1712,8 @@ megasas_build_ldio_fusion(struct megasas_instance *instance, ...@@ -1710,8 +1712,8 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
(MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO (MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO
<< MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
if (fusion->adapter_type == INVADER_SERIES) { if (fusion->adapter_type == INVADER_SERIES) {
if (io_request->RaidContext.regLockFlags == if (io_info.do_fp_rlbypass ||
REGION_TYPE_UNUSED) (io_request->RaidContext.regLockFlags == REGION_TYPE_UNUSED))
cmd->request_desc->SCSIIO.RequestFlags = cmd->request_desc->SCSIIO.RequestFlags =
(MEGASAS_REQ_DESCRIPT_FLAGS_NO_LOCK << (MEGASAS_REQ_DESCRIPT_FLAGS_NO_LOCK <<
MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
......
...@@ -643,7 +643,8 @@ struct MR_SPAN_BLOCK_INFO { ...@@ -643,7 +643,8 @@ struct MR_SPAN_BLOCK_INFO {
struct MR_LD_RAID { struct MR_LD_RAID {
struct { struct {
#if defined(__BIG_ENDIAN_BITFIELD) #if defined(__BIG_ENDIAN_BITFIELD)
u32 reserved4:6; u32 reserved4:5;
u32 fpBypassRegionLock:1;
u32 tmCapable:1; u32 tmCapable:1;
u32 fpNonRWCapable:1; u32 fpNonRWCapable:1;
u32 fpReadAcrossStripe:1; u32 fpReadAcrossStripe:1;
...@@ -667,7 +668,8 @@ struct MR_LD_RAID { ...@@ -667,7 +668,8 @@ struct MR_LD_RAID {
u32 fpReadAcrossStripe:1; u32 fpReadAcrossStripe:1;
u32 fpNonRWCapable:1; u32 fpNonRWCapable:1;
u32 tmCapable:1; u32 tmCapable:1;
u32 reserved4:6; u32 fpBypassRegionLock:1;
u32 reserved4:5;
#endif #endif
} capability; } capability;
__le32 reserved6; __le32 reserved6;
...@@ -737,7 +739,7 @@ struct IO_REQUEST_INFO { ...@@ -737,7 +739,7 @@ struct IO_REQUEST_INFO {
u8 fpOkForIo; u8 fpOkForIo;
u8 IoforUnevenSpan; u8 IoforUnevenSpan;
u8 start_span; u8 start_span;
u8 reserved; u8 do_fp_rlbypass;
u64 start_row; u64 start_row;
u8 span_arm; /* span[7:5], arm[4:0] */ u8 span_arm; /* span[7:5], arm[4:0] */
u8 pd_after_lb; u8 pd_after_lb;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment