aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordavem <davem>2002-02-01 00:56:03 +0000
committerdavem <davem>2002-02-01 00:56:03 +0000
commitdf70ce0ae7fd2f5582fd22d02a2416d4ffa36a1d (patch)
tree00ee4c85d35310c1c769ea1a2343367ac9725b08
parent0f3a7bb114157e01abedb47d1f7ffd6879e7f6b4 (diff)
downloadnetdev-vger-cvs-df70ce0ae7fd2f5582fd22d02a2416d4ffa36a1d.tar.gz
Do not try to calculate IRQ of empty EBUS
devices. Needed to work around a bug in OBP in Ex000 systems with PCI I/O boards. In that case it does not compute the fully specified INO for the interrupts property even though it is an onboard device and has forth firmware.
-rw-r--r--arch/sparc64/kernel/pci_common.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/arch/sparc64/kernel/pci_common.c b/arch/sparc64/kernel/pci_common.c
index f738c6179..2d9d26ee9 100644
--- a/arch/sparc64/kernel/pci_common.c
+++ b/arch/sparc64/kernel/pci_common.c
@@ -1,4 +1,4 @@
-/* $Id: pci_common.c,v 1.28 2002-01-14 05:47:02 davem Exp $
+/* $Id: pci_common.c,v 1.29 2002-02-01 00:56:03 davem Exp $
* pci_common.c: PCI controller common support.
*
* Copyright (C) 1999 David S. Miller (davem@redhat.com)
@@ -670,6 +670,20 @@ static void __init pdev_fixup_irq(struct pci_dev *pdev)
int prom_node = pcp->prom_node;
int err;
+ /* If this is an empty EBUS device, sometimes OBP fails to
+ * give it a valid fully specified interrupts property.
+ * The EBUS hooked up to SunHME on PCI I/O boards of
+ * Ex000 systems is one such case.
+ *
+ * The interrupt is not important so just ignore it.
+ */
+ if (pdev->vendor == PCI_VENDOR_ID_SUN &&
+ pdev->device == PCI_DEVICE_ID_SUN_EBUS &&
+ !prom_getchild(prom_node)) {
+ pdev->irq = 0;
+ return;
+ }
+
err = prom_getproperty(prom_node, "interrupts",
(char *)&prom_irq, sizeof(prom_irq));
if (err == 0 || err == -1) {