diff -u arch/ia64/kernel/mca.c arch/ia64/kernel/mca.c --- arch/ia64/kernel/mca.c 2003-03-03 11:41:23.000000000 -0700 +++ arch/ia64/kernel/mca.c 2003-03-07 12:07:53.000000000 -0700 @@ -877,11 +877,16 @@ /* Switch to polling mode */ cmc_polling_enabled = 1; - /* Unlock before smp_call_function or risk deadlock */ + /* + * Unlock & enable interrupts before + * smp_call_function or risk deadlock + */ spin_unlock(&cmc_history_lock); - smp_call_function(ia64_mca_cmc_vector_disable, NULL, 1, 1); ia64_mca_cmc_vector_disable(NULL); + local_irq_enable(); + smp_call_function(ia64_mca_cmc_vector_disable, NULL, 1, 1); + /* * Corrected errors will still be corrected, but * make sure there's a log somewhere that indicates @@ -970,8 +975,8 @@ start_count = IA64_LOG_COUNT(SAL_INFO_TYPE_CMC); /* Call the interrupt handler */ - local_irq_disable(); smp_call_function(ia64_mca_cmc_int_caller, NULL, 1, 1); + local_irq_disable(); ia64_mca_cmc_int_caller(NULL); local_irq_enable(); @@ -1022,8 +1027,8 @@ start_count = IA64_LOG_COUNT(SAL_INFO_TYPE_CPE); /* Call the interrupt handler */ - local_irq_disable(); smp_call_function(ia64_mca_cpe_int_caller, NULL, 1, 1); + local_irq_disable(); ia64_mca_cpe_int_caller(NULL); local_irq_enable();