diff options
Diffstat (limited to 'arch/ia64/kernel/mca.c')
| -rw-r--r-- | arch/ia64/kernel/mca.c | 37 | 
1 files changed, 24 insertions, 13 deletions
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 65bf9cd3904..d7396dbb07b 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c @@ -2074,22 +2074,16 @@ ia64_mca_init(void)  	printk(KERN_INFO "MCA related initialization done\n");  } +  /* - * ia64_mca_late_init - * - *	Opportunity to setup things that require initialization later - *	than ia64_mca_init.  Setup a timer to poll for CPEs if the - *	platform doesn't support an interrupt driven mechanism. - * - *  Inputs  :   None - *  Outputs :   Status + * These pieces cannot be done in ia64_mca_init() because it is called before + * early_irq_init() which would wipe out our percpu irq registrations. But we + * cannot leave them until ia64_mca_late_init() because by then all the other + * processors have been brought online and have set their own CMC vectors to + * point at a non-existant action. Called from arch_early_irq_init().   */ -static int __init -ia64_mca_late_init(void) +void __init ia64_mca_irq_init(void)  { -	if (!mca_init) -		return 0; -  	/*  	 *  Configure the CMCI/P vector and handler. Interrupts for CMC are  	 *  per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). @@ -2108,6 +2102,23 @@ ia64_mca_late_init(void)  	/* Setup the CPEI/P handler */  	register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction);  #endif +} + +/* + * ia64_mca_late_init + * + *	Opportunity to setup things that require initialization later + *	than ia64_mca_init.  Setup a timer to poll for CPEs if the + *	platform doesn't support an interrupt driven mechanism. + * + *  Inputs  :   None + *  Outputs :   Status + */ +static int __init +ia64_mca_late_init(void) +{ +	if (!mca_init) +		return 0;  	register_hotcpu_notifier(&mca_cpu_notifier);  |