From 519989f8b19ef5fdb68e36b55fbe56fd5e31ee55 Mon Sep 17 00:00:00 2001 From: Stephen Rothwell Date: Thu, 10 Nov 2005 16:07:12 +1100 Subject: [PATCH] --- yaml --- r: 13745 b: refs/heads/master c: fe360cdfd26503a6def1dfebc0ef8371c5071340 h: refs/heads/master i: 13743: 5d14dae51f4dc8da95358c431394c54d68c43e93 v: v3 --- [refs] | 2 +- trunk/arch/powerpc/platforms/pseries/eeh.c | 48 ++++++++-------------- trunk/arch/ppc64/kernel/pci.c | 2 + trunk/drivers/pci/hotplug/rpadlpar_core.c | 2 +- trunk/include/asm-powerpc/ppc-pci.h | 7 ---- trunk/include/asm-ppc64/prom.h | 2 - trunk/include/asm-ppc64/system.h | 2 - 7 files changed, 20 insertions(+), 45 deletions(-) diff --git a/[refs] b/[refs] index e146434fb5ef..75d7c3a59ef6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 97671e4b295fba1b7d3de2984f98bcdaeb197a26 +refs/heads/master: fe360cdfd26503a6def1dfebc0ef8371c5071340 diff --git a/trunk/arch/powerpc/platforms/pseries/eeh.c b/trunk/arch/powerpc/platforms/pseries/eeh.c index 79de2310e70b..3a857b22aa1e 100644 --- a/trunk/arch/powerpc/platforms/pseries/eeh.c +++ b/trunk/arch/powerpc/platforms/pseries/eeh.c @@ -478,47 +478,32 @@ static struct device_node * find_device_pe(struct device_node *dn) * 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 *dn) { while (dn) { - if (PCI_DN(dn)) { - PCI_DN(dn)->eeh_mode |= mode_flag; + PCI_DN(dn)->eeh_mode |= EEH_MODE_ISOLATED; - if (dn->child) - __eeh_mark_slot (dn->child, mode_flag); - } + if (dn->child) + __eeh_mark_slot (dn->child); dn = dn->sibling; } } -void eeh_mark_slot (struct device_node *dn, int mode_flag) -{ - dn = find_device_pe (dn); - PCI_DN(dn)->eeh_mode |= mode_flag; - __eeh_mark_slot (dn->child, mode_flag); -} - -static void __eeh_clear_slot (struct device_node *dn, int mode_flag) +static void __eeh_clear_slot (struct device_node *dn) { while (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); - } + PCI_DN(dn)->eeh_mode &= ~EEH_MODE_ISOLATED; + if (dn->child) + __eeh_clear_slot (dn->child); dn = dn->sibling; } } -void eeh_clear_slot (struct device_node *dn, int mode_flag) +static inline void eeh_clear_slot (struct device_node *dn) { unsigned long flags; spin_lock_irqsave(&confirm_error_lock, flags); - dn = find_device_pe (dn); - 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); spin_unlock_irqrestore(&confirm_error_lock, flags); } @@ -543,6 +528,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) int rets[3]; unsigned long flags; struct pci_dn *pdn; + struct device_node *pe_dn; int rc = 0; __get_cpu_var(total_mmio_ffs)++; @@ -644,7 +630,8 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) /* Avoid repeated reports of this failure, including problems * with other functions on this device, and functions under * bridges. */ - eeh_mark_slot (dn, EEH_MODE_ISOLATED); + pe_dn = find_device_pe (dn); + __eeh_mark_slot (pe_dn); spin_unlock_irqrestore(&confirm_error_lock, flags); eeh_send_failure_event (dn, dev, rets[0], rets[2]); @@ -756,6 +743,9 @@ rtas_pci_slot_reset(struct pci_dn *pdn, int state) rc, state, pdn->node->full_name); return; } + + if (state == 0) + eeh_clear_slot (pdn->node->parent->child); } /** rtas_set_slot_reset -- assert the pci #RST line for 1/4 second @@ -774,12 +764,6 @@ rtas_set_slot_reset(struct pci_dn *pdn) #define PCI_BUS_RST_HOLD_TIME_MSEC 250 msleep (PCI_BUS_RST_HOLD_TIME_MSEC); - - /* We might get hit with another EEH freeze as soon as the - * pci slot reset line is dropped. Make sure we don't miss - * these, and clear the flag now. */ - eeh_clear_slot (pdn->node, EEH_MODE_ISOLATED); - rtas_pci_slot_reset (pdn, 0); /* After a PCI slot has been reset, the PCI Express spec requires diff --git a/trunk/arch/ppc64/kernel/pci.c b/trunk/arch/ppc64/kernel/pci.c index 46929fb24f3c..3cef1b8f57f0 100644 --- a/trunk/arch/ppc64/kernel/pci.c +++ b/trunk/arch/ppc64/kernel/pci.c @@ -548,8 +548,10 @@ static int __init pcibios_init(void) if (ppc64_isabridge_dev != NULL) printk("ISA bridge at %s\n", pci_name(ppc64_isabridge_dev)); +#ifdef CONFIG_PPC_MULTIPLATFORM /* map in PCI I/O space */ phbs_remap_io(); +#endif printk("PCI: Probing PCI hardware done\n"); diff --git a/trunk/drivers/pci/hotplug/rpadlpar_core.c b/trunk/drivers/pci/hotplug/rpadlpar_core.c index e8593a60ee89..fcb66b9a0e28 100644 --- a/trunk/drivers/pci/hotplug/rpadlpar_core.c +++ b/trunk/drivers/pci/hotplug/rpadlpar_core.c @@ -306,7 +306,7 @@ static int dlpar_add_phb(char *drc_name, struct device_node *dn) { struct pci_controller *phb; - if (PCI_DN(dn) && PCI_DN(dn)->phb) { + if (PCI_DN(dn)->phb) { /* PHB already exists */ return -EINVAL; } diff --git a/trunk/include/asm-powerpc/ppc-pci.h b/trunk/include/asm-powerpc/ppc-pci.h index 9896fade98a7..d86c47872bea 100644 --- a/trunk/include/asm-powerpc/ppc-pci.h +++ b/trunk/include/asm-powerpc/ppc-pci.h @@ -87,13 +87,6 @@ void rtas_configure_bridge(struct pci_dn *); int rtas_write_config(struct pci_dn *, int where, int size, u32 val); -/** - * mark and clear slots: find "partition endpoint" PE and set or - * clear the flags for each subnode of the PE. - */ -void eeh_mark_slot (struct device_node *dn, int mode_flag); -void eeh_clear_slot (struct device_node *dn, int mode_flag); - #endif #endif /* _ASM_POWERPC_PPC_PCI_H */ diff --git a/trunk/include/asm-ppc64/prom.h b/trunk/include/asm-ppc64/prom.h index ddfe186589fa..76bb0266d67c 100644 --- a/trunk/include/asm-ppc64/prom.h +++ b/trunk/include/asm-ppc64/prom.h @@ -204,8 +204,6 @@ extern void of_detach_node(const struct device_node *); extern unsigned long prom_init(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long); extern void finish_device_tree(void); -extern void unflatten_device_tree(void); -extern void early_init_devtree(void *); extern int device_is_compatible(struct device_node *device, const char *); extern int machine_is_compatible(const char *compat); extern unsigned char *get_property(struct device_node *node, const char *name, diff --git a/trunk/include/asm-ppc64/system.h b/trunk/include/asm-ppc64/system.h index bf9a6aba19c9..0cdd66c9f4b7 100644 --- a/trunk/include/asm-ppc64/system.h +++ b/trunk/include/asm-ppc64/system.h @@ -149,8 +149,6 @@ struct thread_struct; extern struct task_struct * _switch(struct thread_struct *prev, struct thread_struct *next); -extern unsigned long klimit; - extern int powersave_nap; /* set if nap mode can be used in idle loop */ /*