* [PATCH 0/3] powerpc/eeh: for 2.6.23: a fix for bridges, and tweaks
@ 2007-07-26 22:29 Linas Vepstas
2007-07-26 22:30 ` [PATCH 1/3] powerpc/eeh: tweak printk message Linas Vepstas
0 siblings, 1 reply; 4+ messages in thread
From: Linas Vepstas @ 2007-07-26 22:29 UTC (permalink / raw)
To: Paul Mackerras; +Cc: linuxppc-dev
Paul,
The following three patches should be low impact, and I think they could
go into 2.6.23 if its not too late.
-- two are formating/printing fixes/enhancements
-- one fixes the way PCI cards with bridges are handled;
in particular, it avoids a nll pointer deref, so is a serious bugfix.
Linas.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/3] powerpc/eeh: tweak printk message.
2007-07-26 22:29 [PATCH 0/3] powerpc/eeh: for 2.6.23: a fix for bridges, and tweaks Linas Vepstas
@ 2007-07-26 22:30 ` Linas Vepstas
2007-07-26 22:33 ` [PATCH 2/3] powerpc/eeh: Fix pci bridge handling bug Linas Vepstas
0 siblings, 1 reply; 4+ messages in thread
From: Linas Vepstas @ 2007-07-26 22:30 UTC (permalink / raw)
To: Paul Mackerras; +Cc: linuxppc-dev
Print return code to print message. Also fix whitespace.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
arch/powerpc/platforms/pseries/eeh.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Index: linux-2.6.22-git2/arch/powerpc/platforms/pseries/eeh.c
===================================================================
--- linux-2.6.22-git2.orig/arch/powerpc/platforms/pseries/eeh.c 2007-07-24 16:14:22.000000000 -0500
+++ linux-2.6.22-git2/arch/powerpc/platforms/pseries/eeh.c 2007-07-25 13:11:09.000000000 -0500
@@ -750,12 +750,12 @@ int rtas_set_slot_reset(struct pci_dn *p
return 0;
if (rc < 0) {
- printk (KERN_ERR "EEH: unrecoverable slot failure %s\n",
- pdn->node->full_name);
+ printk(KERN_ERR "EEH: unrecoverable slot failure %s\n",
+ pdn->node->full_name);
return -1;
}
- printk (KERN_ERR "EEH: bus reset %d failed on slot %s\n",
- i+1, pdn->node->full_name);
+ printk(KERN_ERR "EEH: bus reset %d failed on slot %s, rc=%d\n",
+ i+1, pdn->node->full_name, rc);
}
return -1;
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/3] powerpc/eeh: Fix pci bridge handling bug
2007-07-26 22:30 ` [PATCH 1/3] powerpc/eeh: tweak printk message Linas Vepstas
@ 2007-07-26 22:33 ` Linas Vepstas
2007-07-26 22:35 ` [PATCH 3/3] powerpc/eeh: dump pci bridge status on event Linas Vepstas
0 siblings, 1 reply; 4+ messages in thread
From: Linas Vepstas @ 2007-07-26 22:33 UTC (permalink / raw)
To: Paul Mackerras; +Cc: linuxppc-dev
The EEH code needs to ignore PCI bridges; sort-of. It was ignoring
them in the wrong place, and thus failing to set up the
PCI_DN(dn)->pcidev pointer. Imprudent dereferencing of this pointer
would lead to a crash on cards with bridges.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
arch/powerpc/platforms/pseries/eeh_cache.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
Index: linux-2.6.22-git2/arch/powerpc/platforms/pseries/eeh_cache.c
===================================================================
--- linux-2.6.22-git2.orig/arch/powerpc/platforms/pseries/eeh_cache.c 2007-07-25 13:10:03.000000000 -0500
+++ linux-2.6.22-git2/arch/powerpc/platforms/pseries/eeh_cache.c 2007-07-25 13:13:41.000000000 -0500
@@ -225,6 +225,10 @@ void pci_addr_cache_insert_device(struct
{
unsigned long flags;
+ /* Ignore PCI bridges */
+ if ((dev->class >> 16) == PCI_BASE_CLASS_BRIDGE)
+ return;
+
spin_lock_irqsave(&pci_io_addr_cache_root.piar_lock, flags);
__pci_addr_cache_insert_device(dev);
spin_unlock_irqrestore(&pci_io_addr_cache_root.piar_lock, flags);
@@ -285,16 +289,13 @@ void __init pci_addr_cache_build(void)
spin_lock_init(&pci_io_addr_cache_root.piar_lock);
while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
- /* Ignore PCI bridges */
- if ((dev->class >> 16) == PCI_BASE_CLASS_BRIDGE)
- continue;
pci_addr_cache_insert_device(dev);
dn = pci_device_to_OF_node(dev);
if (!dn)
continue;
- pci_dev_get (dev); /* matching put is in eeh_remove_device() */
+ pci_dev_get(dev); /* matching put is in eeh_remove_device() */
PCI_DN(dn)->pcidev = dev;
eeh_sysfs_add_device(dev);
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 3/3] powerpc/eeh: dump pci bridge status on event
2007-07-26 22:33 ` [PATCH 2/3] powerpc/eeh: Fix pci bridge handling bug Linas Vepstas
@ 2007-07-26 22:35 ` Linas Vepstas
0 siblings, 0 replies; 4+ messages in thread
From: Linas Vepstas @ 2007-07-26 22:35 UTC (permalink / raw)
To: Paul Mackerras; +Cc: linuxppc-dev
Gather bridge-specific data on EEH events.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
arch/powerpc/platforms/pseries/eeh.c | 27 ++++++++++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
Index: linux-2.6.22-git2/arch/powerpc/platforms/pseries/eeh.c
===================================================================
--- linux-2.6.22-git2.orig/arch/powerpc/platforms/pseries/eeh.c 2007-07-25 16:41:42.000000000 -0500
+++ linux-2.6.22-git2/arch/powerpc/platforms/pseries/eeh.c 2007-07-25 16:42:20.000000000 -0500
@@ -169,6 +169,8 @@ static void rtas_slot_error_detail(struc
*/
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;
int n = 0;
@@ -184,6 +186,17 @@ static size_t gather_pci_data(struct pci
n += scnprintf(buf+n, len-n, "cmd/stat:%x\n", cfg);
printk(KERN_WARNING "EEH: PCI cmd/status register: %08x\n", cfg);
+ /* Gather bridge-specific registers */
+ if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) {
+ rtas_read_config(pdn, PCI_SEC_STATUS, 2, &cfg);
+ n += scnprintf(buf+n, len-n, "sec stat:%x\n", cfg);
+ printk(KERN_WARNING "EEH: Bridge secondary status: %04x\n", cfg);
+
+ rtas_read_config(pdn, PCI_BRIDGE_CONTROL, 2, &cfg);
+ n += scnprintf(buf+n, len-n, "brdg ctl:%x\n", cfg);
+ printk(KERN_WARNING "EEH: Bridge control: %04x\n", cfg);
+ }
+
/* Dump out the PCI-X command and status regs */
cap = pci_find_capability(pdn->pcidev, PCI_CAP_ID_PCIX);
if (cap) {
@@ -209,7 +222,7 @@ static size_t gather_pci_data(struct pci
printk(KERN_WARNING "EEH: PCI-E %02x: %08x\n", i, cfg);
}
- cap = pci_find_ext_capability(pdn->pcidev,PCI_EXT_CAP_ID_ERR);
+ cap = pci_find_ext_capability(pdn->pcidev, PCI_EXT_CAP_ID_ERR);
if (cap) {
n += scnprintf(buf+n, len-n, "pci-e AER:\n");
printk(KERN_WARNING
@@ -222,6 +235,18 @@ static size_t gather_pci_data(struct pci
}
}
}
+
+ /* Gather status on devices under the bridge */
+ if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) {
+ dn = pdn->node->child;
+ while (dn) {
+ pdn = PCI_DN(dn);
+ if (pdn)
+ n += gather_pci_data(pdn, buf+n, len-n);
+ dn = dn->sibling;
+ }
+ }
+
return n;
}
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2007-07-26 22:35 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-26 22:29 [PATCH 0/3] powerpc/eeh: for 2.6.23: a fix for bridges, and tweaks Linas Vepstas
2007-07-26 22:30 ` [PATCH 1/3] powerpc/eeh: tweak printk message Linas Vepstas
2007-07-26 22:33 ` [PATCH 2/3] powerpc/eeh: Fix pci bridge handling bug Linas Vepstas
2007-07-26 22:35 ` [PATCH 3/3] powerpc/eeh: dump pci bridge status on event Linas Vepstas
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.