|
@@ -478,7 +478,7 @@ eeh_slot_availability(struct pci_dn *pdn)
|
|
|
|
|
|
printk (KERN_ERR "EEH: Slot unavailable: rc=%d, rets=%d %d %d\n",
|
|
|
rc, rets[0], rets[1], rets[2]);
|
|
|
- return -1;
|
|
|
+ return -2;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -546,11 +546,10 @@ rtas_pci_slot_reset(struct pci_dn *pdn, int state)
|
|
|
BUID_HI(pdn->phb->buid),
|
|
|
BUID_LO(pdn->phb->buid),
|
|
|
state);
|
|
|
- if (rc) {
|
|
|
- printk (KERN_WARNING "EEH: Unable to reset the failed slot, (%d) #RST=%d dn=%s\n",
|
|
|
+ if (rc)
|
|
|
+ printk (KERN_WARNING "EEH: Unable to reset the failed slot,"
|
|
|
+ " (%d) #RST=%d dn=%s\n",
|
|
|
rc, state, pdn->node->full_name);
|
|
|
- return;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -560,11 +559,8 @@ rtas_pci_slot_reset(struct pci_dn *pdn, int state)
|
|
|
* Return 0 if success, else a non-zero value.
|
|
|
*/
|
|
|
|
|
|
-int
|
|
|
-rtas_set_slot_reset(struct pci_dn *pdn)
|
|
|
+static void __rtas_set_slot_reset(struct pci_dn *pdn)
|
|
|
{
|
|
|
- int i, rc;
|
|
|
-
|
|
|
rtas_pci_slot_reset (pdn, 1);
|
|
|
|
|
|
/* The PCI bus requires that the reset be held high for at least
|
|
@@ -585,17 +581,33 @@ rtas_set_slot_reset(struct pci_dn *pdn)
|
|
|
* up traffic. */
|
|
|
#define PCI_BUS_SETTLE_TIME_MSEC 1800
|
|
|
msleep (PCI_BUS_SETTLE_TIME_MSEC);
|
|
|
+}
|
|
|
+
|
|
|
+int rtas_set_slot_reset(struct pci_dn *pdn)
|
|
|
+{
|
|
|
+ int i, rc;
|
|
|
+
|
|
|
+ __rtas_set_slot_reset(pdn);
|
|
|
|
|
|
/* Now double check with the firmware to make sure the device is
|
|
|
* ready to be used; if not, wait for recovery. */
|
|
|
for (i=0; i<10; i++) {
|
|
|
rc = eeh_slot_availability (pdn);
|
|
|
- if (rc < 0)
|
|
|
- printk (KERN_ERR "EEH: failed (%d) to reset slot %s\n", rc, pdn->node->full_name);
|
|
|
if (rc == 0)
|
|
|
return 0;
|
|
|
- if (rc < 0)
|
|
|
+
|
|
|
+ if (rc == -2) {
|
|
|
+ printk (KERN_ERR "EEH: failed (%d) to reset slot %s\n",
|
|
|
+ i, pdn->node->full_name);
|
|
|
+ __rtas_set_slot_reset(pdn);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rc < 0) {
|
|
|
+ printk (KERN_ERR "EEH: unrecoverable slot failure %s\n",
|
|
|
+ pdn->node->full_name);
|
|
|
return -1;
|
|
|
+ }
|
|
|
|
|
|
msleep (rc+100);
|
|
|
}
|