Skip to content

Commit

Permalink
[POWERPC] EEH: restructure multi-function support
Browse files Browse the repository at this point in the history
Rework how multi-function PCI devices are identified and traversed.
This fixes a bug with multi-function recovery on Power4 that was
introduced by a recent Power4 EEH patch.

Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
Linas Vepstas authored and Paul Mackerras committed Mar 22, 2007
1 parent fa1be47 commit 4980d5e
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 18 deletions.
4 changes: 2 additions & 2 deletions arch/powerpc/platforms/pseries/eeh.c
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ void eeh_mark_slot (struct device_node *dn, int mode_flag)
dn = find_device_pe (dn);

/* Back up one, since config addrs might be shared */
if (PCI_DN(dn) && PCI_DN(dn)->eeh_pe_config_addr)
if (!pcibios_find_pci_bus(dn) && PCI_DN(dn->parent))
dn = dn->parent;

PCI_DN(dn)->eeh_mode |= mode_flag;
Expand Down Expand Up @@ -316,7 +316,7 @@ void eeh_clear_slot (struct device_node *dn, int mode_flag)
dn = find_device_pe (dn);

/* Back up one, since config addrs might be shared */
if (PCI_DN(dn) && PCI_DN(dn)->eeh_pe_config_addr)
if (!pcibios_find_pci_bus(dn) && PCI_DN(dn->parent))
dn = dn->parent;

PCI_DN(dn)->eeh_mode &= ~mode_flag;
Expand Down
30 changes: 14 additions & 16 deletions arch/powerpc/platforms/pseries/eeh_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@ 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)
{
struct device_node *dn;
int cnt, rc;

/* pcibios will clear the counter; save the value */
Expand All @@ -264,23 +265,20 @@ static int eeh_reset_device (struct pci_dn *pe_dn, struct pci_bus *bus)
if (rc)
return rc;

/* New-style config addrs might be shared across multiple devices,
* Walk over all functions on this device */
if (pe_dn->eeh_pe_config_addr) {
struct device_node *pe = pe_dn->node;
pe = pe->parent->child;
while (pe) {
struct pci_dn *ppe = PCI_DN(pe);
if (pe_dn->eeh_pe_config_addr == ppe->eeh_pe_config_addr) {
rtas_configure_bridge(ppe);
eeh_restore_bars(ppe);
}
pe = pe->sibling;
/* Walk over all functions on this device. */
dn = pe_dn->node;
if (!pcibios_find_pci_bus(dn) && PCI_DN(dn->parent))
dn = dn->parent->child;

while (dn) {
struct pci_dn *ppe = PCI_DN(dn);
/* On Power4, always true because eeh_pe_config_addr=0 */
if (pe_dn->eeh_pe_config_addr == ppe->eeh_pe_config_addr) {
rtas_configure_bridge(ppe);
eeh_restore_bars(ppe);
}
} else {
rtas_configure_bridge(pe_dn);
eeh_restore_bars(pe_dn);
}
dn = dn->sibling;
}

/* Give the system 5 seconds to finish running the user-space
* hotplug shutdown scripts, e.g. ifdown for ethernet. Yes,
Expand Down

0 comments on commit 4980d5e

Please sign in to comment.