|
@@ -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);
|
|
|
|