Module Name: src
Committed By: kardel
Date: Sun Jun 14 13:16:32 UTC 2009
Modified Files:
src/sys/kern: kern_tc.c
src/sys/sys: timepps.h
Log Message:
Make PPS work with fast time counters (> 2GHz)
by making the pps count time stamp and the update
time stamp u_int64.
The time delta between two PPS events can now
be correctly calculated avoiding any unaccounted
for wraps with 32-bit counters.
To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/sys/kern/kern_tc.c
cvs rdiff -u -r1.18 -r1.19 src/sys/sys/timepps.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/kern_tc.c
diff -u src/sys/kern/kern_tc.c:1.39 src/sys/kern/kern_tc.c:1.40
--- src/sys/kern/kern_tc.c:1.39 Sat May 23 17:08:04 2009
+++ src/sys/kern/kern_tc.c Sun Jun 14 13:16:32 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_tc.c,v 1.39 2009/05/23 17:08:04 ad Exp $ */
+/* $NetBSD: kern_tc.c,v 1.40 2009/06/14 13:16:32 kardel Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
/* __FBSDID("$FreeBSD: src/sys/kern/kern_tc.c,v 1.166 2005/09/19 22:16:31 andre Exp $"); */
-__KERNEL_RCSID(0, "$NetBSD: kern_tc.c,v 1.39 2009/05/23 17:08:04 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_tc.c,v 1.40 2009/06/14 13:16:32 kardel Exp $");
#include "opt_ntp.h"
@@ -87,16 +87,19 @@
struct timehands {
/* These fields must be initialized by the driver. */
- struct timecounter *th_counter;
- int64_t th_adjustment;
- u_int64_t th_scale;
- u_int th_offset_count;
- struct bintime th_offset;
- struct timeval th_microtime;
- struct timespec th_nanotime;
+ struct timecounter *th_counter; /* active timecounter */
+ int64_t th_adjustment; /* frequency adjustment */
+ /* (NTP/adjtime) */
+ u_int64_t th_scale; /* scale factor (counter */
+ /* tick->time) */
+ u_int64_t th_offset_count; /* offset at last time */
+ /* update (tc_windup()) */
+ struct bintime th_offset; /* bin (up)time at windup */
+ struct timeval th_microtime; /* cached microtime */
+ struct timespec th_nanotime; /* cached nanotime */
/* Fields not to be copied in tc_windup start with th_generation. */
- volatile u_int th_generation;
- struct timehands *th_next;
+ volatile u_int th_generation; /* current genration */
+ struct timehands *th_next; /* next timehand */
};
static struct timehands th0;
@@ -732,7 +735,6 @@
else
ncount = 0;
th->th_offset_count += delta;
- th->th_offset_count &= th->th_counter->tc_counter_mask;
bintime_addx(&th->th_offset, th->th_scale * delta);
/*
@@ -920,7 +922,7 @@
th = timehands;
pps->capgen = th->th_generation;
pps->capth = th;
- pps->capcount = th->th_counter->tc_get_timecount(th->th_counter);
+ pps->capcount = (u_int64_t)tc_delta(th) + th->th_offset_count;
if (pps->capgen != th->th_generation)
pps->capgen = 0;
}
@@ -930,7 +932,7 @@
{
struct bintime bt;
struct timespec ts, *tsp, *osp;
- u_int tcount, *pcount;
+ u_int64_t tcount, *pcount;
int foff, fhard;
pps_seq_t *pseq;
@@ -971,7 +973,6 @@
/* Convert the count to a timespec. */
tcount = pps->capcount - pps->capth->th_offset_count;
- tcount &= pps->capth->th_counter->tc_counter_mask;
bt = pps->capth->th_offset;
bintime_addx(&bt, pps->capth->th_scale * tcount);
bintime_add(&bt, &timebasebin);
Index: src/sys/sys/timepps.h
diff -u src/sys/sys/timepps.h:1.18 src/sys/sys/timepps.h:1.19
--- src/sys/sys/timepps.h:1.18 Mon Apr 21 12:56:31 2008
+++ src/sys/sys/timepps.h Sun Jun 14 13:16:32 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: timepps.h,v 1.18 2008/04/21 12:56:31 ad Exp $ */
+/* $NetBSD: timepps.h,v 1.19 2009/06/14 13:16:32 kardel Exp $ */
/*
* Copyright (c) 1998 Jonathan Stone
@@ -139,7 +139,7 @@
/* Capture information. */
struct timehands *capth;
unsigned capgen;
- unsigned capcount;
+ u_int64_t capcount;
/* State information. */
pps_params_t ppsparam;
@@ -147,7 +147,7 @@
int kcmode;
int ppscap;
struct timecounter *ppstc;
- unsigned ppscount[3];
+ u_int64_t ppscount[3];
};
void pps_capture(struct pps_state *);