Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 34133
b: refs/heads/master
c: e102926
h: refs/heads/master
i:
  34131: 45fd993
v: v3
  • Loading branch information
Linas Vepstas authored and Paul Mackerras committed Sep 22, 2006
1 parent 4b5d5be commit 9d8bca0
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3d574abd59d49173ac3096a19575a2f7430505be
refs/heads/master: e102926385b56e593b995ecc433f041b498a49e1
36 changes: 24 additions & 12 deletions trunk/arch/powerpc/platforms/pseries/eeh.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/**
Expand Down Expand Up @@ -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;
}
}

/**
Expand All @@ -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
Expand All @@ -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);
}
Expand Down

0 comments on commit 9d8bca0

Please sign in to comment.