From 4f97aa5a6fb11820043712a2c57c2d27871e83c5 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Mon, 29 Dec 2003 23:44:09 -0800 Subject: [PATCH] [PATCH] Fix via686a/KX133 TSC failure From: Chris Bajumpaa This patch fixes a problem with the TSC failing on via686a/KX133 motherboards either reverting to using the pit or deadlocking the machine alltogether under heavy load. (Specifically Abit KA7/KA7-100). Message from the log: Dec 18 18:20:37 grinder kernel: Losing too many ticks! Dec 18 18:20:37 grinder kernel: TSC cannot be used as a timesource. (Are you running with SpeedStep?) Dec 18 18:20:37 grinder kernel: Falling back to a sane timesource. The snippet of code that was missing from timer_tsc.c comes from timer_pit.c. --- arch/i386/kernel/timers/timer_tsc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/arch/i386/kernel/timers/timer_tsc.c b/arch/i386/kernel/timers/timer_tsc.c index 95b915cc14b8f..67db5f6ebe2f5 100644 --- a/arch/i386/kernel/timers/timer_tsc.c +++ b/arch/i386/kernel/timers/timer_tsc.c @@ -183,6 +183,18 @@ static void mark_offset_tsc(void) count = inb_p(PIT_CH0); /* read the latched count */ count |= inb(PIT_CH0) << 8; + + /* + * VIA686a test code... reset the latch if count > max + 1 + * from timer_pit.c - cjb + */ + if (count > LATCH) { + outb_p(0x34, PIT_MODE); + outb_p(LATCH & 0xff, PIT_CH0); + outb(LATCH >> 8, PIT_CH0); + count = LATCH - 1; + } + spin_unlock(&i8253_lock); if (pit_latch_buggy) { -- 2.53.0