Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6c355be

Browse files
committed
Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
Pull powerpc fixes from Ben Herrenschmidt: "We discovered some breakage in our "EEH" (PCI Error Handling) code while doing error injection, due to a couple of regressions. One of them is due to a patch (37f0219 "powerpc/pci: fix PCI-e devices rescan issue on powerpc platform") that, in hindsight, I shouldn't have merged considering that it caused more problems than it solved. Please pull those two fixes. One for a simple EEH address cache initialization issue. The other one is a patch from Guenter that I had originally planned to put in 3.11 but which happens to also fix that other regression (a kernel oops during EEH error handling and possibly hotplug). With those two, the couple of test machines I've hammered with error injection are remaining up now. EEH appears to still fail to recover on some devices, so there is another problem that Gavin is looking into but at least it's no longer crashing the kernel." * 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: powerpc/pci: Improve device hotplug initialization powerpc/eeh: Add eeh_dev to the cache during boot
2 parents 8d5bc1a + 7846de4 commit 6c355be

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

arch/powerpc/kernel/pci-common.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -994,7 +994,7 @@ void pcibios_setup_bus_self(struct pci_bus *bus)
994994
ppc_md.pci_dma_bus_setup(bus);
995995
}
996996

997-
void pcibios_setup_device(struct pci_dev *dev)
997+
static void pcibios_setup_device(struct pci_dev *dev)
998998
{
999999
/* Fixup NUMA node as it may not be setup yet by the generic
10001000
* code and is needed by the DMA init
@@ -1015,6 +1015,17 @@ void pcibios_setup_device(struct pci_dev *dev)
10151015
ppc_md.pci_irq_fixup(dev);
10161016
}
10171017

1018+
int pcibios_add_device(struct pci_dev *dev)
1019+
{
1020+
/*
1021+
* We can only call pcibios_setup_device() after bus setup is complete,
1022+
* since some of the platform specific DMA setup code depends on it.
1023+
*/
1024+
if (dev->bus->is_added)
1025+
pcibios_setup_device(dev);
1026+
return 0;
1027+
}
1028+
10181029
void pcibios_setup_bus_devices(struct pci_bus *bus)
10191030
{
10201031
struct pci_dev *dev;
@@ -1469,10 +1480,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
14691480
if (ppc_md.pcibios_enable_device_hook(dev))
14701481
return -EINVAL;
14711482

1472-
/* avoid pcie irq fix up impact on cardbus */
1473-
if (dev->hdr_type != PCI_HEADER_TYPE_CARDBUS)
1474-
pcibios_setup_device(dev);
1475-
14761483
return pci_enable_resources(dev, mask);
14771484
}
14781485

arch/powerpc/platforms/pseries/eeh_cache.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,6 @@ void __init eeh_addr_cache_build(void)
294294
spin_lock_init(&pci_io_addr_cache_root.piar_lock);
295295

296296
for_each_pci_dev(dev) {
297-
eeh_addr_cache_insert_dev(dev);
298-
299297
dn = pci_device_to_OF_node(dev);
300298
if (!dn)
301299
continue;
@@ -308,6 +306,8 @@ void __init eeh_addr_cache_build(void)
308306
dev->dev.archdata.edev = edev;
309307
edev->pdev = dev;
310308

309+
eeh_addr_cache_insert_dev(dev);
310+
311311
eeh_sysfs_add_device(dev);
312312
}
313313

0 commit comments

Comments
 (0)