Commit 153b5d05 authored by Roman Zippel's avatar Roman Zippel Committed by Linus Torvalds

ntp: support for TAI

This adds support for setting the TAI value (International Atomic Time).  The
value is reported back to userspace via timex (as we don't have a
ntp_gettime() syscall).
Signed-off-by: default avatarRoman Zippel <zippel@linux-m68k.org>
Cc: john stultz <johnstul@us.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 9f14f669
...@@ -65,10 +65,11 @@ struct compat_timex { ...@@ -65,10 +65,11 @@ struct compat_timex {
compat_long_t calcnt; compat_long_t calcnt;
compat_long_t errcnt; compat_long_t errcnt;
compat_long_t stbcnt; compat_long_t stbcnt;
compat_int_t tai;
compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32;
compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32;
compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32;
}; };
#define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW) #define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW)
......
...@@ -121,9 +121,11 @@ struct timex { ...@@ -121,9 +121,11 @@ struct timex {
long errcnt; /* calibration errors (ro) */ long errcnt; /* calibration errors (ro) */
long stbcnt; /* stability limit exceeded (ro) */ long stbcnt; /* stability limit exceeded (ro) */
int tai; /* TAI offset (ro) */
int :32; int :32; int :32; int :32; int :32; int :32; int :32; int :32;
int :32; int :32; int :32; int :32; int :32; int :32; int :32; int :32;
int :32; int :32; int :32; int :32; int :32; int :32; int :32;
}; };
/* /*
...@@ -135,6 +137,7 @@ struct timex { ...@@ -135,6 +137,7 @@ struct timex {
#define ADJ_ESTERROR 0x0008 /* estimated time error */ #define ADJ_ESTERROR 0x0008 /* estimated time error */
#define ADJ_STATUS 0x0010 /* clock status */ #define ADJ_STATUS 0x0010 /* clock status */
#define ADJ_TIMECONST 0x0020 /* pll time constant */ #define ADJ_TIMECONST 0x0020 /* pll time constant */
#define ADJ_TAI 0x0080 /* set TAI offset */
#define ADJ_MICRO 0x1000 /* select microsecond resolution */ #define ADJ_MICRO 0x1000 /* select microsecond resolution */
#define ADJ_NANO 0x2000 /* select nanosecond resolution */ #define ADJ_NANO 0x2000 /* select nanosecond resolution */
#define ADJ_TICK 0x4000 /* tick value */ #define ADJ_TICK 0x4000 /* tick value */
......
...@@ -955,7 +955,8 @@ asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp) ...@@ -955,7 +955,8 @@ asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp)
__put_user(txc.jitcnt, &utp->jitcnt) || __put_user(txc.jitcnt, &utp->jitcnt) ||
__put_user(txc.calcnt, &utp->calcnt) || __put_user(txc.calcnt, &utp->calcnt) ||
__put_user(txc.errcnt, &utp->errcnt) || __put_user(txc.errcnt, &utp->errcnt) ||
__put_user(txc.stbcnt, &utp->stbcnt)) __put_user(txc.stbcnt, &utp->stbcnt) ||
__put_user(txc.tai, &utp->tai))
ret = -EFAULT; ret = -EFAULT;
return ret; return ret;
......
...@@ -35,6 +35,7 @@ static u64 tick_length, tick_length_base; ...@@ -35,6 +35,7 @@ static u64 tick_length, tick_length_base;
/* TIME_ERROR prevents overwriting the CMOS clock */ /* TIME_ERROR prevents overwriting the CMOS clock */
static int time_state = TIME_OK; /* clock synchronization status */ static int time_state = TIME_OK; /* clock synchronization status */
int time_status = STA_UNSYNC; /* clock status bits */ int time_status = STA_UNSYNC; /* clock status bits */
static long time_tai; /* TAI offset (s) */
static s64 time_offset; /* time adjustment (ns) */ static s64 time_offset; /* time adjustment (ns) */
static long time_constant = 2; /* pll time constant */ static long time_constant = 2; /* pll time constant */
long time_maxerror = NTP_PHASE_LIMIT; /* maximum error (us) */ long time_maxerror = NTP_PHASE_LIMIT; /* maximum error (us) */
...@@ -162,6 +163,7 @@ void second_overflow(void) ...@@ -162,6 +163,7 @@ void second_overflow(void)
case TIME_DEL: case TIME_DEL:
if ((xtime.tv_sec + 1) % 86400 == 0) { if ((xtime.tv_sec + 1) % 86400 == 0) {
xtime.tv_sec++; xtime.tv_sec++;
time_tai--;
wall_to_monotonic.tv_sec--; wall_to_monotonic.tv_sec--;
time_state = TIME_WAIT; time_state = TIME_WAIT;
printk(KERN_NOTICE "Clock: deleting leap second " printk(KERN_NOTICE "Clock: deleting leap second "
...@@ -169,6 +171,7 @@ void second_overflow(void) ...@@ -169,6 +171,7 @@ void second_overflow(void)
} }
break; break;
case TIME_OOP: case TIME_OOP:
time_tai++;
time_state = TIME_WAIT; time_state = TIME_WAIT;
break; break;
case TIME_WAIT: case TIME_WAIT:
...@@ -340,6 +343,9 @@ int do_adjtimex(struct timex *txc) ...@@ -340,6 +343,9 @@ int do_adjtimex(struct timex *txc)
time_constant = max(time_constant, 0l); time_constant = max(time_constant, 0l);
} }
if (txc->modes & ADJ_TAI && txc->constant > 0)
time_tai = txc->constant;
if (txc->modes & ADJ_OFFSET) { if (txc->modes & ADJ_OFFSET) {
if (txc->modes == ADJ_OFFSET_SINGLESHOT) if (txc->modes == ADJ_OFFSET_SINGLESHOT)
/* adjtime() is independent from ntp_adjtime() */ /* adjtime() is independent from ntp_adjtime() */
...@@ -377,6 +383,7 @@ int do_adjtimex(struct timex *txc) ...@@ -377,6 +383,7 @@ int do_adjtimex(struct timex *txc)
txc->precision = 1; txc->precision = 1;
txc->tolerance = MAXFREQ_SCALED / PPM_SCALE; txc->tolerance = MAXFREQ_SCALED / PPM_SCALE;
txc->tick = tick_usec; txc->tick = tick_usec;
txc->tai = time_tai;
/* PPS is not implemented, so these are zero */ /* PPS is not implemented, so these are zero */
txc->ppsfreq = 0; txc->ppsfreq = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment