aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/pseries/eeh_driver.c
diff options
context:
space:
mode:
authorLinas Vepstas <linas@austin.ibm.com>2006-04-28 17:39:38 -0500
committerPaul Mackerras <paulus@samba.org>2006-05-19 13:51:12 +1000
commit4240545661fc0ac25122f166e96633527150300c (patch)
tree9be44f79aa0a37d49744ce5a685ec41d057c60f3 /arch/powerpc/platforms/pseries/eeh_driver.c
parentMerge branch 'for_paulus' of git://git.kernel.org/pub/scm/linux/kernel/git/galak/powerpc (diff)
downloadlinux-dev-4240545661fc0ac25122f166e96633527150300c.tar.xz
linux-dev-4240545661fc0ac25122f166e96633527150300c.zip
[PATCH] powerpc/pseries: Increment fail counter in PCI recovery
When a PCI device driver does not support PCI error recovery, the powerpc/pseries code takes a walk through a branch of code that resets the failure counter. Because of this, if a broken PCI card is present, the kernel will attempt to reset it an infinite number of times. (This is annoying but mostly harmless: each reset takes about 10-20 seconds, and uses almost no CPU time). This patch preserves the failure count across resets. Signed-off-by: Linas Vepstas <linas@austin.ibm.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to '')
-rw-r--r--arch/powerpc/platforms/pseries/eeh_driver.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/powerpc/platforms/pseries/eeh_driver.c b/arch/powerpc/platforms/pseries/eeh_driver.c
index 2a9eb2630730..4d45347afabc 100644
--- a/arch/powerpc/platforms/pseries/eeh_driver.c
+++ b/arch/powerpc/platforms/pseries/eeh_driver.c
@@ -201,7 +201,11 @@ static void eeh_report_failure(struct pci_dev *dev, void *userdata)
static int eeh_reset_device (struct pci_dn *pe_dn, struct pci_bus *bus)
{
- int rc;
+ int cnt, rc;
+
+ /* pcibios will clear the counter; save the value */
+ cnt = pe_dn->eeh_freeze_count;
+
if (bus)
pcibios_remove_pci_devices(bus);
@@ -240,6 +244,7 @@ static int eeh_reset_device (struct pci_dn *pe_dn, struct pci_bus *bus)
ssleep (5);
pcibios_add_pci_devices(bus);
}
+ pe_dn->eeh_freeze_count = cnt;
return 0;
}