| From a776c491ca5e38c26d9f66923ff574d041e747f4 Mon Sep 17 00:00:00 2001 |
| From: "Eric W. Biederman" <ebiederm@xmission.com> |
| Date: Mon, 17 Oct 2011 11:46:06 -0700 |
| Subject: PCI: msi: Disable msi interrupts when we initialize a pci device |
| |
| From: "Eric W. Biederman" <ebiederm@xmission.com> |
| |
| commit a776c491ca5e38c26d9f66923ff574d041e747f4 upstream. |
| |
| 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. |
| |
| Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> |
| Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/pci/msi.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| --- a/drivers/pci/msi.c |
| +++ b/drivers/pci/msi.c |
| @@ -863,5 +863,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); |
| } |