http://bugzilla.kernel.org/show_bug.cgi?id=5989
------- Additional Comments From [EMAIL PROTECTED] 2006-03-26 21:07 ------- Okay, I first merged the acpi_in_suspend changes from before with the Debug and I2RBcopy changes to the DSDT (which still has only THM0 in it). Then I put in your latest two changes, but booting gives: Freeing unused kernel memory: 228k freed FATAL: kernel too old kernel panic not syncing: Attempted to kill init! ================== change 1 ============================ change 2. in acpi_pm_finish: Right after: arg.integer.value = ACPI_SST_WORKING; status = acpi_evaluate_object (NULL, METHOD_NAME__SST, &arg_list, NULL); if (ACPI_FAILURE (status) && status != AE_NOT_FOUND) { ACPI_REPORT_ERROR (("Method _SST failed, %s\n", acpi_format_exception (status))); } insert: acpi_in_suspend =NO That code didn't appear in acpi_pm_finish (in sleep/main.c), but a close relative of it appeared at the end of acpi_leave_sleep_state (in hardware/hwsleep.c). So, in acpi_pm_finish, I moved the acpi_in_suspend = FALSE line to come after apci_leave_sleep_state returns. I'm using 2.6.16-rc5; are you using 2.6.16? Anyway here's what acpi_pm_finish now looks like: static int acpi_pm_finish(suspend_state_t pm_state) { u32 acpi_state = acpi_suspend_states[pm_state]; acpi_leave_sleep_state(acpi_state); acpi_in_suspend = FALSE; /* used to be one line above */ acpi_disable_wakeup_device(acpi_state); /* reset firmware waking vector */ acpi_set_firmware_waking_vector((acpi_physical_address) 0); if (init_8259A_after_S1) { printk("Broken toshiba laptop -> kicking interrupts\n"); init_8259A(0); } return 0; } ====================== change 2 ============================ 6. in acpi_thermal_check, just before: acpi_thermal_get_temperature(tz) insert: if (acpi_in_suspend == YES) return_VOID; I made that change too. ============================================================ For completeness, here's the diff between the vanilla kernel and the one I just tried (let me know if I should also attach it at the bugzilla), except I haven't included the modified DSDT: diff -r ac486e270597 -r 9b6b830abe8f .config --- a/.config Sat Mar 18 08:35:34 2006 -0500 +++ b/.config Sun Mar 26 23:06:16 2006 -0500 @@ -217,7 +217,8 @@ CONFIG_ACPI_THERMAL=m # CONFIG_ACPI_ASUS is not set CONFIG_ACPI_IBM=m # CONFIG_ACPI_TOSHIBA is not set -# CONFIG_ACPI_CUSTOM_DSDT is not set +CONFIG_ACPI_CUSTOM_DSDT=y +CONFIG_ACPI_CUSTOM_DSDT_FILE="../../dsdt/600x.hex" CONFIG_ACPI_BLACKLIST_YEAR=0 CONFIG_ACPI_DEBUG=y CONFIG_ACPI_EC=y diff -r ac486e270597 -r 9b6b830abe8f drivers/acpi/ec.c --- a/drivers/acpi/ec.c Sat Mar 18 08:35:34 2006 -0500 +++ b/drivers/acpi/ec.c Sun Mar 26 23:06:16 2006 -0500 @@ -456,6 +456,7 @@ static int acpi_ec_intr_read(union acpi_ acpi_hw_low_level_read(8, data, &ec->common.data_addr); ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Read [%02x] from address [%02x]\n", *data, address)); + acpi_os_sleep (1); end: up(&ec->intr.sem); @@ -506,6 +507,7 @@ static int acpi_ec_intr_write(union acpi ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Wrote [%02x] to address [%02x]\n", data, address)); + acpi_os_sleep (1); up(&ec->intr.sem); diff -r ac486e270597 -r 9b6b830abe8f drivers/acpi/osl.c --- a/drivers/acpi/osl.c Sat Mar 18 08:35:34 2006 -0500 +++ b/drivers/acpi/osl.c Sun Mar 26 23:06:16 2006 -0500 @@ -634,6 +634,8 @@ static void acpi_os_execute_deferred(voi return_VOID; } +extern int acpi_in_suspend; + acpi_status acpi_os_queue_for_execution(u32 priority, acpi_osd_exec_callback function, void *context) @@ -643,6 +645,9 @@ acpi_os_queue_for_execution(u32 priority struct work_struct *task; ACPI_FUNCTION_TRACE("os_queue_for_execution"); + if (acpi_in_suspend) /* in case kacpid is causing the queue */ + /* should use a better error code, but oh well */ + return_ACPI_STATUS(AE_OK); ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Scheduling function [%p(%p)] for deferred execution.\n", diff -r ac486e270597 -r 9b6b830abe8f drivers/acpi/sleep/main.c --- a/drivers/acpi/sleep/main.c Sat Mar 18 08:35:34 2006 -0500 +++ b/drivers/acpi/sleep/main.c Sun Mar 26 23:06:16 2006 -0500 @@ -19,6 +19,12 @@ #include <acpi/acpi_drivers.h> #include "sleep.h" +/* for functions putting machine to sleep to know that we're + suspending, so that they can careful about what AML methods they + invoke (to avoid trying untested BIOS code paths) */ +int acpi_in_suspend; +EXPORT_SYMBOL(acpi_in_suspend); + u8 sleep_states[ACPI_S_STATE_COUNT]; static struct pm_ops acpi_pm_ops; @@ -55,6 +61,8 @@ static int acpi_pm_prepare(suspend_state printk("acpi_pm_prepare does not support %d \n", pm_state); return -EPERM; } + acpi_os_wait_events_complete(NULL); + acpi_in_suspend = TRUE; return acpi_sleep_prepare(acpi_state); } @@ -132,6 +140,7 @@ static int acpi_pm_finish(suspend_state_ u32 acpi_state = acpi_suspend_states[pm_state]; acpi_leave_sleep_state(acpi_state); + acpi_in_suspend = FALSE; acpi_disable_wakeup_device(acpi_state); /* reset firmware waking vector */ diff -r ac486e270597 -r 9b6b830abe8f drivers/acpi/thermal.c --- a/drivers/acpi/thermal.c Sat Mar 18 08:35:34 2006 -0500 +++ b/drivers/acpi/thermal.c Sun Mar 26 23:06:16 2006 -0500 @@ -79,6 +79,8 @@ static int tzp; static int tzp; module_param(tzp, int, 0); MODULE_PARM_DESC(tzp, "Thermal zone polling frequency, in 1/10 seconds.\n"); + +extern int acpi_in_suspend; static int acpi_thermal_add(struct acpi_device *device); static int acpi_thermal_remove(struct acpi_device *device, int type); @@ -683,6 +685,8 @@ static void acpi_thermal_run(unsigned lo static void acpi_thermal_run(unsigned long data) { struct acpi_thermal *tz = (struct acpi_thermal *)data; + if (acpi_in_suspend) /* thermal methods might cause a hang */ + return_VOID; /* so don't do them */ if (!tz->zombie) acpi_os_queue_for_execution(OSD_PRIORITY_GPE, acpi_thermal_check, (void *)data); @@ -705,6 +709,8 @@ static void acpi_thermal_check(void *dat state = tz->state; + if (acpi_in_suspend) + return_VOID; result = acpi_thermal_get_temperature(tz); if (result) return_VOID; @@ -1224,6 +1230,9 @@ static void acpi_thermal_notify(acpi_han struct acpi_device *device = NULL; ACPI_FUNCTION_TRACE("acpi_thermal_notify"); + + if (acpi_in_suspend) /* thermal methods might cause a hang */ + return_VOID; /* so don't do them */ if (!tz) return_VOID; ------- You are receiving this mail because: ------- You are on the CC list for the bug, or are watching someone who is. ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ acpi-bugzilla mailing list acpi-bugzilla@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/acpi-bugzilla