]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
PCI: msi: Disable msi interrupts when we initialize a pci device
authorEric W. Biederman <ebiederm@xmission.com>
Mon, 17 Oct 2011 18:46:06 +0000 (11:46 -0700)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Fri, 11 Nov 2011 17:57:56 +0000 (09:57 -0800)
I traced a nasty kexec on panic boot failure to the fact that we had
screaming msi interrupts and we were not disabling the msi messages at
kernel startup.  The booting kernel had not enabled those interupts so
was not prepared to handle them.

I can see no reason why we would ever want to leave the msi interrupts
enabled at boot if something else has enabled those interrupts.  The pci
spec specifies that msi interrupts should be off by default.  Drivers
are expected to enable the msi interrupts if they want to use them.  Our
interrupt handling code reprograms the interrupt handlers at boot and
will not be be able to do anything useful with an unexpected interrupt.

This patch applies cleanly all of the way back to 2.6.32 where I noticed
the problem.

Cc: stable@kernel.org
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
drivers/pci/msi.c

index 73613e2167b67f973bcf08d7ba09d41e07593303..3f2e87c8f72248b909981230632d629a80dbc921 100644 (file)
@@ -980,5 +980,15 @@ EXPORT_SYMBOL(pci_msi_enabled);
 
 void pci_msi_init_pci_dev(struct pci_dev *dev)
 {
+       int pos;
        INIT_LIST_HEAD(&dev->msi_list);
+
+       /* Disable the msi hardware to avoid screaming interrupts
+        * during boot.  This is the power on reset default so
+        * usually this should be a noop.
+        */
+       pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
+       if (pos)
+               msi_set_enable(dev, pos, 0);
+       msix_set_enable(dev, 0);
 }