From 7c5488f08c081ef6f79f31e343ae28f644d42c01 Mon Sep 17 00:00:00 2001 From: Ivan Kokshaysky Date: Mon, 24 May 2004 18:44:10 -0700 Subject: [PATCH] [PATCH] fix PCI bridge swizzle on takara and eiger This fixes NULL pointer dereference (bus->self) for PCI devices on the root bus. Ivan. --- arch/alpha/kernel/sys_eiger.c | 33 +++++++++++++-------------------- arch/alpha/kernel/sys_takara.c | 6 +++++- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index 8e91eb6e46c01..c6cbf47803a0d 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c @@ -194,27 +194,20 @@ eiger_swizzle(struct pci_dev *dev, u8 *pinp) case 0x0f: bridge_count = 4; break; /* 4 */ }; - /* Check first for the built-in bridges on hose 0. */ - if (hose->index == 0 - && PCI_SLOT(dev->bus->self->devfn) > 20-bridge_count) { - slot = PCI_SLOT(dev->devfn); - } else { - /* Must be a card-based bridge. */ - do { - /* Check for built-in bridges on hose 0. */ - if (hose->index == 0 - && (PCI_SLOT(dev->bus->self->devfn) - > 20 - bridge_count)) { - slot = PCI_SLOT(dev->devfn); - break; - } - pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); - - /* Move up the chain of bridges. */ - dev = dev->bus->self; - /* Slot of the next bridge. */ + slot = PCI_SLOT(dev->devfn); + while (dev->bus->self) { + /* Check for built-in bridges on hose 0. */ + if (hose->index == 0 + && (PCI_SLOT(dev->bus->self->devfn) + > 20 - bridge_count)) { slot = PCI_SLOT(dev->devfn); - } while (dev->bus->self); + break; + } + /* Must be a card-based bridge. */ + pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); + + /* Move up the chain of bridges. */ + dev = dev->bus->self; } *pinp = pin; return slot; diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c index 24c255edad918..126c433a63ddc 100644 --- a/arch/alpha/kernel/sys_takara.c +++ b/arch/alpha/kernel/sys_takara.c @@ -231,8 +231,12 @@ takara_swizzle(struct pci_dev *dev, u8 *pinp) int slot = PCI_SLOT(dev->devfn); int pin = *pinp; unsigned int ctlreg = inl(0x500); - unsigned int busslot = PCI_SLOT(dev->bus->self->devfn); + unsigned int busslot; + if (!dev->bus->self) + return slot; + + busslot = PCI_SLOT(dev->bus->self->devfn); /* Check for built-in bridges. */ if (dev->bus->number != 0 && busslot > 16 -- 2.53.0