Signed-off-by: Mathieu Desnoyers <mathieu.desnoy...@efficios.com>
Cc: John Stultz <john.stu...@linaro.org>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: Peter Zijlstra <pet...@infradead.org>
---
 include/linux/timekeeper_internal.h |   47 ++++++
 kernel/time/ntp.c                   |  318 +++++++++++++++--------------------
 2 files changed, 187 insertions(+), 178 deletions(-)

diff --git a/include/linux/timekeeper_internal.h 
b/include/linux/timekeeper_internal.h
index c1825eb..eab26e0 100644
--- a/include/linux/timekeeper_internal.h
+++ b/include/linux/timekeeper_internal.h
@@ -10,6 +10,53 @@
 #include <linux/jiffies.h>
 #include <linux/time.h>
 
+/* structure holding internal NTP timekeeping values. */
+struct timekeeper_ntp {
+       /* USER_HZ period (usecs): */
+       unsigned long           tick_usec;
+
+       /* SHIFTED_HZ period (nsecs): */
+       unsigned long           tick_nsec;
+
+       u64                     tick_length;
+       u64                     tick_length_base;
+
+       /* phase-lock loop variables */
+
+       /*
+        * clock synchronization status
+        *
+        * (TIME_ERROR prevents overwriting the CMOS clock)
+        */
+       int                     time_state;
+
+       /* clock status bits: */
+       int                     time_status;
+
+       /* time adjustment (nsecs): */
+       s64                     time_offset;
+
+       /* pll time constant: */
+       long                    time_constant;
+
+       /* maximum error (usecs): */
+       long                    time_maxerror;
+
+       /* estimated error (usecs): */
+       long                    time_esterror;
+
+       /* frequency offset (scaled nsecs/secs): */
+       s64                     time_freq;
+
+       /* time at last adjustment (secs): */
+       long                    time_reftime;
+
+       long                    time_adjust;
+
+       /* constant (boot-param configurable) NTP tick adjustment (upscaled) */
+       s64                     ntp_tick_adj;
+};
+
 /* Structure holding internal timekeeping values. */
 struct timekeeper {
        /* Current clocksource used for timekeeping. */
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
index bb22151..983c212 100644
--- a/kernel/time/ntp.c
+++ b/kernel/time/ntp.c
@@ -16,66 +16,23 @@
 #include <linux/mm.h>
 #include <linux/module.h>
 #include <linux/rtc.h>
+#include <linux/timekeeper_internal.h>
 
 #include "tick-internal.h"
 #include "ntp_internal.h"
 
-/*
- * NTP timekeeping variables:
- *
- * Note: All of the NTP state is protected by the timekeeping locks.
- */
-
-
-/* USER_HZ period (usecs): */
-unsigned long                  tick_usec = TICK_USEC;
-
-/* SHIFTED_HZ period (nsecs): */
-unsigned long                  tick_nsec;
-
-static u64                     tick_length;
-static u64                     tick_length_base;
-
 #define MAX_TICKADJ            500LL           /* usecs */
 #define MAX_TICKADJ_SCALED \
        (((MAX_TICKADJ * NSEC_PER_USEC) << NTP_SCALE_SHIFT) / NTP_INTERVAL_FREQ)
 
-/*
- * phase-lock loop variables
- */
-
-/*
- * clock synchronization status
- *
- * (TIME_ERROR prevents overwriting the CMOS clock)
- */
-static int                     time_state = TIME_OK;
-
-/* clock status bits:                                                  */
-static int                     time_status = STA_UNSYNC;
-
-/* time adjustment (nsecs):                                            */
-static s64                     time_offset;
-
-/* pll time constant:                                                  */
-static long                    time_constant = 2;
-
-/* maximum error (usecs):                                              */
-static long                    time_maxerror = NTP_PHASE_LIMIT;
-
-/* estimated error (usecs):                                            */
-static long                    time_esterror = NTP_PHASE_LIMIT;
-
-/* frequency offset (scaled nsecs/secs):                               */
-static s64                     time_freq;
-
-/* time at last adjustment (secs):                                     */
-static long                    time_reftime;
-
-static long                    time_adjust;
-
-/* constant (boot-param configurable) NTP tick adjustment (upscaled)   */
-static s64                     ntp_tick_adj;
+static struct timekeeper_ntp tk_ntp = {
+       .tick_usec = TICK_USEC,
+       .time_state = TIME_OK,
+       .time_status = STA_UNSYNC,
+       .time_constant = 2,
+       .time_maxerror = NTP_PHASE_LIMIT,
+       .time_esterror = NTP_PHASE_LIMIT,
+};
 
 #ifdef CONFIG_NTP_PPS
 
@@ -116,10 +73,11 @@ static long pps_errcnt;            /* calibration errors */
  */
 static inline s64 ntp_offset_chunk(s64 offset)
 {
-       if (time_status & STA_PPSTIME && time_status & STA_PPSSIGNAL)
+       if (tk_ntp.time_status & STA_PPSTIME
+                       && tk_ntp.time_status & STA_PPSSIGNAL)
                return offset;
        else
-               return shift_right(offset, SHIFT_PLL + time_constant);
+               return shift_right(offset, SHIFT_PLL + tk_ntp.time_constant);
 }
 
 static inline void pps_reset_freq_interval(void)
@@ -152,7 +110,7 @@ static inline void pps_dec_valid(void)
        if (pps_valid > 0)
                pps_valid--;
        else {
-               time_status &= ~(STA_PPSSIGNAL | STA_PPSJITTER |
+               tk_ntp.time_status &= ~(STA_PPSSIGNAL | STA_PPSJITTER |
                                 STA_PPSWANDER | STA_PPSERROR);
                pps_clear();
        }
@@ -165,21 +123,21 @@ static inline void pps_set_freq(s64 freq)
 
 static inline int is_error_status(int status)
 {
-       return (time_status & (STA_UNSYNC|STA_CLOCKERR))
+       return (tk_ntp.time_status & (STA_UNSYNC|STA_CLOCKERR))
                /* PPS signal lost when either PPS time or
                 * PPS frequency synchronization requested
                 */
-               || ((time_status & (STA_PPSFREQ|STA_PPSTIME))
-                       && !(time_status & STA_PPSSIGNAL))
+               || ((tk_ntp.time_status & (STA_PPSFREQ|STA_PPSTIME))
+                       && !(tk_ntp.time_status & STA_PPSSIGNAL))
                /* PPS jitter exceeded when
                 * PPS time synchronization requested */
-               || ((time_status & (STA_PPSTIME|STA_PPSJITTER))
+               || ((tk_ntp.time_status & (STA_PPSTIME|STA_PPSJITTER))
                        == (STA_PPSTIME|STA_PPSJITTER))
                /* PPS wander exceeded or calibration error when
                 * PPS frequency synchronization requested
                 */
-               || ((time_status & STA_PPSFREQ)
-                       && (time_status & (STA_PPSWANDER|STA_PPSERROR)));
+               || ((tk_ntp.time_status & STA_PPSFREQ)
+                       && (tk_ntp.time_status & (STA_PPSWANDER|STA_PPSERROR)));
 }
 
 static inline void pps_fill_timex(struct timex *txc)
@@ -187,7 +145,7 @@ static inline void pps_fill_timex(struct timex *txc)
        txc->ppsfreq       = shift_right((pps_freq >> PPM_SCALE_INV_SHIFT) *
                                         PPM_SCALE_INV, NTP_SCALE_SHIFT);
        txc->jitter        = pps_jitter;
-       if (!(time_status & STA_NANO))
+       if (!(tk_ntp.time_status & STA_NANO))
                txc->jitter /= NSEC_PER_USEC;
        txc->shift         = pps_shift;
        txc->stabil        = pps_stabil;
@@ -201,7 +159,7 @@ static inline void pps_fill_timex(struct timex *txc)
 
 static inline s64 ntp_offset_chunk(s64 offset)
 {
-       return shift_right(offset, SHIFT_PLL + time_constant);
+       return shift_right(offset, SHIFT_PLL + tk_ntp.time_constant);
 }
 
 static inline void pps_reset_freq_interval(void) {}
@@ -236,7 +194,7 @@ static inline void pps_fill_timex(struct timex *txc)
  */
 static inline int ntp_synced(void)
 {
-       return !(time_status & STA_UNSYNC);
+       return !(tk_ntp.time_status & STA_UNSYNC);
 }
 
 
@@ -245,42 +203,42 @@ static inline int ntp_synced(void)
  */
 
 /*
- * Update (tick_length, tick_length_base, tick_nsec), based
- * on (tick_usec, ntp_tick_adj, time_freq):
+ * Update (tk_ntp.tick_length, tk_ntp.tick_length_base, tk_ntp.tick_nsec),
+ * based on (tk_ntp.tick_usec, tk_ntp.ntp_tick_adj, tk_ntp.time_freq):
  */
 static void ntp_update_frequency(void)
 {
        u64 second_length;
        u64 new_base;
 
-       second_length            = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ)
+       second_length = (u64)(tk_ntp.tick_usec * NSEC_PER_USEC * USER_HZ)
                                                << NTP_SCALE_SHIFT;
 
-       second_length           += ntp_tick_adj;
-       second_length           += time_freq;
+       second_length += tk_ntp.ntp_tick_adj;
+       second_length += tk_ntp.time_freq;
 
-       tick_nsec                = div_u64(second_length, HZ) >> 
NTP_SCALE_SHIFT;
-       new_base                 = div_u64(second_length, NTP_INTERVAL_FREQ);
+       tk_ntp.tick_nsec = div_u64(second_length, HZ) >> NTP_SCALE_SHIFT;
+       new_base = div_u64(second_length, NTP_INTERVAL_FREQ);
 
        /*
         * Don't wait for the next second_overflow, apply
         * the change to the tick length immediately:
         */
-       tick_length             += new_base - tick_length_base;
-       tick_length_base         = new_base;
+       tk_ntp.tick_length += new_base - tk_ntp.tick_length_base;
+       tk_ntp.tick_length_base = new_base;
 }
 
 static inline s64 ntp_update_offset_fll(s64 offset64, long secs)
 {
-       time_status &= ~STA_MODE;
+       tk_ntp.time_status &= ~STA_MODE;
 
        if (secs < MINSEC)
                return 0;
 
-       if (!(time_status & STA_FLL) && (secs <= MAXSEC))
+       if (!(tk_ntp.time_status & STA_FLL) && (secs <= MAXSEC))
                return 0;
 
-       time_status |= STA_MODE;
+       tk_ntp.time_status |= STA_MODE;
 
        return div64_long(offset64 << (NTP_SCALE_SHIFT - SHIFT_FLL), secs);
 }
@@ -291,10 +249,10 @@ static void ntp_update_offset(long offset)
        s64 offset64;
        long secs;
 
-       if (!(time_status & STA_PLL))
+       if (!(tk_ntp.time_status & STA_PLL))
                return;
 
-       if (!(time_status & STA_NANO))
+       if (!(tk_ntp.time_status & STA_NANO))
                offset *= NSEC_PER_USEC;
 
        /*
@@ -308,11 +266,11 @@ static void ntp_update_offset(long offset)
         * Select how the frequency is to be controlled
         * and in which mode (PLL or FLL).
         */
-       secs = get_seconds() - time_reftime;
-       if (unlikely(time_status & STA_FREQHOLD))
+       secs = get_seconds() - tk_ntp.time_reftime;
+       if (unlikely(tk_ntp.time_status & STA_FREQHOLD))
                secs = 0;
 
-       time_reftime = get_seconds();
+       tk_ntp.time_reftime = get_seconds();
 
        offset64    = offset;
        freq_adj    = ntp_update_offset_fll(offset64, secs);
@@ -322,17 +280,18 @@ static void ntp_update_offset(long offset)
         * sampling rate (e.g. intermittent network connection)
         * to avoid instability.
         */
-       if (unlikely(secs > 1 << (SHIFT_PLL + 1 + time_constant)))
-               secs = 1 << (SHIFT_PLL + 1 + time_constant);
+       if (unlikely(secs > 1 << (SHIFT_PLL + 1 + tk_ntp.time_constant)))
+               secs = 1 << (SHIFT_PLL + 1 + tk_ntp.time_constant);
 
        freq_adj    += (offset64 * secs) <<
-                       (NTP_SCALE_SHIFT - 2 * (SHIFT_PLL + 2 + time_constant));
+               (NTP_SCALE_SHIFT - 2 * (SHIFT_PLL + 2 + tk_ntp.time_constant));
 
-       freq_adj    = min(freq_adj + time_freq, MAXFREQ_SCALED);
+       freq_adj    = min(freq_adj + tk_ntp.time_freq, MAXFREQ_SCALED);
 
-       time_freq   = max(freq_adj, -MAXFREQ_SCALED);
+       tk_ntp.time_freq   = max(freq_adj, -MAXFREQ_SCALED);
 
-       time_offset = div_s64(offset64 << NTP_SCALE_SHIFT, NTP_INTERVAL_FREQ);
+       tk_ntp.time_offset = div_s64(offset64 << NTP_SCALE_SHIFT,
+               NTP_INTERVAL_FREQ);
 }
 
 /**
@@ -340,15 +299,15 @@ static void ntp_update_offset(long offset)
  */
 void ntp_clear(void)
 {
-       time_adjust     = 0;            /* stop active adjtime() */
-       time_status     |= STA_UNSYNC;
-       time_maxerror   = NTP_PHASE_LIMIT;
-       time_esterror   = NTP_PHASE_LIMIT;
+       tk_ntp.time_adjust      = 0;            /* stop active adjtime() */
+       tk_ntp.time_status      |= STA_UNSYNC;
+       tk_ntp.time_maxerror    = NTP_PHASE_LIMIT;
+       tk_ntp.time_esterror    = NTP_PHASE_LIMIT;
 
        ntp_update_frequency();
 
-       tick_length     = tick_length_base;
-       time_offset     = 0;
+       tk_ntp.tick_length      = tk_ntp.tick_length_base;
+       tk_ntp.time_offset      = 0;
 
        /* Clear PPS state variables */
        pps_clear();
@@ -357,7 +316,7 @@ void ntp_clear(void)
 
 u64 ntp_tick_length(void)
 {
-       return tick_length;
+       return tk_ntp.tick_length;
 }
 
 
@@ -381,79 +340,80 @@ int second_overflow(unsigned long secs)
         * day, the system clock is set back one second; if in leap-delete
         * state, the system clock is set ahead one second.
         */
-       switch (time_state) {
+       switch (tk_ntp.time_state) {
        case TIME_OK:
-               if (time_status & STA_INS)
-                       time_state = TIME_INS;
-               else if (time_status & STA_DEL)
-                       time_state = TIME_DEL;
+               if (tk_ntp.time_status & STA_INS)
+                       tk_ntp.time_state = TIME_INS;
+               else if (tk_ntp.time_status & STA_DEL)
+                       tk_ntp.time_state = TIME_DEL;
                break;
        case TIME_INS:
-               if (!(time_status & STA_INS))
-                       time_state = TIME_OK;
+               if (!(tk_ntp.time_status & STA_INS))
+                       tk_ntp.time_state = TIME_OK;
                else if (secs % 86400 == 0) {
                        leap = -1;
-                       time_state = TIME_OOP;
+                       tk_ntp.time_state = TIME_OOP;
                        printk(KERN_NOTICE
                                "Clock: inserting leap second 23:59:60 UTC\n");
                }
                break;
        case TIME_DEL:
-               if (!(time_status & STA_DEL))
-                       time_state = TIME_OK;
+               if (!(tk_ntp.time_status & STA_DEL))
+                       tk_ntp.time_state = TIME_OK;
                else if ((secs + 1) % 86400 == 0) {
                        leap = 1;
-                       time_state = TIME_WAIT;
+                       tk_ntp.time_state = TIME_WAIT;
                        printk(KERN_NOTICE
                                "Clock: deleting leap second 23:59:59 UTC\n");
                }
                break;
        case TIME_OOP:
-               time_state = TIME_WAIT;
+               tk_ntp.time_state = TIME_WAIT;
                break;
 
        case TIME_WAIT:
-               if (!(time_status & (STA_INS | STA_DEL)))
-                       time_state = TIME_OK;
+               if (!(tk_ntp.time_status & (STA_INS | STA_DEL)))
+                       tk_ntp.time_state = TIME_OK;
                break;
        }
 
 
        /* Bump the maxerror field */
-       time_maxerror += MAXFREQ / NSEC_PER_USEC;
-       if (time_maxerror > NTP_PHASE_LIMIT) {
-               time_maxerror = NTP_PHASE_LIMIT;
-               time_status |= STA_UNSYNC;
+       tk_ntp.time_maxerror += MAXFREQ / NSEC_PER_USEC;
+       if (tk_ntp.time_maxerror > NTP_PHASE_LIMIT) {
+               tk_ntp.time_maxerror = NTP_PHASE_LIMIT;
+               tk_ntp.time_status |= STA_UNSYNC;
        }
 
        /* Compute the phase adjustment for the next second */
-       tick_length      = tick_length_base;
+       tk_ntp.tick_length = tk_ntp.tick_length_base;
 
-       delta            = ntp_offset_chunk(time_offset);
-       time_offset     -= delta;
-       tick_length     += delta;
+       delta = ntp_offset_chunk(tk_ntp.time_offset);
+       tk_ntp.time_offset -= delta;
+       tk_ntp.tick_length += delta;
 
        /* Check PPS signal */
        pps_dec_valid();
 
-       if (!time_adjust)
+       if (!tk_ntp.time_adjust)
                goto out;
 
-       if (time_adjust > MAX_TICKADJ) {
-               time_adjust -= MAX_TICKADJ;
-               tick_length += MAX_TICKADJ_SCALED;
+       if (tk_ntp.time_adjust > MAX_TICKADJ) {
+               tk_ntp.time_adjust -= MAX_TICKADJ;
+               tk_ntp.tick_length += MAX_TICKADJ_SCALED;
                goto out;
        }
 
-       if (time_adjust < -MAX_TICKADJ) {
-               time_adjust += MAX_TICKADJ;
-               tick_length -= MAX_TICKADJ_SCALED;
+       if (tk_ntp.time_adjust < -MAX_TICKADJ) {
+               tk_ntp.time_adjust += MAX_TICKADJ;
+               tk_ntp.tick_length -= MAX_TICKADJ_SCALED;
                goto out;
        }
 
-       tick_length += (s64)(time_adjust * NSEC_PER_USEC / NTP_INTERVAL_FREQ)
+       tk_ntp.tick_length +=
+               (s64)(tk_ntp.time_adjust * NSEC_PER_USEC / NTP_INTERVAL_FREQ)
                                                         << NTP_SCALE_SHIFT;
-       time_adjust = 0;
+       tk_ntp.time_adjust = 0;
 
 out:
        return leap;
@@ -485,7 +445,7 @@ static void sync_cmos_clock(struct work_struct *work)
        }
 
        getnstimeofday(&now);
-       if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) {
+       if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tk_ntp.tick_nsec / 2) {
                struct timespec adjust = now;
 
                fail = -ENODEV;
@@ -531,9 +491,9 @@ void ntp_notify_cmos_timer(void) { }
  */
 static inline void process_adj_status(struct timex *txc, struct timespec *ts)
 {
-       if ((time_status & STA_PLL) && !(txc->status & STA_PLL)) {
-               time_state = TIME_OK;
-               time_status = STA_UNSYNC;
+       if ((tk_ntp.time_status & STA_PLL) && !(txc->status & STA_PLL)) {
+               tk_ntp.time_state = TIME_OK;
+               tk_ntp.time_status = STA_UNSYNC;
                /* restart PPS frequency calibration */
                pps_reset_freq_interval();
        }
@@ -542,12 +502,12 @@ static inline void process_adj_status(struct timex *txc, 
struct timespec *ts)
         * If we turn on PLL adjustments then reset the
         * reference time to current time.
         */
-       if (!(time_status & STA_PLL) && (txc->status & STA_PLL))
-               time_reftime = get_seconds();
+       if (!(tk_ntp.time_status & STA_PLL) && (txc->status & STA_PLL))
+               tk_ntp.time_reftime = get_seconds();
 
        /* only set allowed bits */
-       time_status &= STA_RONLY;
-       time_status |= txc->status & ~STA_RONLY;
+       tk_ntp.time_status &= STA_RONLY;
+       tk_ntp.time_status |= txc->status & ~STA_RONLY;
 }
 
 
@@ -559,31 +519,31 @@ static inline void process_adjtimex_modes(struct timex 
*txc,
                process_adj_status(txc, ts);
 
        if (txc->modes & ADJ_NANO)
-               time_status |= STA_NANO;
+               tk_ntp.time_status |= STA_NANO;
 
        if (txc->modes & ADJ_MICRO)
-               time_status &= ~STA_NANO;
+               tk_ntp.time_status &= ~STA_NANO;
 
        if (txc->modes & ADJ_FREQUENCY) {
-               time_freq = txc->freq * PPM_SCALE;
-               time_freq = min(time_freq, MAXFREQ_SCALED);
-               time_freq = max(time_freq, -MAXFREQ_SCALED);
+               tk_ntp.time_freq = txc->freq * PPM_SCALE;
+               tk_ntp.time_freq = min(tk_ntp.time_freq, MAXFREQ_SCALED);
+               tk_ntp.time_freq = max(tk_ntp.time_freq, -MAXFREQ_SCALED);
                /* update pps_freq */
-               pps_set_freq(time_freq);
+               pps_set_freq(tk_ntp.time_freq);
        }
 
        if (txc->modes & ADJ_MAXERROR)
-               time_maxerror = txc->maxerror;
+               tk_ntp.time_maxerror = txc->maxerror;
 
        if (txc->modes & ADJ_ESTERROR)
-               time_esterror = txc->esterror;
+               tk_ntp.time_esterror = txc->esterror;
 
        if (txc->modes & ADJ_TIMECONST) {
-               time_constant = txc->constant;
-               if (!(time_status & STA_NANO))
-                       time_constant += 4;
-               time_constant = min(time_constant, (long)MAXTC);
-               time_constant = max(time_constant, 0l);
+               tk_ntp.time_constant = txc->constant;
+               if (!(tk_ntp.time_status & STA_NANO))
+                       tk_ntp.time_constant += 4;
+               tk_ntp.time_constant = min(tk_ntp.time_constant, (long)MAXTC);
+               tk_ntp.time_constant = max(tk_ntp.time_constant, 0l);
        }
 
        if (txc->modes & ADJ_TAI && txc->constant > 0)
@@ -593,7 +553,7 @@ static inline void process_adjtimex_modes(struct timex *txc,
                ntp_update_offset(txc->offset);
 
        if (txc->modes & ADJ_TICK)
-               tick_usec = txc->tick;
+               tk_ntp.tick_usec = txc->tick;
 
        if (txc->modes & (ADJ_TICK|ADJ_FREQUENCY|ADJ_OFFSET))
                ntp_update_frequency();
@@ -643,11 +603,11 @@ int __do_adjtimex(struct timex *txc, struct timespec *ts, 
s32 *time_tai)
        int result;
 
        if (txc->modes & ADJ_ADJTIME) {
-               long save_adjust = time_adjust;
+               long save_adjust = tk_ntp.time_adjust;
 
                if (!(txc->modes & ADJ_OFFSET_READONLY)) {
                        /* adjtime() is independent from ntp_adjtime() */
-                       time_adjust = txc->offset;
+                       tk_ntp.time_adjust = txc->offset;
                        ntp_update_frequency();
                }
                txc->offset = save_adjust;
@@ -657,34 +617,35 @@ int __do_adjtimex(struct timex *txc, struct timespec *ts, 
s32 *time_tai)
                if (txc->modes)
                        process_adjtimex_modes(txc, ts, time_tai);
 
-               txc->offset = shift_right(time_offset * NTP_INTERVAL_FREQ,
+               txc->offset =
+                       shift_right(tk_ntp.time_offset * NTP_INTERVAL_FREQ,
                                  NTP_SCALE_SHIFT);
-               if (!(time_status & STA_NANO))
+               if (!(tk_ntp.time_status & STA_NANO))
                        txc->offset /= NSEC_PER_USEC;
        }
 
-       result = time_state;    /* mostly `TIME_OK' */
+       result = tk_ntp.time_state;     /* mostly `TIME_OK' */
        /* check for errors */
-       if (is_error_status(time_status))
+       if (is_error_status(tk_ntp.time_status))
                result = TIME_ERROR;
 
-       txc->freq          = shift_right((time_freq >> PPM_SCALE_INV_SHIFT) *
-                                        PPM_SCALE_INV, NTP_SCALE_SHIFT);
-       txc->maxerror      = time_maxerror;
-       txc->esterror      = time_esterror;
-       txc->status        = time_status;
-       txc->constant      = time_constant;
-       txc->precision     = 1;
-       txc->tolerance     = MAXFREQ_SCALED / PPM_SCALE;
-       txc->tick          = tick_usec;
-       txc->tai           = *time_tai;
+       txc->freq = shift_right((tk_ntp.time_freq >> PPM_SCALE_INV_SHIFT) *
+               PPM_SCALE_INV, NTP_SCALE_SHIFT);
+       txc->maxerror = tk_ntp.time_maxerror;
+       txc->esterror = tk_ntp.time_esterror;
+       txc->status = tk_ntp.time_status;
+       txc->constant = tk_ntp.time_constant;
+       txc->precision = 1;
+       txc->tolerance = MAXFREQ_SCALED / PPM_SCALE;
+       txc->tick = tk_ntp.tick_usec;
+       txc->tai = *time_tai;
 
        /* fill PPS status fields */
        pps_fill_timex(txc);
 
        txc->time.tv_sec = ts->tv_sec;
        txc->time.tv_usec = ts->tv_nsec;
-       if (!(time_status & STA_NANO))
+       if (!(tk_ntp.time_status & STA_NANO))
                txc->time.tv_usec /= NSEC_PER_USEC;
 
        return result;
@@ -781,7 +742,7 @@ static long hardpps_update_freq(struct pps_normtime 
freq_norm)
 
        /* check if the frequency interval was too long */
        if (freq_norm.sec > (2 << pps_shift)) {
-               time_status |= STA_PPSERROR;
+               tk_ntp.time_status |= STA_PPSERROR;
                pps_errcnt++;
                pps_dec_freq_interval();
                pr_err("hardpps: PPSERROR: interval too long - %ld s\n",
@@ -799,7 +760,7 @@ static long hardpps_update_freq(struct pps_normtime 
freq_norm)
        pps_freq = ftemp;
        if (delta > PPS_MAXWANDER || delta < -PPS_MAXWANDER) {
                pr_warning("hardpps: PPSWANDER: change=%ld\n", delta);
-               time_status |= STA_PPSWANDER;
+               tk_ntp.time_status |= STA_PPSWANDER;
                pps_stbcnt++;
                pps_dec_freq_interval();
        } else {        /* good sample */
@@ -818,9 +779,9 @@ static long hardpps_update_freq(struct pps_normtime 
freq_norm)
                                NSEC_PER_USEC) - pps_stabil) >> PPS_INTMIN;
 
        /* if enabled, the system clock frequency is updated */
-       if ((time_status & STA_PPSFREQ) != 0 &&
-           (time_status & STA_FREQHOLD) == 0) {
-               time_freq = pps_freq;
+       if ((tk_ntp.time_status & STA_PPSFREQ) != 0 &&
+           (tk_ntp.time_status & STA_FREQHOLD) == 0) {
+               tk_ntp.time_freq = pps_freq;
                ntp_update_frequency();
        }
 
@@ -844,14 +805,15 @@ static void hardpps_update_phase(long error)
        if (jitter > (pps_jitter << PPS_POPCORN)) {
                pr_warning("hardpps: PPSJITTER: jitter=%ld, limit=%ld\n",
                       jitter, (pps_jitter << PPS_POPCORN));
-               time_status |= STA_PPSJITTER;
+               tk_ntp.time_status |= STA_PPSJITTER;
                pps_jitcnt++;
-       } else if (time_status & STA_PPSTIME) {
+       } else if (tk_ntp.time_status & STA_PPSTIME) {
                /* correct the time using the phase offset */
-               time_offset = div_s64(((s64)correction) << NTP_SCALE_SHIFT,
+               tk_ntp.time_offset =
+                       div_s64(((s64)correction) << NTP_SCALE_SHIFT,
                                NTP_INTERVAL_FREQ);
                /* cancel running adjtime() */
-               time_adjust = 0;
+               tk_ntp.time_adjust = 0;
        }
        /* update jitter */
        pps_jitter += (jitter - pps_jitter) >> PPS_INTMIN;
@@ -876,10 +838,10 @@ void __hardpps(const struct timespec *phase_ts, const 
struct timespec *raw_ts)
        pts_norm = pps_normalize_ts(*phase_ts);
 
        /* clear the error bits, they will be set again if needed */
-       time_status &= ~(STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR);
+       tk_ntp.time_status &= ~(STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR);
 
        /* indicate signal presence */
-       time_status |= STA_PPSSIGNAL;
+       tk_ntp.time_status |= STA_PPSSIGNAL;
        pps_valid = PPS_VALID;
 
        /* when called for the first time,
@@ -897,7 +859,7 @@ void __hardpps(const struct timespec *phase_ts, const 
struct timespec *raw_ts)
        if ((freq_norm.sec == 0) ||
                        (freq_norm.nsec > MAXFREQ * freq_norm.sec) ||
                        (freq_norm.nsec < -MAXFREQ * freq_norm.sec)) {
-               time_status |= STA_PPSJITTER;
+               tk_ntp.time_status |= STA_PPSJITTER;
                /* restart the frequency calibration interval */
                pps_fbase = *raw_ts;
                pr_err("hardpps: PPSJITTER: bad pulse\n");
@@ -921,8 +883,8 @@ void __hardpps(const struct timespec *phase_ts, const 
struct timespec *raw_ts)
 
 static int __init ntp_tick_adj_setup(char *str)
 {
-       ntp_tick_adj = simple_strtol(str, NULL, 0);
-       ntp_tick_adj <<= NTP_SCALE_SHIFT;
+       tk_ntp.ntp_tick_adj = simple_strtol(str, NULL, 0);
+       tk_ntp.ntp_tick_adj <<= NTP_SCALE_SHIFT;
 
        return 1;
 }
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to