diff options
Diffstat (limited to 'arch/x86/kernel/io_apic_32.c')
-rw-r--r-- | arch/x86/kernel/io_apic_32.c | 20 |
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); |