Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 81243
b: refs/heads/master
c: acaa617
h: refs/heads/master
i:
  81241: 37638e0
  81239: 4ed0532
v: v3
  • Loading branch information
Stephen Rothwell authored and Paul Mackerras committed Jan 17, 2008
1 parent 5d09866 commit d943ccd
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 23 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: 885b86e4e7ccc360f8ce4d7fb10dfdfb6e3c8650
refs/heads/master: acaa617620b8b4071c6a3525b0160f4be07412d7
43 changes: 21 additions & 22 deletions trunk/arch/powerpc/platforms/pseries/eeh.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
#include <linux/rbtree.h>
#include <linux/seq_file.h>
#include <linux/spinlock.h>
#include <linux/of.h>

#include <asm/atomic.h>
#include <asm/eeh.h>
#include <asm/eeh_event.h>
Expand Down Expand Up @@ -169,7 +171,6 @@ static void rtas_slot_error_detail(struct pci_dn *pdn, int severity,
*/
static size_t gather_pci_data(struct pci_dn *pdn, char * buf, size_t len)
{
struct device_node *dn;
struct pci_dev *dev = pdn->pcidev;
u32 cfg;
int cap, i;
Expand Down Expand Up @@ -243,12 +244,12 @@ static size_t gather_pci_data(struct pci_dn *pdn, char * buf, size_t len)

/* Gather status on devices under the bridge */
if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) {
dn = pdn->node->child;
while (dn) {
struct device_node *dn;

for_each_child_of_node(pdn->node, dn) {
pdn = PCI_DN(dn);
if (pdn)
n += gather_pci_data(pdn, buf+n, len-n);
dn = dn->sibling;
}
}

Expand Down Expand Up @@ -372,17 +373,19 @@ struct device_node * find_device_pe(struct device_node *dn)
return dn;
}

/** Mark all devices that are peers of this device as failed.
/** Mark all devices that are children of this device as failed.
* Mark the device driver too, so that it can see the failure
* immediately; this is critical, since some drivers poll
* status registers in interrupts ... If a driver is polling,
* and the slot is frozen, then the driver can deadlock in
* an interrupt context, which is bad.
*/

static void __eeh_mark_slot (struct device_node *dn, int mode_flag)
static void __eeh_mark_slot(struct device_node *parent, int mode_flag)
{
while (dn) {
struct device_node *dn;

for_each_child_of_node(parent, dn) {
if (PCI_DN(dn)) {
/* Mark the pci device driver too */
struct pci_dev *dev = PCI_DN(dn)->pcidev;
Expand All @@ -392,10 +395,8 @@ static void __eeh_mark_slot (struct device_node *dn, int mode_flag)
if (dev && dev->driver)
dev->error_state = pci_channel_io_frozen;

if (dn->child)
__eeh_mark_slot (dn->child, mode_flag);
__eeh_mark_slot(dn, mode_flag);
}
dn = dn->sibling;
}
}

Expand All @@ -415,19 +416,19 @@ void eeh_mark_slot (struct device_node *dn, int mode_flag)
if (dev)
dev->error_state = pci_channel_io_frozen;

__eeh_mark_slot (dn->child, mode_flag);
__eeh_mark_slot(dn, mode_flag);
}

static void __eeh_clear_slot (struct device_node *dn, int mode_flag)
static void __eeh_clear_slot(struct device_node *parent, int mode_flag)
{
while (dn) {
struct device_node *dn;

for_each_child_of_node(parent, dn) {
if (PCI_DN(dn)) {
PCI_DN(dn)->eeh_mode &= ~mode_flag;
PCI_DN(dn)->eeh_check_count = 0;
if (dn->child)
__eeh_clear_slot (dn->child, mode_flag);
__eeh_clear_slot(dn, mode_flag);
}
dn = dn->sibling;
}
}

Expand All @@ -444,7 +445,7 @@ void eeh_clear_slot (struct device_node *dn, int mode_flag)

PCI_DN(dn)->eeh_mode &= ~mode_flag;
PCI_DN(dn)->eeh_check_count = 0;
__eeh_clear_slot (dn->child, mode_flag);
__eeh_clear_slot(dn, mode_flag);
spin_unlock_irqrestore(&confirm_error_lock, flags);
}

Expand Down Expand Up @@ -849,11 +850,8 @@ void eeh_restore_bars(struct pci_dn *pdn)
if ((pdn->eeh_mode & EEH_MODE_SUPPORTED) && !IS_BRIDGE(pdn->class_code))
__restore_bars (pdn);

dn = pdn->node->child;
while (dn) {
for_each_child_of_node(pdn->node, dn)
eeh_restore_bars (PCI_DN(dn));
dn = dn->sibling;
}
}

/**
Expand Down Expand Up @@ -1131,7 +1129,8 @@ static void eeh_add_device_early(struct device_node *dn)
void eeh_add_device_tree_early(struct device_node *dn)
{
struct device_node *sib;
for (sib = dn->child; sib; sib = sib->sibling)

for_each_child_of_node(dn, sib)
eeh_add_device_tree_early(sib);
eeh_add_device_early(dn);
}
Expand Down

0 comments on commit d943ccd

Please sign in to comment.