summaryrefslogtreecommitdiffstats
path: root/arch/ppc64/kernel/xics.c
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@pobox.com>2005-08-15 05:10:26 +0200
committerJeff Garzik <jgarzik@pobox.com>2005-08-15 05:10:26 +0200
commit20445cc9159089d9d6b88d7864578efb10eb6590 (patch)
treefbbb27fd8baa82c77ebc4e020e8ee9ddb57e3ae2 /arch/ppc64/kernel/xics.c
parent[PATCH] hostap: Use ieee80211 WLAN_FC_GET_{TYPE,STYPE} (diff)
parentMerge /spare/repo/linux-2.6/ (diff)
downloadlinux-20445cc9159089d9d6b88d7864578efb10eb6590.tar.xz
linux-20445cc9159089d9d6b88d7864578efb10eb6590.zip
/spare/repo/netdev-2.6 branch 'ieee80211'
Diffstat (limited to 'arch/ppc64/kernel/xics.c')
-rw-r--r--arch/ppc64/kernel/xics.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/arch/ppc64/kernel/xics.c b/arch/ppc64/kernel/xics.c
index 677c4450984a..d9dc6f28d050 100644
--- a/arch/ppc64/kernel/xics.c
+++ b/arch/ppc64/kernel/xics.c
@@ -647,29 +647,30 @@ static void xics_set_affinity(unsigned int virq, cpumask_t cpumask)
}
}
-void xics_teardown_cpu(void)
+void xics_teardown_cpu(int secondary)
{
int cpu = smp_processor_id();
- int status;
ops->cppr_info(cpu, 0x00);
iosync();
/*
- * we need to EOI the IPI if we got here from kexec down IPI
- *
- * xics doesn't care if we duplicate an EOI as long as we
- * don't EOI and raise priority.
- *
- * probably need to check all the other interrupts too
- * should we be flagging idle loop instead?
- * or creating some task to be scheduled?
+ * Some machines need to have at least one cpu in the GIQ,
+ * so leave the master cpu in the group.
*/
- ops->xirr_info_set(cpu, XICS_IPI);
-
- status = rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE,
- (1UL << interrupt_server_size) - 1 - default_distrib_server, 0);
- WARN_ON(status != 0);
+ if (secondary) {
+ /*
+ * we need to EOI the IPI if we got here from kexec down IPI
+ *
+ * probably need to check all the other interrupts too
+ * should we be flagging idle loop instead?
+ * or creating some task to be scheduled?
+ */
+ ops->xirr_info_set(cpu, XICS_IPI);
+ rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE,
+ (1UL << interrupt_server_size) - 1 -
+ default_distrib_server, 0);
+ }
}
#ifdef CONFIG_HOTPLUG_CPU