fix math in acpi_system_write_alarm() (resend)
PATCH 1/1 fix math in acpi_system_write_alarm() (resend)
This patch fixes the day of month math in acpi_system_write_alarm(). The previous code assumed that there were 31 days in every month. We caught this on June 30 when the month changed, but the system stayed suspended waiting for June 31st.
I know /proc/acpi/alarm is being deprecated, but its still there, and I think as long as somebody can use it in anger, it should correct.
Thanks,
Jordan
Signature · 3 lines
Jordan Crouse Systems Software Development Engineer Advanced Micro Devices, Inc.
[PATCH] ACPI: Make sure that the alarm math is correct
From: Jordan Crouse <[email protected]>
The current /proc/acpi/alarm math assumes that every month has 31 days. This patch figures out the correct number of days in the month.
---
drivers/acpi/sleep/proc.c | 27 ++++++++++++++++++++++++--- 1 files changed, 24 insertions(+), 3 deletions(-)
drivers/acpi/sleep/proc.c +24 -3
@@ -283,10 +283,31 @@ acpi_system_write_alarm(struct file *file, day += hr/24 ; hr = hr%24 ; } -if (day >31 ) { - mo += day/32 ; - day = day%32 ; + +while (1 ) { +int tmo = mo %13 ; +int dinmo; + +if (tmo ==2 ) { +if (((yr %4 ==0 ) && (yr %100 !=0 )) || + (yr %400 ==0 )) + dinmo =29 ; +else + dinmo =28 ; + }else if (tmo ==1 || tmo ==3 || tmo ==5 || + tmo ==7 || tmo ==8 || tmo ==10 || + tmo ==12 ) + dinmo =31 ; +else + dinmo =30 ; + +if (day <= dinmo) +break ; + + mo +=1 ; + day -= dinmo; } +if (mo >12 ) { yr += mo/13 ; mo = mo%13 ;
Quoted 9 lines · Jordan Crouse
This patch fixes the day of month math in
acpi_system_write_alarm(). The previous code assumed that there were 31 days in every month. We caught this on June 30 when the month changed, but the system stayed suspended waiting for June 31st.I know
/proc/acpi/alarmis being deprecated, but its still there, and I think as long as somebody can use it in anger, it should correct.
agree.
len, I think we should also apply this patch.
Subject: ACPI: deprecate /proc/acpi/alarm
/proc/acpi/alarm is deprecated.
users can use /sys/class/rtc/rtcX/wakealarm instead.
--- drivers/acpi/Kconfig | 1 + drivers/acpi/sleep/proc.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-)
drivers/acpi/sleep/proc.c +1 -1
@@ -78,7 +78,7 @@ acpi_system_write_sleep(struct file *fil }#endif /* CONFIG_ACPI_PROCFS */ -#if defined(CONFIG_RTC_DRV_CMOS ) || defined(CONFIG_RTC_DRV_CMOS_MODULE ) || !defined(CONFIG_X86 ) +#if defined(CONFIG_RTC_DRV_CMOS ) || defined(CONFIG_RTC_DRV_CMOS_MODULE ) || !defined(CONFIG_X86 ) || !define (CONFIG_ACPI_PROCFS )/* use /sys/class/rtc/rtcX/wakealarm instead; it's not ACPI-specific */ #else #define HAVE_ACPI_LEGACY_ALARM
drivers/acpi/Kconfig +1 -0
@@ -60,6 +60,7 @@ config ACPI_PROCFS /proc/acpi/fadt (/sys/firmware/acpi/tables/FACP) /proc/acpi/debug_layer (/sys/module/acpi/parameters/debug_layer) /proc/acpi/debug_level (/sys/module/acpi/parameters/debug_level) + /proc/acpi/alarm (/sys/class/rtc/rtcX/wakealarm) This option has no effect on /proc/acpi/ files and functions which do not yet exist in /sys.