diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/time/ntp.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 3fc81066d7f1..c6ae0c249891 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
@@ -39,7 +39,7 @@ static s64 time_offset; /* time adjustment (ns) */ | |||
39 | static long time_constant = 2; /* pll time constant */ | 39 | static long time_constant = 2; /* pll time constant */ |
40 | long time_maxerror = NTP_PHASE_LIMIT; /* maximum error (us) */ | 40 | long time_maxerror = NTP_PHASE_LIMIT; /* maximum error (us) */ |
41 | long time_esterror = NTP_PHASE_LIMIT; /* estimated error (us) */ | 41 | long time_esterror = NTP_PHASE_LIMIT; /* estimated error (us) */ |
42 | long time_freq; /* frequency offset (scaled ppm)*/ | 42 | static s64 time_freq; /* frequency offset (scaled ns/s)*/ |
43 | static long time_reftime; /* time at last adjustment (s) */ | 43 | static long time_reftime; /* time at last adjustment (s) */ |
44 | long time_adjust; | 44 | long time_adjust; |
45 | static long ntp_tick_adj; | 45 | static long ntp_tick_adj; |
@@ -49,7 +49,7 @@ static void ntp_update_frequency(void) | |||
49 | u64 second_length = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ) | 49 | u64 second_length = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ) |
50 | << TICK_LENGTH_SHIFT; | 50 | << TICK_LENGTH_SHIFT; |
51 | second_length += (s64)ntp_tick_adj << TICK_LENGTH_SHIFT; | 51 | second_length += (s64)ntp_tick_adj << TICK_LENGTH_SHIFT; |
52 | second_length += (s64)time_freq << (TICK_LENGTH_SHIFT - SHIFT_NSEC); | 52 | second_length += time_freq; |
53 | 53 | ||
54 | tick_length_base = second_length; | 54 | tick_length_base = second_length; |
55 | 55 | ||
@@ -86,16 +86,16 @@ static void ntp_update_offset(long offset) | |||
86 | time_reftime = xtime.tv_sec; | 86 | time_reftime = xtime.tv_sec; |
87 | 87 | ||
88 | freq_adj = time_offset * mtemp; | 88 | freq_adj = time_offset * mtemp; |
89 | freq_adj = shift_right(freq_adj, time_constant * 2 + | 89 | freq_adj <<= TICK_LENGTH_SHIFT - 2 * (SHIFT_PLL + 2 + time_constant); |
90 | (SHIFT_PLL + 2) * 2 - SHIFT_NSEC); | ||
91 | time_status &= ~STA_MODE; | 90 | time_status &= ~STA_MODE; |
92 | if (mtemp >= MINSEC && (time_status & STA_FLL || mtemp > MAXSEC)) { | 91 | if (mtemp >= MINSEC && (time_status & STA_FLL || mtemp > MAXSEC)) { |
93 | freq_adj += div_s64(time_offset << (SHIFT_NSEC - SHIFT_FLL), mtemp); | 92 | freq_adj += div_s64(time_offset << (TICK_LENGTH_SHIFT - SHIFT_FLL), |
93 | mtemp); | ||
94 | time_status |= STA_MODE; | 94 | time_status |= STA_MODE; |
95 | } | 95 | } |
96 | freq_adj += time_freq; | 96 | freq_adj += time_freq; |
97 | freq_adj = min(freq_adj, (s64)MAXFREQ_NSEC); | 97 | freq_adj = min(freq_adj, MAXFREQ_SCALED); |
98 | time_freq = max(freq_adj, (s64)-MAXFREQ_NSEC); | 98 | time_freq = max(freq_adj, -MAXFREQ_SCALED); |
99 | time_offset = div_s64(time_offset, NTP_INTERVAL_FREQ); | 99 | time_offset = div_s64(time_offset, NTP_INTERVAL_FREQ); |
100 | time_offset <<= SHIFT_UPDATE; | 100 | time_offset <<= SHIFT_UPDATE; |
101 | } | 101 | } |
@@ -131,7 +131,7 @@ void second_overflow(void) | |||
131 | long time_adj; | 131 | long time_adj; |
132 | 132 | ||
133 | /* Bump the maxerror field */ | 133 | /* Bump the maxerror field */ |
134 | time_maxerror += MAXFREQ >> SHIFT_USEC; | 134 | time_maxerror += MAXFREQ / NSEC_PER_USEC; |
135 | if (time_maxerror > NTP_PHASE_LIMIT) { | 135 | if (time_maxerror > NTP_PHASE_LIMIT) { |
136 | time_maxerror = NTP_PHASE_LIMIT; | 136 | time_maxerror = NTP_PHASE_LIMIT; |
137 | time_status |= STA_UNSYNC; | 137 | time_status |= STA_UNSYNC; |
@@ -323,10 +323,9 @@ int do_adjtimex(struct timex *txc) | |||
323 | time_status &= ~STA_NANO; | 323 | time_status &= ~STA_NANO; |
324 | 324 | ||
325 | if (txc->modes & ADJ_FREQUENCY) { | 325 | if (txc->modes & ADJ_FREQUENCY) { |
326 | time_freq = min(txc->freq, MAXFREQ); | 326 | time_freq = (s64)txc->freq * PPM_SCALE; |
327 | time_freq = min(time_freq, -MAXFREQ); | 327 | time_freq = min(time_freq, MAXFREQ_SCALED); |
328 | time_freq = ((s64)time_freq * NSEC_PER_USEC) | 328 | time_freq = max(time_freq, -MAXFREQ_SCALED); |
329 | >> (SHIFT_USEC - SHIFT_NSEC); | ||
330 | } | 329 | } |
331 | 330 | ||
332 | if (txc->modes & ADJ_MAXERROR) | 331 | if (txc->modes & ADJ_MAXERROR) |
@@ -369,14 +368,15 @@ int do_adjtimex(struct timex *txc) | |||
369 | if (!(time_status & STA_NANO)) | 368 | if (!(time_status & STA_NANO)) |
370 | txc->offset /= NSEC_PER_USEC; | 369 | txc->offset /= NSEC_PER_USEC; |
371 | } | 370 | } |
372 | txc->freq = (time_freq / NSEC_PER_USEC) << | 371 | txc->freq = shift_right((s32)(time_freq >> PPM_SCALE_INV_SHIFT) * |
373 | (SHIFT_USEC - SHIFT_NSEC); | 372 | (s64)PPM_SCALE_INV, |
373 | TICK_LENGTH_SHIFT); | ||
374 | txc->maxerror = time_maxerror; | 374 | txc->maxerror = time_maxerror; |
375 | txc->esterror = time_esterror; | 375 | txc->esterror = time_esterror; |
376 | txc->status = time_status; | 376 | txc->status = time_status; |
377 | txc->constant = time_constant; | 377 | txc->constant = time_constant; |
378 | txc->precision = 1; | 378 | txc->precision = 1; |
379 | txc->tolerance = MAXFREQ; | 379 | txc->tolerance = MAXFREQ_SCALED / PPM_SCALE; |
380 | txc->tick = tick_usec; | 380 | txc->tick = tick_usec; |
381 | 381 | ||
382 | /* PPS is not implemented, so these are zero */ | 382 | /* PPS is not implemented, so these are zero */ |