[TG3] tg3_bus_string(): remove dead code
[safe/jmp/linux-2.6] / drivers / acpi / parser / psparse.c
index 3677130..a9f3229 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -333,7 +333,6 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,
 
        switch (callback_status) {
        case AE_CTRL_TERMINATE:
-
                /*
                 * A control method was terminated via a RETURN statement.
                 * The walk of this method is complete.
@@ -346,13 +345,19 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,
 
                parser_state->aml = walk_state->aml_last_while;
                walk_state->control_state->common.value = FALSE;
-               status = AE_CTRL_BREAK;
+               status = acpi_ds_result_stack_pop(walk_state);
+               if (ACPI_SUCCESS(status)) {
+                       status = AE_CTRL_BREAK;
+               }
                break;
 
        case AE_CTRL_CONTINUE:
 
                parser_state->aml = walk_state->aml_last_while;
-               status = AE_CTRL_CONTINUE;
+               status = acpi_ds_result_stack_pop(walk_state);
+               if (ACPI_SUCCESS(status)) {
+                       status = AE_CTRL_CONTINUE;
+               }
                break;
 
        case AE_CTRL_PENDING:
@@ -369,16 +374,18 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,
 #endif
 
        case AE_CTRL_TRUE:
-
                /*
                 * Predicate of an IF was true, and we are at the matching ELSE.
                 * Just close out this package
                 */
                parser_state->aml = acpi_ps_get_next_package_end(parser_state);
+               status = acpi_ds_result_stack_pop(walk_state);
+               if (ACPI_SUCCESS(status)) {
+                       status = AE_CTRL_PENDING;
+               }
                break;
 
        case AE_CTRL_FALSE:
-
                /*
                 * Either an IF/WHILE Predicate was false or we encountered a BREAK
                 * opcode.  In both cases, we do not execute the rest of the
@@ -503,21 +510,23 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
                } else if (status == AE_CTRL_TERMINATE) {
                        status = AE_OK;
                } else if ((status != AE_OK) && (walk_state->method_desc)) {
-                       ACPI_REPORT_METHOD_ERROR("Method execution failed",
-                                                walk_state->method_node, NULL,
-                                                status);
+                       /* Either the method parse or actual execution failed */
+
+                       ACPI_ERROR_METHOD("Method parse/execution failed",
+                                         walk_state->method_node, NULL,
+                                         status);
 
-                       /* Make sure that failed method will be cleaned as if it was executed */
-                       walk_state->parse_flags |= ACPI_PARSE_EXECUTE;
-                       
                        /* Check for possible multi-thread reentrancy problem */
 
                        if ((status == AE_ALREADY_EXISTS) &&
                            (!walk_state->method_desc->method.semaphore)) {
                                /*
-                                * This method is marked not_serialized, but it tried to create
+                                * Method tried to create an object twice. The probable cause is
+                                * that the method cannot handle reentrancy.
+                                *
+                                * The method is marked not_serialized, but it tried to create
                                 * a named object, causing the second thread entrance to fail.
-                                * We will workaround this by marking the method permanently
+                                * Workaround this problem by marking the method permanently
                                 * as Serialized.
                                 */
                                walk_state->method_desc->method.method_flags |=
@@ -535,21 +544,31 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
                acpi_ds_scope_stack_clear(walk_state);
 
                /*
-                * If we just returned from the execution of a control method,
-                * there's lots of cleanup to do
+                * If we just returned from the execution of a control method or if we
+                * encountered an error during the method parse phase, there's lots of
+                * cleanup to do
                 */
-               if ((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) ==
-                   ACPI_PARSE_EXECUTE) {
+               if (((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) ==
+                    ACPI_PARSE_EXECUTE) || (ACPI_FAILURE(status))) {
                        if (walk_state->method_desc) {
-                               walk_state->method_desc->method.thread_count--;
+                               /* Decrement the thread count on the method parse tree */
+
+                               if (walk_state->method_desc->method.
+                                   thread_count) {
+                                       walk_state->method_desc->method.
+                                           thread_count--;
+                               } else {
+                                       ACPI_ERROR((AE_INFO,
+                                                   "Invalid zero thread count in method"));
+                               }
                        }
-                       acpi_ds_terminate_control_method (walk_state);
+
+                       acpi_ds_terminate_control_method(walk_state);
                }
 
                /* Delete this walk state and all linked control states */
 
                acpi_ps_cleanup_scope(&walk_state->parser_state);
-
                previous_walk_state = walk_state;
 
                ACPI_DEBUG_PRINT((ACPI_DB_PARSE,