]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
scsi: megaraid_sas: Use synchronize_irq to wait for IRQs to complete
authorShivasharan S <shivasharan.srikanteshwara@broadcom.com>
Fri, 10 Feb 2017 08:59:34 +0000 (00:59 -0800)
committerSomasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>
Thu, 10 Aug 2017 03:12:57 +0000 (20:12 -0700)
Orabug: 26608922

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>
[ Upstream commit 29206da1490a7065e8a03ec43f6de60c5c978cae ]
[ Added drivers/scsi/megaraid/kcompat.h to resolve pci_irq_vector symbol ]
Signed-off-by: Somasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>
Reviewed-by: Jack Vogel <jack.vogel@oracle.com>
drivers/scsi/megaraid/kcompat.h [new file with mode: 0644]
drivers/scsi/megaraid/megaraid_sas_fusion.c

diff --git a/drivers/scsi/megaraid/kcompat.h b/drivers/scsi/megaraid/kcompat.h
new file mode 100644 (file)
index 0000000..f5cd941
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef _KCOMPAT_H_
+#define _KCOMPAT_H_
+#endif
+
+#ifndef LINUX_VERSION_CODE
+#include <linux/version.h>
+#else
+#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
+#endif
+
+
+static inline int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
+{
+       if (WARN_ON_ONCE(nr > 0))
+               return -EINVAL;
+       return dev->irq;
+}
+
+
index 303ec80c770b9561762278ea812d0e9c0ffc5db1..6df1cc1d466af681fa946589f7e4ce767e9f4665 100644 (file)
@@ -56,6 +56,7 @@
 #include <scsi/scsi_dbg.h>
 #include <linux/dmi.h>
 
+#include "kcompat.h"
 #include "megaraid_sas_fusion.h"
 #include "megaraid_sas.h"
 
@@ -2859,6 +2860,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
@@ -3535,7 +3552,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);
@@ -3889,7 +3906,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,