[PATCH] powerpc/pseries: Increment fail counter in PCI recovery
authorLinas Vepstas <linas@austin.ibm.com>
Fri, 28 Apr 2006 22:39:38 +0000 (17:39 -0500)
committerPaul Mackerras <paulus@samba.org>
Fri, 19 May 2006 03:51:12 +0000 (13:51 +1000)
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>
arch/powerpc/platforms/pseries/eeh_driver.c

index 2a9eb26307306fa2b447f18cdde1ea2399de7d4e..4d45347afabc74a782c10037dee8308a92faf3ca 100644 (file)
@@ -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;
 }