diff options
author | Tony Luck <tony.luck@intel.com> | 2013-03-20 10:30:15 -0700 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2013-04-02 09:37:06 -0700 |
commit | d303e9e98fce56cdb3c6f2ac92f626fc2bd51c77 (patch) | |
tree | 80421d00fe3c7c7502124e641c8918f129e90876 /arch/ia64/include/asm/mca.h | |
parent | 96edc754aa714e51d2044af91b96cc7420c5cb01 (diff) | |
download | blackbird-op-linux-d303e9e98fce56cdb3c6f2ac92f626fc2bd51c77.tar.gz blackbird-op-linux-d303e9e98fce56cdb3c6f2ac92f626fc2bd51c77.zip |
Fix initialization of CMCI/CMCP interrupts
Back 2010 during a revamp of the irq code some initializations
were moved from ia64_mca_init() to ia64_mca_late_init() in
commit c75f2aa13f5b268aba369b5dc566088b5194377c
Cannot use register_percpu_irq() from ia64_mca_init()
But this was hideously wrong. First of all these initializations
are now down far too late. Specifically after all the other cpus
have been brought up and initialized their own CMC vectors from
smp_callin(). Also ia64_mca_late_init() may be called from any cpu
so the line:
ia64_mca_cmc_vector_setup(); /* Setup vector on BSP */
is generally not executed on the BSP, and so the CMC vector isn't
setup at all on that processor.
Make use of the arch_early_irq_init() hook to get this code executed
at just the right moment: not too early, not too late.
Reported-by: Fred Hartnett <fred.hartnett@hp.com>
Tested-by: Fred Hartnett <fred.hartnett@hp.com>
Cc: stable@kernel.org # v2.6.37+
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/include/asm/mca.h')
-rw-r--r-- | arch/ia64/include/asm/mca.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/arch/ia64/include/asm/mca.h b/arch/ia64/include/asm/mca.h index 43f96ab18fa0..8c7096168716 100644 --- a/arch/ia64/include/asm/mca.h +++ b/arch/ia64/include/asm/mca.h @@ -143,6 +143,7 @@ extern unsigned long __per_cpu_mca[NR_CPUS]; extern int cpe_vector; extern int ia64_cpe_irq; extern void ia64_mca_init(void); +extern void ia64_mca_irq_init(void); extern void ia64_mca_cpu_init(void *); extern void ia64_os_mca_dispatch(void); extern void ia64_os_mca_dispatch_end(void); |