* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).