Commit 093eda3c authored by Linas Vepstas's avatar Linas Vepstas Committed by Paul Mackerras

[POWERPC] EEH: Fix PCI bridge handling bug

The EEH code needs to ignore PCI bridges; sort-of.  It was ignoring
them in the wrong place, and thus failing to set up the
PCI_DN(dn)->pcidev pointer.  Imprudent dereferencing of this pointer
would lead to a crash on cards with bridges.
Signed-off-by: default avatarLinas Vepstas <linas@austin.ibm.com>

----
 arch/powerpc/platforms/pseries/eeh_cache.c |    9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 12588da7
...@@ -225,6 +225,10 @@ void pci_addr_cache_insert_device(struct pci_dev *dev) ...@@ -225,6 +225,10 @@ void pci_addr_cache_insert_device(struct pci_dev *dev)
{ {
unsigned long flags; unsigned long flags;
/* Ignore PCI bridges */
if ((dev->class >> 16) == PCI_BASE_CLASS_BRIDGE)
return;
spin_lock_irqsave(&pci_io_addr_cache_root.piar_lock, flags); spin_lock_irqsave(&pci_io_addr_cache_root.piar_lock, flags);
__pci_addr_cache_insert_device(dev); __pci_addr_cache_insert_device(dev);
spin_unlock_irqrestore(&pci_io_addr_cache_root.piar_lock, flags); spin_unlock_irqrestore(&pci_io_addr_cache_root.piar_lock, flags);
...@@ -285,16 +289,13 @@ void __init pci_addr_cache_build(void) ...@@ -285,16 +289,13 @@ void __init pci_addr_cache_build(void)
spin_lock_init(&pci_io_addr_cache_root.piar_lock); spin_lock_init(&pci_io_addr_cache_root.piar_lock);
while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
/* Ignore PCI bridges */
if ((dev->class >> 16) == PCI_BASE_CLASS_BRIDGE)
continue;
pci_addr_cache_insert_device(dev); pci_addr_cache_insert_device(dev);
dn = pci_device_to_OF_node(dev); dn = pci_device_to_OF_node(dev);
if (!dn) if (!dn)
continue; continue;
pci_dev_get (dev); /* matching put is in eeh_remove_device() */ pci_dev_get(dev); /* matching put is in eeh_remove_device() */
PCI_DN(dn)->pcidev = dev; PCI_DN(dn)->pcidev = dev;
eeh_sysfs_add_device(dev); eeh_sysfs_add_device(dev);
......
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