aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2007-03-28 09:36:09 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-28 16:59:37 -0400
commitbba6f6fc68e74d4572028646f61dd3505a68747e (patch)
treee593440b5944676af7ec6b85c14acbd9ac7b72c7
parent4dfc896e90359df04c80da5ab08ec31e87846c43 (diff)
[PATCH] MSI-X: fix resume crash
So I think the right solution is to simply make pci_enable_device just flip enable bits and move the rest of the work someplace else. However a thorough cleanup is a little extreme for this point in the release cycle, so I think a quick hack that makes the code not stomp the irq when msi irq's are enabled should be the first fix. Then we can later make the code not change the irqs at all. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--arch/cris/arch-v32/drivers/pci/bios.c4
-rw-r--r--arch/frv/mb93090-mb00/pci-vdk.c3
-rw-r--r--arch/i386/pci/common.c6
-rw-r--r--arch/ia64/pci/pci.c8
4 files changed, 15 insertions, 6 deletions
diff --git a/arch/cris/arch-v32/drivers/pci/bios.c b/arch/cris/arch-v32/drivers/pci/bios.c
index a2b9c60c2777..5b79a7a772d4 100644
--- a/arch/cris/arch-v32/drivers/pci/bios.c
+++ b/arch/cris/arch-v32/drivers/pci/bios.c
@@ -100,7 +100,9 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
100 if ((err = pcibios_enable_resources(dev, mask)) < 0) 100 if ((err = pcibios_enable_resources(dev, mask)) < 0)
101 return err; 101 return err;
102 102
103 return pcibios_enable_irq(dev); 103 if (!dev->msi_enabled)
104 pcibios_enable_irq(dev);
105 return 0;
104} 106}
105 107
106int pcibios_assign_resources(void) 108int pcibios_assign_resources(void)
diff --git a/arch/frv/mb93090-mb00/pci-vdk.c b/arch/frv/mb93090-mb00/pci-vdk.c
index f7279d78995a..0b581e3cf7c7 100644
--- a/arch/frv/mb93090-mb00/pci-vdk.c
+++ b/arch/frv/mb93090-mb00/pci-vdk.c
@@ -466,6 +466,7 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
466 466
467 if ((err = pcibios_enable_resources(dev, mask)) < 0) 467 if ((err = pcibios_enable_resources(dev, mask)) < 0)
468 return err; 468 return err;
469 pcibios_enable_irq(dev); 469 if (!dev->msi_enabled)
470 pcibios_enable_irq(dev);
470 return 0; 471 return 0;
471} 472}
diff --git a/arch/i386/pci/common.c b/arch/i386/pci/common.c
index 948436665385..3f78d4d8ecf3 100644
--- a/arch/i386/pci/common.c
+++ b/arch/i386/pci/common.c
@@ -434,11 +434,13 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
434 if ((err = pcibios_enable_resources(dev, mask)) < 0) 434 if ((err = pcibios_enable_resources(dev, mask)) < 0)
435 return err; 435 return err;
436 436
437 return pcibios_enable_irq(dev); 437 if (!dev->msi_enabled)
438 return pcibios_enable_irq(dev);
439 return 0;
438} 440}
439 441
440void pcibios_disable_device (struct pci_dev *dev) 442void pcibios_disable_device (struct pci_dev *dev)
441{ 443{
442 if (pcibios_disable_irq) 444 if (!dev->msi_enabled && pcibios_disable_irq)
443 pcibios_disable_irq(dev); 445 pcibios_disable_irq(dev);
444} 446}
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
index 474d179966dc..f8bcccd6d417 100644
--- a/arch/ia64/pci/pci.c
+++ b/arch/ia64/pci/pci.c
@@ -557,14 +557,18 @@ pcibios_enable_device (struct pci_dev *dev, int mask)
557 if (ret < 0) 557 if (ret < 0)
558 return ret; 558 return ret;
559 559
560 return acpi_pci_irq_enable(dev); 560 if (!dev->msi_enabled)
561 return acpi_pci_irq_enable(dev);
562 return 0;
561} 563}
562 564
563void 565void
564pcibios_disable_device (struct pci_dev *dev) 566pcibios_disable_device (struct pci_dev *dev)
565{ 567{
566 BUG_ON(atomic_read(&dev->enable_cnt)); 568 BUG_ON(atomic_read(&dev->enable_cnt));
567 acpi_pci_irq_disable(dev); 569 if (!dev->msi_enabled)
570 acpi_pci_irq_disable(dev);
571 return 0;
568} 572}
569 573
570void 574void