phc2sys: Notify kernel if clock is not in sync

In case there is no connection to the server, notify the kernel
that the clock is currently unsynchronized.

Signed-off-by: Ville Heikkinen <ville.heikkinen@nokia.com>
master
Ville Heikkinen 2020-02-14 13:23:44 +02:00 committed by Richard Cochran
parent 0a4d85c2ed
commit 944f5f7ac6
3 changed files with 19 additions and 1 deletions

View File

@ -182,3 +182,14 @@ void sysclk_set_sync(void)
if (clock_adjtime(clkid, &tx) < 0) if (clock_adjtime(clkid, &tx) < 0)
pr_err("failed to set clock status and maximum error: %m"); pr_err("failed to set clock status and maximum error: %m");
} }
void sysclk_set_unsync(void)
{
clockid_t clkid = CLOCK_REALTIME;
struct timex tx;
memset(&tx, 0, sizeof(tx));
tx.modes = ADJ_STATUS;
tx.status = STA_UNSYNC;
if (clock_adjtime(clkid, &tx) < 0)
pr_err("failed to set clock status: %m");
}

View File

@ -80,4 +80,9 @@ int sysclk_max_freq(void);
* the real-time clock (RTC) to it. * the real-time clock (RTC) to it.
*/ */
void sysclk_set_sync(void); void sysclk_set_sync(void);
/**
* Mark the system clock as unsynchronized.
*/
void sysclk_set_unsync(void);
#endif #endif

View File

@ -735,8 +735,10 @@ static int do_loop(struct node *node, int subscriptions)
reconfigure(node); reconfigure(node);
} }
} }
if (!node->master) if (!node->master) {
sysclk_set_unsync();
continue; continue;
}
LIST_FOREACH(clock, &node->dst_clocks, dst_list) { LIST_FOREACH(clock, &node->dst_clocks, dst_list) {
if (!update_needed(clock)) if (!update_needed(clock))