mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 03:10:12 +00:00
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: Kashyap Desai <kashyap.desai@broadcom.com> Signed-off-by: Shivasharan S <shivasharan.srikanteshwara@broadcom.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Reviewed-by: Tomas Henzl <thenzl@redhat.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
72bff2d1d0
commit
29206da149
1 changed files with 18 additions and 2 deletions
|
@ -3144,6 +3144,22 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex)
|
|||
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
|
||||
* @instance: Adapter soft state
|
||||
|
@ -3820,7 +3836,7 @@ megasas_issue_tm(struct megasas_instance *instance, u16 device_handle,
|
|||
break;
|
||||
else {
|
||||
instance->instancet->disable_intr(instance);
|
||||
msleep(1000);
|
||||
megasas_sync_irqs((unsigned long)instance);
|
||||
megasas_complete_cmd_dpc_fusion
|
||||
((unsigned long)instance);
|
||||
instance->instancet->enable_intr(instance);
|
||||
|
@ -4174,7 +4190,7 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason)
|
|||
set_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags);
|
||||
atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_POLLING);
|
||||
instance->instancet->disable_intr(instance);
|
||||
msleep(1000);
|
||||
megasas_sync_irqs((unsigned long)instance);
|
||||
|
||||
/* First try waiting for commands to complete */
|
||||
if (megasas_wait_for_outstanding_fusion(instance, reason,
|
||||
|
|
Loading…
Reference in a new issue