MIPS: Octeon: Disallow MSI-X interrupt and fall back to MSI interrupts.
authorChandrakala Chavva <cchavva@caviumnetworks.com>
Tue, 27 Jul 2010 01:14:16 +0000 (18:14 -0700)
committerRalf Baechle <ralf@linux-mips.org>
Thu, 5 Aug 2010 12:26:27 +0000 (13:26 +0100)
MSI-X interrupts are not supported yet for Octeon, return error if
MSI-X interrupts are requested by driver so that the driver will fall
back to use MSI interrupts.

Signed-off-by: Chandrakala Chavva <cchavva@caviumnetworks.com>
To: linux-mips@linux-mips.org
Cc: David Daney <ddaney@caviumnetworks.com>
Patchwork: https://patchwork.linux-mips.org/patch/1506/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: David Daney <ddaney@caviumnetworks.com>
arch/mips/include/asm/pci.h
arch/mips/pci/msi-octeon.c

index 3beea1479b4385a19af34efbf4a3b720daeff76d..576397c699208160f60e13f5aa5f95c7bd1b4bb5 100644 (file)
@@ -140,6 +140,11 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
        return channel ? 15 : 14;
 }
 
        return channel ? 15 : 14;
 }
 
+#ifdef CONFIG_CPU_CAVIUM_OCTEON
+/* MSI arch hook for OCTEON */
+#define arch_setup_msi_irqs arch_setup_msi_irqs
+#endif
+
 extern int pci_probe_only;
 
 extern char * (*pcibios_plat_setup)(char *str);
 extern int pci_probe_only;
 
 extern char * (*pcibios_plat_setup)(char *str);
index 7c756408b85dc7759df5cb2b6c5e0a7fe90a1683..d8080499872a5af2bbf47c1f2431744b94d4ef1b 100644 (file)
@@ -177,6 +177,34 @@ msi_irq_allocated:
        return 0;
 }
 
        return 0;
 }
 
+int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
+{
+       struct msi_desc *entry;
+       int ret;
+
+       /*
+        * MSI-X is not supported.
+        */
+       if (type == PCI_CAP_ID_MSIX)
+               return -EINVAL;
+
+       /*
+        * If an architecture wants to support multiple MSI, it needs to
+        * override arch_setup_msi_irqs()
+        */
+       if (type == PCI_CAP_ID_MSI && nvec > 1)
+               return 1;
+
+       list_for_each_entry(entry, &dev->msi_list, list) {
+               ret = arch_setup_msi_irq(dev, entry);
+               if (ret < 0)
+                       return ret;
+               if (ret > 0)
+                       return -ENOSPC;
+       }
+
+       return 0;
+}
 
 /**
  * Called when a device no longer needs its MSI interrupts. All
 
 /**
  * Called when a device no longer needs its MSI interrupts. All