diff options
Diffstat (limited to 'arch/i386/kernel/timers/timer_hpet.c')
-rw-r--r-- | arch/i386/kernel/timers/timer_hpet.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/i386/kernel/timers/timer_hpet.c b/arch/i386/kernel/timers/timer_hpet.c index 713134e71844..f778f471a09a 100644 --- a/arch/i386/kernel/timers/timer_hpet.c +++ b/arch/i386/kernel/timers/timer_hpet.c | |||
@@ -79,7 +79,7 @@ static unsigned long get_offset_hpet(void) | |||
79 | 79 | ||
80 | eax = hpet_readl(HPET_COUNTER); | 80 | eax = hpet_readl(HPET_COUNTER); |
81 | eax -= hpet_last; /* hpet delta */ | 81 | eax -= hpet_last; /* hpet delta */ |
82 | 82 | eax = min(hpet_tick, eax); | |
83 | /* | 83 | /* |
84 | * Time offset = (hpet delta) * ( usecs per HPET clock ) | 84 | * Time offset = (hpet delta) * ( usecs per HPET clock ) |
85 | * = (hpet delta) * ( usecs per tick / HPET clocks per tick) | 85 | * = (hpet delta) * ( usecs per tick / HPET clocks per tick) |
@@ -105,9 +105,12 @@ static void mark_offset_hpet(void) | |||
105 | last_offset = ((unsigned long long)last_tsc_high<<32)|last_tsc_low; | 105 | last_offset = ((unsigned long long)last_tsc_high<<32)|last_tsc_low; |
106 | rdtsc(last_tsc_low, last_tsc_high); | 106 | rdtsc(last_tsc_low, last_tsc_high); |
107 | 107 | ||
108 | offset = hpet_readl(HPET_T0_CMP) - hpet_tick; | 108 | if (hpet_use_timer) |
109 | if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) { | 109 | offset = hpet_readl(HPET_T0_CMP) - hpet_tick; |
110 | int lost_ticks = (offset - hpet_last) / hpet_tick; | 110 | else |
111 | offset = hpet_readl(HPET_COUNTER); | ||
112 | if (unlikely(((offset - hpet_last) >= (2*hpet_tick)) && (hpet_last != 0))) { | ||
113 | int lost_ticks = ((offset - hpet_last) / hpet_tick) - 1; | ||
111 | jiffies_64 += lost_ticks; | 114 | jiffies_64 += lost_ticks; |
112 | } | 115 | } |
113 | hpet_last = offset; | 116 | hpet_last = offset; |