powerpc/pseries: Disable MSI using new interface if possible
authorNishanth Aravamudan <nacc@us.ibm.com>
Thu, 3 Mar 2011 15:41:02 +0000 (15:41 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 11 Mar 2011 03:18:24 +0000 (14:18 +1100)
On upcoming hardware, we have a PCI adapter with two functions, one of
which uses MSI and the other uses MSI-X. This adapter, when MSI is
disabled using the "old" firmware interface (RTAS_CHANGE_FN), still
signals an MSI-X interrupt and triggers an EEH. We are working with the
vendor to ensure that the hardware is not at fault, but if we use the
"new" interface (RTAS_CHANGE_MSI_FN) to disable MSI, we also
automatically disable MSI-X and the adapter does not appear to signal
any stray MSI-X interrupt.

Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com>
Acked-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/platforms/pseries/msi.c

index 1164c3430f2c520369ae4fa622c96673c6dcd926..18ac801f8e909186c8ef72f5f89199920538dc9b 100644 (file)
@@ -93,8 +93,18 @@ static void rtas_disable_msi(struct pci_dev *pdev)
        if (!pdn)
                return;
 
-       if (rtas_change_msi(pdn, RTAS_CHANGE_FN, 0) != 0)
-               pr_debug("rtas_msi: Setting MSIs to 0 failed!\n");
+       /*
+        * disabling MSI with the explicit interface also disables MSI-X
+        */
+       if (rtas_change_msi(pdn, RTAS_CHANGE_MSI_FN, 0) != 0) {
+               /* 
+                * may have failed because explicit interface is not
+                * present
+                */
+               if (rtas_change_msi(pdn, RTAS_CHANGE_FN, 0) != 0) {
+                       pr_debug("rtas_msi: Setting MSIs to 0 failed!\n");
+               }
+       }
 }
 
 static int rtas_query_irq_number(struct pci_dn *pdn, int offset)