diff -urN linux-2.6.0-test11/arch/i386/kernel/apic.c linux-2.6.0-test11-nf2/arch/i386/kernel/apic.c --- linux-2.6.0-test11/arch/i386/kernel/apic.c 2003-11-26 15:46:07.000000000 -0500 +++ linux-2.6.0-test11-nf2/arch/i386/kernel/apic.c 2003-12-13 15:04:38.000000000 -0500 @@ -1089,6 +1089,32 @@ */ irq_stat[cpu].apic_timer_irqs++; +#ifdef CONFIG_MK7 && CONFIG_BLK_DEV_AMD74XX + /* + * on 2200XP & nforce2 chipset we need 600ns? + * from timer irq start to apic irq ack to prevent + * hard lockups, use apic timer itself. + * C1 disconnect bit related. Ross Dickson. + */ + { + static unsigned int passno, safecnt; + if(!passno {/*calculate timing*/ + safecnt = apic_read(APIC_TMICT) - + ( (600UL * apic_read(APIC_TMICT) ) / + (1000000000UL/HZ) ); + printk("..APIC TIMER ack delay, reload:%u, safe:%u\n", + apic_read(APIC_TMICT), safecnt); + passno++; + } +#if APIC_DEBUG + if(passno<12) { + unsigned int at1 = apic_read(APIC_TMCCT); + if(passno>1) + Dprintk("..APIC TIMER ack delay, predelay count: %u \n", at1 ); + passno++; + } +#endif + /* * NOTE! We'd better ACK the irq immediately, * because timer handling can be slow.