diff options
author | Bob Moore <robert.moore@intel.com> | 2009-07-23 23:25:16 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2009-08-28 19:40:38 -0400 |
commit | 2f977b36e5f175e5126f280e7a94f0c53d1b1a16 (patch) | |
tree | eac8df3c29d855b0a5d830d55bea2037a78e2268 /drivers/acpi/acpica/utxface.c | |
parent | 53e9387bdd8bfef6cffff2d2eb6bd28eca812682 (diff) |
ACPICA: Fix fault if acpi_terminate is called twice
Fixes a problem with the mechanism that prevents problems if the
acpi_terminate interface is inadvertently called more than once
before the ACPICA code is re-initialized. ACPICA BZ 795.
http://acpica.org/bugzilla/show_bug.cgi?id=795
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/utxface.c')
-rw-r--r-- | drivers/acpi/acpica/utxface.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/acpi/acpica/utxface.c b/drivers/acpi/acpica/utxface.c index 078a22728c6b..483edbb3f441 100644 --- a/drivers/acpi/acpica/utxface.c +++ b/drivers/acpi/acpica/utxface.c | |||
@@ -318,7 +318,7 @@ ACPI_EXPORT_SYMBOL(acpi_initialize_objects) | |||
318 | * | 318 | * |
319 | * RETURN: Status | 319 | * RETURN: Status |
320 | * | 320 | * |
321 | * DESCRIPTION: Shutdown the ACPI subsystem. Release all resources. | 321 | * DESCRIPTION: Shutdown the ACPICA subsystem and release all resources. |
322 | * | 322 | * |
323 | ******************************************************************************/ | 323 | ******************************************************************************/ |
324 | acpi_status acpi_terminate(void) | 324 | acpi_status acpi_terminate(void) |
@@ -327,6 +327,19 @@ acpi_status acpi_terminate(void) | |||
327 | 327 | ||
328 | ACPI_FUNCTION_TRACE(acpi_terminate); | 328 | ACPI_FUNCTION_TRACE(acpi_terminate); |
329 | 329 | ||
330 | /* Just exit if subsystem is already shutdown */ | ||
331 | |||
332 | if (acpi_gbl_shutdown) { | ||
333 | ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated")); | ||
334 | return_ACPI_STATUS(AE_OK); | ||
335 | } | ||
336 | |||
337 | /* Subsystem appears active, go ahead and shut it down */ | ||
338 | |||
339 | acpi_gbl_shutdown = TRUE; | ||
340 | acpi_gbl_startup_flags = 0; | ||
341 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n")); | ||
342 | |||
330 | /* Terminate the AML Debugger if present */ | 343 | /* Terminate the AML Debugger if present */ |
331 | 344 | ||
332 | ACPI_DEBUGGER_EXEC(acpi_gbl_db_terminate_threads = TRUE); | 345 | ACPI_DEBUGGER_EXEC(acpi_gbl_db_terminate_threads = TRUE); |
@@ -353,6 +366,7 @@ acpi_status acpi_terminate(void) | |||
353 | } | 366 | } |
354 | 367 | ||
355 | ACPI_EXPORT_SYMBOL(acpi_terminate) | 368 | ACPI_EXPORT_SYMBOL(acpi_terminate) |
369 | |||
356 | #ifndef ACPI_ASL_COMPILER | 370 | #ifndef ACPI_ASL_COMPILER |
357 | #ifdef ACPI_FUTURE_USAGE | 371 | #ifdef ACPI_FUTURE_USAGE |
358 | /******************************************************************************* | 372 | /******************************************************************************* |