@@ -66,7 +66,7 @@ void ntp_update_frequency(void)
66
66
{
67
67
tick_length_base = (u64 )(tick_usec * NSEC_PER_USEC * USER_HZ ) << TICK_LENGTH_SHIFT ;
68
68
tick_length_base += (s64 )CLOCK_TICK_ADJUST << TICK_LENGTH_SHIFT ;
69
- tick_length_base += (( s64 )time_freq * NSEC_PER_USEC ) << (TICK_LENGTH_SHIFT - SHIFT_USEC );
69
+ tick_length_base += (s64 )time_freq << (TICK_LENGTH_SHIFT - SHIFT_NSEC );
70
70
71
71
do_div (tick_length_base , HZ );
72
72
@@ -200,6 +200,7 @@ void __attribute__ ((weak)) notify_arch_cmos_timer(void)
200
200
int do_adjtimex (struct timex * txc )
201
201
{
202
202
long ltemp , mtemp , save_adjust ;
203
+ s64 freq_adj ;
203
204
int result ;
204
205
205
206
/* In order to modify anything, you gotta be super-user! */
@@ -245,7 +246,7 @@ int do_adjtimex(struct timex *txc)
245
246
result = - EINVAL ;
246
247
goto leave ;
247
248
}
248
- time_freq = txc -> freq ;
249
+ time_freq = (( s64 ) txc -> freq * NSEC_PER_USEC ) >> ( SHIFT_USEC - SHIFT_NSEC ) ;
249
250
}
250
251
251
252
if (txc -> modes & ADJ_MAXERROR ) {
@@ -278,14 +279,14 @@ int do_adjtimex(struct timex *txc)
278
279
time_adjust = txc -> offset ;
279
280
}
280
281
else if (time_status & STA_PLL ) {
281
- ltemp = txc -> offset ;
282
+ ltemp = txc -> offset * NSEC_PER_USEC ;
282
283
283
284
/*
284
285
* Scale the phase adjustment and
285
286
* clamp to the operating range.
286
287
*/
287
- time_offset = min (ltemp , MAXPHASE );
288
- time_offset = max (time_offset , - MAXPHASE );
288
+ time_offset = min (ltemp , MAXPHASE * NSEC_PER_USEC );
289
+ time_offset = max (time_offset , - MAXPHASE * NSEC_PER_USEC );
289
290
290
291
/*
291
292
* Select whether the frequency is to be controlled
@@ -297,24 +298,31 @@ int do_adjtimex(struct timex *txc)
297
298
time_reftime = xtime .tv_sec ;
298
299
mtemp = xtime .tv_sec - time_reftime ;
299
300
time_reftime = xtime .tv_sec ;
301
+ freq_adj = 0 ;
300
302
if (time_status & STA_FLL ) {
301
303
if (mtemp >= MINSEC ) {
302
- ltemp = ((time_offset << 12 ) / mtemp ) << (SHIFT_USEC - 12 );
303
- time_freq += shift_right (ltemp , SHIFT_KH );
304
+ freq_adj = (s64 )time_offset << (SHIFT_NSEC - SHIFT_KH );
305
+ if (time_offset < 0 ) {
306
+ freq_adj = - freq_adj ;
307
+ do_div (freq_adj , mtemp );
308
+ freq_adj = - freq_adj ;
309
+ } else
310
+ do_div (freq_adj , mtemp );
304
311
} else /* calibration interval too short (p. 12) */
305
312
result = TIME_ERROR ;
306
313
} else { /* PLL mode */
307
314
if (mtemp < MAXSEC ) {
308
- ltemp *= mtemp ;
309
- time_freq + = shift_right (ltemp ,(time_constant +
315
+ freq_adj = ( s64 ) ltemp * mtemp ;
316
+ freq_adj = shift_right (freq_adj ,(time_constant +
310
317
time_constant +
311
- SHIFT_KF - SHIFT_USEC ));
318
+ SHIFT_KF - SHIFT_NSEC ));
312
319
} else /* calibration interval too long (p. 12) */
313
320
result = TIME_ERROR ;
314
321
}
315
- time_freq = min (time_freq , MAXFREQ );
316
- time_freq = max (time_freq , - MAXFREQ );
317
- time_offset = (time_offset * NSEC_PER_USEC / HZ ) << SHIFT_UPDATE ;
322
+ freq_adj += time_freq ;
323
+ freq_adj = min (freq_adj , (s64 )MAXFREQ_NSEC );
324
+ time_freq = max (freq_adj , (s64 )- MAXFREQ_NSEC );
325
+ time_offset = (time_offset / HZ ) << SHIFT_UPDATE ;
318
326
} /* STA_PLL */
319
327
} /* txc->modes & ADJ_OFFSET */
320
328
if (txc -> modes & ADJ_TICK )
@@ -330,7 +338,7 @@ leave: if ((time_status & (STA_UNSYNC|STA_CLOCKERR)) != 0)
330
338
txc -> offset = save_adjust ;
331
339
else
332
340
txc -> offset = shift_right (time_offset , SHIFT_UPDATE ) * HZ / 1000 ;
333
- txc -> freq = time_freq ;
341
+ txc -> freq = ( time_freq / NSEC_PER_USEC ) << ( SHIFT_USEC - SHIFT_NSEC ) ;
334
342
txc -> maxerror = time_maxerror ;
335
343
txc -> esterror = time_esterror ;
336
344
txc -> status = time_status ;
0 commit comments