Patch f598282f5145036312d90875d0ed5c14b49fd8a7 exposed a problem in powerpc MSI-X functionality, making network interfaces such as ixgbe and cxgb3 stop to work when MSI-X is enabled. RX interrupts were not being generated.
The problem was caused because MSI irq was not being effectively unmasked after device initialization. Signed-off-by: Andre Detsch <adet...@br.ibm.com> Signed-off-by: Michael Ellerman <mich...@ellerman.id.au> Index: linux-2.6/arch/powerpc/platforms/pseries/msi.c =================================================================== --- linux-2.6.orig/arch/powerpc/platforms/pseries/msi.c 2009-11-04 06:35:39.000000000 -0700 +++ linux-2.6/arch/powerpc/platforms/pseries/msi.c 2009-11-04 07:23:27.000000000 -0700 @@ -432,8 +432,6 @@ static int rtas_setup_msi_irqs(struct pc /* Read config space back so we can restore after reset */ read_msi_msg(virq, &msg); entry->msg = msg; - - unmask_msi_irq(virq); } return 0; Index: linux-2.6/arch/powerpc/platforms/pseries/xics.c =================================================================== --- linux-2.6.orig/arch/powerpc/platforms/pseries/xics.c 2009-11-04 06:35:39.000000000 -0700 +++ linux-2.6/arch/powerpc/platforms/pseries/xics.c 2009-11-04 07:23:27.000000000 -0700 @@ -18,6 +18,7 @@ #include <linux/init.h> #include <linux/radix-tree.h> #include <linux/cpu.h> +#include <linux/msi.h> #include <linux/of.h> #include <asm/firmware.h> @@ -219,6 +220,14 @@ static void xics_unmask_irq(unsigned int static unsigned int xics_startup(unsigned int virq) { + /* + * The generic MSI code returns with the interrupt disabled on the + * card, using the MSI mask bits. Firmware doesn't appear to unmask + * at that level, so we do it here by hand. + */ + if (irq_to_desc(virq)->msi_desc) + unmask_msi_irq(virq); + /* unmask it */ xics_unmask_irq(virq); return 0; _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev