From: Ahmad Fatoum Date: Mon, 22 Jul 2024 15:41:47 +0000 (+0200) Subject: rtc: optionally return raw time from RTC_Linux_ReadTime* X-Git-Tag: 4.7-pre1~53 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65be9d9a022221d6fb165f425e72cd2f9b99ca50;p=thirdparty%2Fchrony.git rtc: optionally return raw time from RTC_Linux_ReadTime* For use with RCL_AddSample in the incoming RTC reference clock driver, we'll want access not to the cooked timestamps, but to the raw ones. Otherwise, the core reference clock code complains: (valid_sample_time) RTC0 refclock sample time 1721242673.092211891 not valid age=-3.092007 Support both use cases by have the RTC_Linux_ReadTime_* functions take two nullable pointers, one for cooked and the other for raw time. --- diff --git a/rtc_linux.c b/rtc_linux.c index 849bca05..31f495b3 100644 --- a/rtc_linux.c +++ b/rtc_linux.c @@ -786,7 +786,9 @@ RTC_Linux_CheckInterrupt(int fd) } time_t -RTC_Linux_ReadTimeAfterInterrupt(int fd, int utc, struct timespec *sys_time_cooked) +RTC_Linux_ReadTimeAfterInterrupt(int fd, int utc, + struct timespec *sys_time_cooked, + struct timespec *sys_time_raw) { int status; struct rtc_time rtc_raw; @@ -794,7 +796,7 @@ RTC_Linux_ReadTimeAfterInterrupt(int fd, int utc, struct timespec *sys_time_cook /* Read RTC time, sandwiched between two polls of the system clock so we can bound any error */ - SCH_GetLastEventTime(sys_time_cooked, NULL, NULL); + SCH_GetLastEventTime(sys_time_cooked, NULL, sys_time_raw); status = ioctl(fd, RTC_RD_TIME, &rtc_raw); if (status < 0) { @@ -825,7 +827,7 @@ read_from_device(int fd_, int event, void *any) return; } - rtc_t = RTC_Linux_ReadTimeAfterInterrupt(fd, rtc_on_utc, &sys_time); + rtc_t = RTC_Linux_ReadTimeAfterInterrupt(fd, rtc_on_utc, &sys_time, NULL); if (rtc_t == (time_t)-1) { error = 1; goto turn_off_interrupt; @@ -930,7 +932,9 @@ RTC_Linux_WriteParameters(void) } time_t -RTC_Linux_ReadTimeNow(int fd, int utc, struct timespec *old_sys_time) +RTC_Linux_ReadTimeNow(int fd, int utc, + struct timespec *old_sys_cooked, + struct timespec *old_sys_raw) { struct rtc_time rtc_raw, rtc_raw_retry; int status; @@ -946,7 +950,10 @@ RTC_Linux_ReadTimeNow(int fd, int utc, struct timespec *old_sys_time) } while (status >= 0 && rtc_raw.tm_sec != rtc_raw_retry.tm_sec); /* Read system clock */ - LCL_ReadCookedTime(old_sys_time, NULL); + if (old_sys_raw) + LCL_ReadRawTime(old_sys_raw); + if (old_sys_cooked) + LCL_ReadCookedTime(old_sys_cooked, NULL); return status >= 0 ? t_from_rtc(&rtc_raw, utc) : -1; } @@ -976,7 +983,7 @@ RTC_Linux_TimePreInit(time_t driftfile_time) return 0; /* Can't open it, and won't be able to later */ } - rtc_t = RTC_Linux_ReadTimeNow(fd, rtc_on_utc, &old_sys_time); + rtc_t = RTC_Linux_ReadTimeNow(fd, rtc_on_utc, &old_sys_time, NULL); close(fd); diff --git a/rtc_linux.h b/rtc_linux.h index c48b294d..831c4e9d 100644 --- a/rtc_linux.h +++ b/rtc_linux.h @@ -45,8 +45,10 @@ extern void RTC_Linux_CycleLogFile(void); extern int RTC_Linux_SwitchInterrupt(int fd, int on_off); extern int RTC_Linux_CheckInterrupt(int fd); extern time_t RTC_Linux_ReadTimeAfterInterrupt(int fd, int utc, - struct timespec *sys_time_cooked); + struct timespec *sys_time_cooked, + struct timespec *sys_time_raw); extern time_t RTC_Linux_ReadTimeNow(int fd, int utc, - struct timespec *sys_time_cooked); + struct timespec *sys_time_cooked, + struct timespec *sys_time_raw); #endif /* _GOT_RTC_LINUX_H */