aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/io_apic_32.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/io_apic_32.c')
-rw-r--r--arch/x86/kernel/io_apic_32.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/arch/x86/kernel/io_apic_32.c b/arch/x86/kernel/io_apic_32.c
index a40d54fc1fdd..c64b3f5cc121 100644
--- a/arch/x86/kernel/io_apic_32.c
+++ b/arch/x86/kernel/io_apic_32.c
@@ -2146,19 +2146,17 @@ static inline void __init check_timer(void)
2146 set_intr_gate(vector, interrupt[0]); 2146 set_intr_gate(vector, interrupt[0]);
2147 2147
2148 /* 2148 /*
2149 * Subtle, code in do_timer_interrupt() expects an AEOI 2149 * As IRQ0 is to be enabled in the 8259A, the virtual
2150 * mode for the 8259A whenever interrupts are routed 2150 * wire has to be disabled in the local APIC. Also
2151 * through I/O APICs. Also IRQ0 has to be enabled in 2151 * timer interrupts need to be acknowledged manually in
2152 * the 8259A which implies the virtual wire has to be 2152 * the 8259A for the i82489DX when using the NMI
2153 * disabled in the local APIC. Finally timer interrupts 2153 * watchdog as that APIC treats NMIs as level-triggered.
2154 * need to be acknowledged manually in the 8259A for 2154 * The AEOI mode will finish them in the 8259A
2155 * timer_interrupt() and for the i82489DX when using 2155 * automatically.
2156 * the NMI watchdog.
2157 */ 2156 */
2158 apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); 2157 apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
2159 init_8259A(1); 2158 init_8259A(1);
2160 timer_ack = !cpu_has_tsc; 2159 timer_ack = (nmi_watchdog == NMI_IO_APIC && !APIC_INTEGRATED(ver));
2161 timer_ack |= (nmi_watchdog == NMI_IO_APIC && !APIC_INTEGRATED(ver));
2162 if (timer_over_8254 > 0) 2160 if (timer_over_8254 > 0)
2163 enable_8259A_irq(0); 2161 enable_8259A_irq(0);
2164 2162
@@ -2219,6 +2217,7 @@ static inline void __init check_timer(void)
2219 printk(KERN_WARNING "timer doesn't work through the IO-APIC - disabling NMI Watchdog!\n"); 2217 printk(KERN_WARNING "timer doesn't work through the IO-APIC - disabling NMI Watchdog!\n");
2220 nmi_watchdog = 0; 2218 nmi_watchdog = 0;
2221 } 2219 }
2220 timer_ack = 0;
2222 2221
2223 printk(KERN_INFO "...trying to set up timer as Virtual Wire IRQ..."); 2222 printk(KERN_INFO "...trying to set up timer as Virtual Wire IRQ...");
2224 2223
@@ -2237,7 +2236,6 @@ static inline void __init check_timer(void)
2237 2236
2238 printk(KERN_INFO "...trying to set up timer as ExtINT IRQ..."); 2237 printk(KERN_INFO "...trying to set up timer as ExtINT IRQ...");
2239 2238
2240 timer_ack = 0;
2241 init_8259A(0); 2239 init_8259A(0);
2242 make_8259A_irq(0); 2240 make_8259A_irq(0);
2243 apic_write_around(APIC_LVT0, APIC_DM_EXTINT); 2241 apic_write_around(APIC_LVT0, APIC_DM_EXTINT);