Commit 29206da1 authored by Shivasharan S's avatar Shivasharan S Committed by Martin K. Petersen

scsi: megaraid_sas: Use synchronize_irq to wait for IRQs to complete

FIX - Do not use random delay to synchronize with IRQ. Use kernel API.
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 72bff2d1
...@@ -3144,6 +3144,22 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex) ...@@ -3144,6 +3144,22 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
/**
* megasas_sync_irqs - Synchronizes all IRQs owned by adapter
* @instance: Adapter soft state
*/
void megasas_sync_irqs(unsigned long instance_addr)
{
u32 count, i;
struct megasas_instance *instance =
(struct megasas_instance *)instance_addr;
count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
for (i = 0; i < count; i++)
synchronize_irq(pci_irq_vector(instance->pdev, i));
}
/** /**
* megasas_complete_cmd_dpc_fusion - Completes command * megasas_complete_cmd_dpc_fusion - Completes command
* @instance: Adapter soft state * @instance: Adapter soft state
...@@ -3820,7 +3836,7 @@ megasas_issue_tm(struct megasas_instance *instance, u16 device_handle, ...@@ -3820,7 +3836,7 @@ megasas_issue_tm(struct megasas_instance *instance, u16 device_handle,
break; break;
else { else {
instance->instancet->disable_intr(instance); instance->instancet->disable_intr(instance);
msleep(1000); megasas_sync_irqs((unsigned long)instance);
megasas_complete_cmd_dpc_fusion megasas_complete_cmd_dpc_fusion
((unsigned long)instance); ((unsigned long)instance);
instance->instancet->enable_intr(instance); instance->instancet->enable_intr(instance);
...@@ -4174,7 +4190,7 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason) ...@@ -4174,7 +4190,7 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason)
set_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); set_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags);
atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_POLLING); atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_POLLING);
instance->instancet->disable_intr(instance); instance->instancet->disable_intr(instance);
msleep(1000); megasas_sync_irqs((unsigned long)instance);
/* First try waiting for commands to complete */ /* First try waiting for commands to complete */
if (megasas_wait_for_outstanding_fusion(instance, reason, if (megasas_wait_for_outstanding_fusion(instance, reason,
......
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