Commit 9ff97fa8 authored by Shivasharan S's avatar Shivasharan S Committed by Martin K. Petersen

scsi: megaraid_sas: Do not use 32-bit atomic request descriptor for Ventura controllers

Problem Statement: Sending I/O through 32 bit descriptors to Ventura series of
controller results in IO timeout on certain conditions.

This error only occurs on systems with high I/O activity on Ventura series
controllers.

Changes in this patch will prevent driver from using 32 bit descriptor and use
64 bit Descriptors.

Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarKashyap Desai <kashyap.desai@broadcom.com>
Signed-off-by: default avatarShivasharan S <shivasharan.srikanteshwara@broadcom.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-by: default avatarTomas Henzl <thenzl@redhat.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 1bc5ad3a
...@@ -216,20 +216,15 @@ inline void megasas_return_cmd_fusion(struct megasas_instance *instance, ...@@ -216,20 +216,15 @@ inline void megasas_return_cmd_fusion(struct megasas_instance *instance,
/** /**
* megasas_fire_cmd_fusion - Sends command to the FW * megasas_fire_cmd_fusion - Sends command to the FW
* @instance: Adapter soft state * @instance: Adapter soft state
* @req_desc: 32bit or 64bit Request descriptor * @req_desc: 64bit Request descriptor
* *
* Perform PCI Write. Ventura supports 32 bit Descriptor. * Perform PCI Write.
* Prior to Ventura (12G) MR controller supports 64 bit Descriptor.
*/ */
static void static void
megasas_fire_cmd_fusion(struct megasas_instance *instance, megasas_fire_cmd_fusion(struct megasas_instance *instance,
union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc) union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc)
{ {
if (instance->adapter_type == VENTURA_SERIES)
writel(le32_to_cpu(req_desc->u.low),
&instance->reg_set->inbound_single_queue_port);
else {
#if defined(writeq) && defined(CONFIG_64BIT) #if defined(writeq) && defined(CONFIG_64BIT)
u64 req_data = (((u64)le32_to_cpu(req_desc->u.high) << 32) | u64 req_data = (((u64)le32_to_cpu(req_desc->u.high) << 32) |
le32_to_cpu(req_desc->u.low)); le32_to_cpu(req_desc->u.low));
...@@ -245,7 +240,6 @@ megasas_fire_cmd_fusion(struct megasas_instance *instance, ...@@ -245,7 +240,6 @@ megasas_fire_cmd_fusion(struct megasas_instance *instance,
mmiowb(); mmiowb();
spin_unlock_irqrestore(&instance->hba_lock, flags); spin_unlock_irqrestore(&instance->hba_lock, flags);
#endif #endif
}
} }
/** /**
...@@ -982,7 +976,6 @@ megasas_ioc_init_fusion(struct megasas_instance *instance) ...@@ -982,7 +976,6 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
const char *sys_info; const char *sys_info;
MFI_CAPABILITIES *drv_ops; MFI_CAPABILITIES *drv_ops;
u32 scratch_pad_2; u32 scratch_pad_2;
unsigned long flags;
ktime_t time; ktime_t time;
bool cur_fw_64bit_dma_capable; bool cur_fw_64bit_dma_capable;
...@@ -1121,14 +1114,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance) ...@@ -1121,14 +1114,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
break; break;
} }
/* For Ventura also IOC INIT required 64 bit Descriptor write. */ megasas_fire_cmd_fusion(instance, &req_desc);
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);
mmiowb();
spin_unlock_irqrestore(&instance->hba_lock, flags);
wait_and_poll(instance, cmd, MFI_POLL_TIMEOUT_SECS); wait_and_poll(instance, cmd, MFI_POLL_TIMEOUT_SECS);
......
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