diff options
Diffstat (limited to 'drivers/acpi/acpica/psparse.c')
| -rw-r--r-- | drivers/acpi/acpica/psparse.c | 51 | 
1 files changed, 21 insertions, 30 deletions
diff --git a/drivers/acpi/acpica/psparse.c b/drivers/acpi/acpica/psparse.c index 8d81542194d..6d27b597394 100644 --- a/drivers/acpi/acpica/psparse.c +++ b/drivers/acpi/acpica/psparse.c @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2010, Intel Corp. + * Copyright (C) 2000 - 2014, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -43,9 +43,9 @@  /*   * Parse the AML and build an operation tree as most interpreters, - * like Perl, do.  Parsing is done by hand rather than with a YACC + * like Perl, do. Parsing is done by hand rather than with a YACC   * generated parser to tightly constrain stack and dynamic memory - * usage.  At the same time, parsing is kept flexible and the code + * usage. At the same time, parsing is kept flexible and the code   * fairly compact by parsing based on a list of AML opcode   * templates in aml_op_info[]   */ @@ -55,7 +55,6 @@  #include "acparser.h"  #include "acdispat.h"  #include "amlcode.h" -#include "acnamesp.h"  #include "acinterp.h"  #define _COMPONENT          ACPI_PARSER @@ -65,7 +64,7 @@ ACPI_MODULE_NAME("psparse")   *   * FUNCTION:    acpi_ps_get_opcode_size   * - * PARAMETERS:  Opcode          - An AML opcode + * PARAMETERS:  opcode          - An AML opcode   *   * RETURN:      Size of the opcode, in bytes (1 or 2)   * @@ -122,7 +121,7 @@ u16 acpi_ps_peek_opcode(struct acpi_parse_state * parser_state)   * FUNCTION:    acpi_ps_complete_this_op   *   * PARAMETERS:  walk_state      - Current State - *              Op              - Op to complete + *              op              - Op to complete   *   * RETURN:      Status   * @@ -177,10 +176,10 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,  		switch (parent_info->class) {  		case AML_CLASS_CONTROL: +  			break;  		case AML_CLASS_CREATE: -  			/*  			 * These opcodes contain term_arg operands. The current  			 * op must be replaced by a placeholder return op @@ -193,7 +192,6 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,  			break;  		case AML_CLASS_NAMED_OBJECT: -  			/*  			 * These opcodes contain term_arg operands. The current  			 * op must be replaced by a placeholder return op @@ -299,7 +297,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,  			}  	} -      cleanup: +cleanup:  	/* Now we can actually delete the subtree rooted at Op */ @@ -312,7 +310,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,   * FUNCTION:    acpi_ps_next_parse_state   *   * PARAMETERS:  walk_state          - Current state - *              Op                  - Current parse op + *              op                  - Current parse op   *              callback_status     - Status from previous operation   *   * RETURN:      Status @@ -380,7 +378,7 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,  	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 +		 * opcode. In both cases, we do not execute the rest of the  		 * package;  We simply close out the parent (finishing the walk of  		 * this branch of the tree) and continue execution at the parent  		 * level. @@ -460,8 +458,9 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)  			/* Executing a control method - additional cleanup */ -			acpi_ds_terminate_control_method( -				walk_state->method_desc, walk_state); +			acpi_ds_terminate_control_method(walk_state-> +							 method_desc, +							 walk_state);  		}  		acpi_ds_delete_walk_state(walk_state); @@ -488,7 +487,7 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)  	acpi_gbl_current_walk_list = thread;  	/* -	 * Execute the walk loop as long as there is a valid Walk State.  This +	 * Execute the walk loop as long as there is a valid Walk State. This  	 * handles nested control method invocations without recursion.  	 */  	ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "State=%p\n", walk_state)); @@ -539,24 +538,16 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)  			/* Check for possible multi-thread reentrancy problem */  			if ((status == AE_ALREADY_EXISTS) && -			    (!walk_state->method_desc->method.mutex)) { -				ACPI_INFO((AE_INFO, -					   "Marking method %4.4s as Serialized because of AE_ALREADY_EXISTS error", -					   walk_state->method_node->name. -					   ascii)); - +			    (!(walk_state->method_desc->method. +			       info_flags & ACPI_METHOD_SERIALIZED))) {  				/* -				 * 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. -				 * Workaround this problem by marking the method permanently -				 * as Serialized. +				 * Method is not serialized and tried to create an object +				 * twice. The probable cause is that the method cannot +				 * handle reentrancy. Mark as "pending serialized" now, and +				 * then mark "serialized" when the last thread exits.  				 */ -				walk_state->method_desc->method.method_flags |= -				    AML_METHOD_SERIALIZED; -				walk_state->method_desc->method.sync_level = 0; +				walk_state->method_desc->method.info_flags |= +				    ACPI_METHOD_SERIALIZED_PENDING;  			}  		}  | 
