Commit 020d5024 authored by Rajesh Shah's avatar Rajesh Shah Committed by Greg Kroah-Hartman

[PATCH] PCI: Allow MSI to work on kexec kernel

We recently ran into a problem where the e1000 device failed to
work properly on the kexec kernel. MSI was enabled for the
device in the main kernel when it crashed. The e1000 driver
tried to enable MSI on the kexec kernel, but the code bailed
early when it found that MSI was already enabled in the hardware,
even though the software state was not properly set up in the
kexec'd kernel. This patch fixes the problem by moving the
early return to after making sure that the software state
is properly initialized.
Signed-off-by: default avatarRajesh Shah <rajesh.shah@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 1edab4a1
...@@ -940,14 +940,13 @@ int pci_enable_msi(struct pci_dev* dev) ...@@ -940,14 +940,13 @@ int pci_enable_msi(struct pci_dev* dev)
if (!pos) if (!pos)
return -EINVAL; return -EINVAL;
pci_read_config_word(dev, msi_control_reg(pos), &control);
if (control & PCI_MSI_FLAGS_ENABLE)
return 0; /* Already in MSI mode */
if (!msi_lookup_vector(dev, PCI_CAP_ID_MSI)) { if (!msi_lookup_vector(dev, PCI_CAP_ID_MSI)) {
/* Lookup Sucess */ /* Lookup Sucess */
unsigned long flags; unsigned long flags;
pci_read_config_word(dev, msi_control_reg(pos), &control);
if (control & PCI_MSI_FLAGS_ENABLE)
return 0; /* Already in MSI mode */
spin_lock_irqsave(&msi_lock, flags); spin_lock_irqsave(&msi_lock, flags);
if (!vector_irq[dev->irq]) { if (!vector_irq[dev->irq]) {
msi_desc[dev->irq]->msi_attrib.state = 0; msi_desc[dev->irq]->msi_attrib.state = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment