2008-06-23 10:52:25

by Chen, Huacai

[permalink] [raw]
Subject: [PATCH] RTC: Fix CMOS time error after writing /proc/acpi/alarm

From: Huacai Chen <[email protected]>

When writing /proc/acpi/alarm in adjust mode, e.g.
echo "+0000-00-00 00:00:15" >/proc/acpi/alarm
The "century" field should be read and added to "year" field before
writing, otherwise the CMOS time will go back to 2000 years ago, e.g.
# cat /proc/acpi/alarm
0008-06-21 11:38:46
Then the system time may be reset to the date of manufacture after
rebooting. This patch fixed this issue.

Signed-off-by: Huacai Chen <[email protected]>
Acked-by: Pavel Machek <[email protected]>
---
diff --git a/drivers/acpi/sleep/proc.c b/drivers/acpi/sleep/proc.c
index 224c57c..c9fdf7b 100644
--- a/drivers/acpi/sleep/proc.c
+++ b/drivers/acpi/sleep/proc.c
@@ -315,8 +315,11 @@ acpi_system_write_alarm(struct file *file,
cmos_bcd_write(day, acpi_gbl_FADT.day_alarm,
rtc_control);
if (acpi_gbl_FADT.month_alarm)
cmos_bcd_write(mo, acpi_gbl_FADT.month_alarm,
rtc_control);
- if (acpi_gbl_FADT.century)
+ if (acpi_gbl_FADT.century) {
+ if (adjust)
+ yr += cmos_bcd_read(acpi_gbl_FADT.century,
rtc_control) * 100;
cmos_bcd_write(yr / 100, acpi_gbl_FADT.century,
rtc_control);
+ }
/* enable the rtc alarm interrupt */
rtc_control |= RTC_AIE;
CMOS_WRITE(rtc_control, RTC_CONTROL);
---
This is for Linux 2.6.26-rc7.


2008-06-24 06:27:24

by Zhao, Yakui

[permalink] [raw]
Subject: Re: [PATCH] RTC: Fix CMOS time error after writing /proc/acpi/alarm

On Mon, 2008-06-23 at 18:52 +0800, Chen, Huacai wrote:
> From: Huacai Chen <[email protected]>
>
> When writing /proc/acpi/alarm in adjust mode, e.g.
> echo "+0000-00-00 00:00:15" >/proc/acpi/alarm
> The "century" field should be read and added to "year" field before
> writing, otherwise the CMOS time will go back to 2000 years ago, e.g.
> # cat /proc/acpi/alarm
> 0008-06-21 11:38:46
> Then the system time may be reset to the date of manufacture after
> rebooting. This patch fixed this issue.
> Signed-off-by: Huacai Chen <[email protected]>
> Acked-by: Pavel Machek <[email protected]>
> ---
> diff --git a/drivers/acpi/sleep/proc.c b/drivers/acpi/sleep/proc.c
> index 224c57c..c9fdf7b 100644
> --- a/drivers/acpi/sleep/proc.c
> +++ b/drivers/acpi/sleep/proc.c
> @@ -315,8 +315,11 @@ acpi_system_write_alarm(struct file *file,
> cmos_bcd_write(day, acpi_gbl_FADT.day_alarm,
> rtc_control);
> if (acpi_gbl_FADT.month_alarm)
> cmos_bcd_write(mo, acpi_gbl_FADT.month_alarm,
> rtc_control);
> - if (acpi_gbl_FADT.century)
> + if (acpi_gbl_FADT.century) {
> + if (adjust)
> + yr += cmos_bcd_read(acpi_gbl_FADT.century,
> rtc_control) * 100;
> cmos_bcd_write(yr / 100, acpi_gbl_FADT.century,
> rtc_control);
> + }
this is OK.
> /* enable the rtc alarm interrupt */
> rtc_control |= RTC_AIE;
> CMOS_WRITE(rtc_control, RTC_CONTROL);
> ---
> This is for Linux 2.6.26-rc7.
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

2008-06-25 08:44:34

by Alessandro Zummo

[permalink] [raw]
Subject: Re: [PATCH] RTC: Fix CMOS time error after writing /proc/acpi/alarm

On Mon, 23 Jun 2008 18:52:21 +0800
"Chen, Huacai" <[email protected]> wrote:

> From: Huacai Chen <[email protected]>
>
> When writing /proc/acpi/alarm in adjust mode, e.g.
> echo "+0000-00-00 00:00:15" >/proc/acpi/alarm
> The "century" field should be read and added to "year" field before
> writing, otherwise the CMOS time will go back to 2000 years ago, e.g.
> # cat /proc/acpi/alarm
> 0008-06-21 11:38:46
> Then the system time may be reset to the date of manufacture after
> rebooting. This patch fixed this issue.
>
> Signed-off-by: Huacai Chen <[email protected]>
> Acked-by: Pavel Machek <[email protected]>

Acked-by: Alessandro Zummo <[email protected]>

--

Best regards,

Alessandro Zummo,
Tower Technologies - Torino, Italy

http://www.towertech.it