Пример #1
0
/*******************************************************************************
 *
 * FUNCTION:    acpi_get_next_object
 *
 * PARAMETERS:  Type            - Type of object to be searched for
 *              Parent          - Parent object whose children we are getting
 *              last_child      - Previous child that was found.
 *                                The NEXT child will be returned
 *              ret_handle      - Where handle to the next object is placed
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Return the next peer object within the namespace.  If Handle is
 *              valid, Scope is ignored.  Otherwise, the first object within
 *              Scope is returned.
 *
 ******************************************************************************/
acpi_status
acpi_get_next_object(acpi_object_type type,
		     acpi_handle parent,
		     acpi_handle child, acpi_handle * ret_handle)
{
	acpi_status status;
	struct acpi_namespace_node *node;
	struct acpi_namespace_node *parent_node = NULL;
	struct acpi_namespace_node *child_node = NULL;

	/* Parameter validation */

	if (type > ACPI_TYPE_EXTERNAL_MAX) {
		return (AE_BAD_PARAMETER);
	}

	status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
	if (ACPI_FAILURE(status)) {
		return (status);
	}

	/* If null handle, use the parent */

	if (!child) {

		/* Start search at the beginning of the specified scope */

		parent_node = acpi_ns_map_handle_to_node(parent);
		if (!parent_node) {
			status = AE_BAD_PARAMETER;
			goto unlock_and_exit;
		}
	} else {
		/* Non-null handle, ignore the parent */
		/* Convert and validate the handle */

		child_node = acpi_ns_map_handle_to_node(child);
		if (!child_node) {
			status = AE_BAD_PARAMETER;
			goto unlock_and_exit;
		}
	}

	/* Internal function does the real work */

	node = acpi_ns_get_next_node(type, parent_node, child_node);
	if (!node) {
		status = AE_NOT_FOUND;
		goto unlock_and_exit;
	}

	if (ret_handle) {
		*ret_handle = acpi_ns_convert_entry_to_handle(node);
	}

      unlock_and_exit:

	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
	return (status);
}
Пример #2
0
void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
{
	struct acpi_namespace_node *child_node = NULL;
	u32 level = 1;

	ACPI_FUNCTION_TRACE(ns_delete_namespace_subtree);

	if (!parent_node) {
		return_VOID;
	}

	
	while (level > 0) {

		

		child_node = acpi_ns_get_next_node(parent_node, child_node);
		if (child_node) {

			

			acpi_ns_detach_object(child_node);

			

			if (child_node->child) {
				
				level++;
				parent_node = child_node;
				child_node = NULL;
			}
		} else {
			
			level--;

			
			acpi_ns_delete_children(parent_node);

			

			child_node = parent_node;

			

			parent_node = acpi_ns_get_parent_node(parent_node);
		}
	}

	return_VOID;
}
Пример #3
0
struct acpi_namespace_node *acpi_ns_get_next_node_typed(acpi_object_type type,
							struct
							acpi_namespace_node
							*parent_node,
							struct
							acpi_namespace_node
							*child_node)
{
	struct acpi_namespace_node *next_node = NULL;

	ACPI_FUNCTION_ENTRY();

	next_node = acpi_ns_get_next_node(parent_node, child_node);


	/* If any type is OK, we are done */

	if (type == ACPI_TYPE_ANY) {

		/* next_node is NULL if we are at the end-of-list */

		return (next_node);
	}

	/* Must search for the node -- but within this scope only */

	while (next_node) {

		/* If type matches, we are done */

		if (next_node->type == type) {
			return (next_node);
		}

		/* Otherwise, move on to the next node */

		next_node = acpi_ns_get_next_valid_node(next_node);
	}

	/* Not found */

	return (NULL);
}
Пример #4
0
struct acpi_namespace_node *acpi_ns_get_next_node_typed(acpi_object_type type,
							struct
							acpi_namespace_node
							*parent_node,
							struct
							acpi_namespace_node
							*child_node)
{
	struct acpi_namespace_node *next_node = NULL;

	ACPI_FUNCTION_ENTRY();

	next_node = acpi_ns_get_next_node(parent_node, child_node);


	

	if (type == ACPI_TYPE_ANY) {

		

		return (next_node);
	}

	

	while (next_node) {

		

		if (next_node->type == type) {
			return (next_node);
		}

		

		next_node = next_node->peer;
	}

	

	return (NULL);
}
Пример #5
0
acpi_status
acpi_ns_walk_namespace(acpi_object_type type,
		       acpi_handle start_node,
		       u32 max_depth,
		       u32 flags,
		       acpi_walk_callback user_function,
		       void *context, void **return_value)
{
	acpi_status status;
	acpi_status mutex_status;
	struct acpi_namespace_node *child_node;
	struct acpi_namespace_node *parent_node;
	acpi_object_type child_type;
	u32 level;

	ACPI_FUNCTION_TRACE(ns_walk_namespace);

	/* Special case for the namespace Root Node */

	if (start_node == ACPI_ROOT_OBJECT) {
		start_node = acpi_gbl_root_node;
	}

	/* Null child means "get first node" */

	parent_node = start_node;
	child_node = NULL;
	child_type = ACPI_TYPE_ANY;
	level = 1;

	/*
	 * Traverse the tree of nodes until we bubble back up to where we
	 * started. When Level is zero, the loop is done because we have
	 * bubbled up to (and passed) the original parent handle (start_entry)
	 */
	while (level > 0) {

		/* Get the next node in this scope.  Null if not found */

		status = AE_OK;
		child_node =
		    acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node,
					  child_node);
		if (child_node) {

			/* Found next child, get the type if we are not searching for ANY */

			if (type != ACPI_TYPE_ANY) {
				child_type = child_node->type;
			}

			/*
			 * Ignore all temporary namespace nodes (created during control
			 * method execution) unless told otherwise. These temporary nodes
			 * can cause a race condition because they can be deleted during
			 * the execution of the user function (if the namespace is
			 * unlocked before invocation of the user function.) Only the
			 * debugger namespace dump will examine the temporary nodes.
			 */
			if ((child_node->flags & ANOBJ_TEMPORARY) &&
			    !(flags & ACPI_NS_WALK_TEMP_NODES)) {
				status = AE_CTRL_DEPTH;
			}

			/* Type must match requested type */

			else if (child_type == type) {
				/*
				 * Found a matching node, invoke the user callback function.
				 * Unlock the namespace if flag is set.
				 */
				if (flags & ACPI_NS_WALK_UNLOCK) {
					mutex_status =
					    acpi_ut_release_mutex
					    (ACPI_MTX_NAMESPACE);
					if (ACPI_FAILURE(mutex_status)) {
						return_ACPI_STATUS
						    (mutex_status);
					}
				}

				status =
				    user_function(child_node, level, context,
						  return_value);

				if (flags & ACPI_NS_WALK_UNLOCK) {
					mutex_status =
					    acpi_ut_acquire_mutex
					    (ACPI_MTX_NAMESPACE);
					if (ACPI_FAILURE(mutex_status)) {
						return_ACPI_STATUS
						    (mutex_status);
					}
				}

				switch (status) {
				case AE_OK:
				case AE_CTRL_DEPTH:

					/* Just keep going */
					break;

				case AE_CTRL_TERMINATE:

					/* Exit now, with OK status */

					return_ACPI_STATUS(AE_OK);

				default:

					/* All others are valid exceptions */

					return_ACPI_STATUS(status);
				}
			}

			/*
			 * Depth first search: Attempt to go down another level in the
			 * namespace if we are allowed to.  Don't go any further if we have
			 * reached the caller specified maximum depth or if the user
			 * function has specified that the maximum depth has been reached.
			 */
			if ((level < max_depth) && (status != AE_CTRL_DEPTH)) {
				if (acpi_ns_get_next_node
				    (ACPI_TYPE_ANY, child_node, NULL)) {

					/* There is at least one child of this node, visit it */

					level++;
					parent_node = child_node;
					child_node = NULL;
				}
			}
		} else {
			/*
			 * No more children of this node (acpi_ns_get_next_node failed), go
			 * back upwards in the namespace tree to the node's parent.
			 */
			level--;
			child_node = parent_node;
			parent_node = acpi_ns_get_parent_node(parent_node);
		}
	}

	/* Complete walk, not terminated by user function */

	return_ACPI_STATUS(AE_OK);
}
Пример #6
0
static void
acpi_ev_orphan_ec_reg_method(struct acpi_namespace_node *ec_device_node)
{
    acpi_handle reg_method;
    struct acpi_namespace_node *next_node;
    acpi_status status;
    struct acpi_object_list args;
    union acpi_object objects[2];

    ACPI_FUNCTION_TRACE(ev_orphan_ec_reg_method);

    if (!ec_device_node) {
        return_VOID;
    }

    /* Namespace is currently locked, must release */

    (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);

    /* Get a handle to a _REG method immediately under the EC device */

    status = acpi_get_handle(ec_device_node, METHOD_NAME__REG, &reg_method);
    if (ACPI_FAILURE(status)) {
        goto exit;	/* There is no _REG method present */
    }

    /*
     * Execute the _REG method only if there is no Operation Region in
     * this scope with the Embedded Controller space ID. Otherwise, it
     * will already have been executed. Note, this allows for Regions
     * with other space IDs to be present; but the code below will then
     * execute the _REG method with the embedded_control space_ID argument.
     */
    next_node = acpi_ns_get_next_node(ec_device_node, NULL);
    while (next_node) {
        if ((next_node->type == ACPI_TYPE_REGION) &&
                (next_node->object) &&
                (next_node->object->region.space_id == ACPI_ADR_SPACE_EC)) {
            goto exit;	/* Do not execute the _REG */
        }

        next_node = acpi_ns_get_next_node(ec_device_node, next_node);
    }

    /* Evaluate the _REG(embedded_control,Connect) method */

    args.count = 2;
    args.pointer = objects;
    objects[0].type = ACPI_TYPE_INTEGER;
    objects[0].integer.value = ACPI_ADR_SPACE_EC;
    objects[1].type = ACPI_TYPE_INTEGER;
    objects[1].integer.value = ACPI_REG_CONNECT;

    status = acpi_evaluate_object(reg_method, NULL, &args, NULL);

exit:
    /* We ignore all errors from above, don't care */

    status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
    return_VOID;
}
Пример #7
0
void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
{
	struct acpi_namespace_node *child_node;
	struct acpi_namespace_node *deletion_node;
	struct acpi_namespace_node *parent_node;
	u32 level;
	acpi_status status;

	ACPI_FUNCTION_TRACE_U32(ns_delete_namespace_by_owner, owner_id);

	if (owner_id == 0) {
		return_VOID;
	}

	

	status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
	if (ACPI_FAILURE(status)) {
		return_VOID;
	}

	deletion_node = NULL;
	parent_node = acpi_gbl_root_node;
	child_node = NULL;
	level = 1;

	
	while (level > 0) {
		
		child_node = acpi_ns_get_next_node(parent_node, child_node);

		if (deletion_node) {
			acpi_ns_delete_children(deletion_node);
			acpi_ns_remove_node(deletion_node);
			deletion_node = NULL;
		}

		if (child_node) {
			if (child_node->owner_id == owner_id) {

				

				acpi_ns_detach_object(child_node);
			}

			

			if (child_node->child) {
				
				level++;
				parent_node = child_node;
				child_node = NULL;
			} else if (child_node->owner_id == owner_id) {
				deletion_node = child_node;
			}
		} else {
			
			level--;
			if (level != 0) {
				if (parent_node->owner_id == owner_id) {
					deletion_node = parent_node;
				}
			}

			

			child_node = parent_node;

			

			parent_node = acpi_ns_get_parent_node(parent_node);
		}
	}

	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
	return_VOID;
}
Пример #8
0
void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
{
	struct acpi_namespace_node *child_node;
	struct acpi_namespace_node *deletion_node;
	struct acpi_namespace_node *parent_node;
	u32 level;
	acpi_status status;

	ACPI_FUNCTION_TRACE_U32(ns_delete_namespace_by_owner, owner_id);

	if (owner_id == 0) {
		return_VOID;
	}

	/* Lock namespace for possible update */

	status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
	if (ACPI_FAILURE(status)) {
		return_VOID;
	}

	deletion_node = NULL;
	parent_node = acpi_gbl_root_node;
	child_node = NULL;
	level = 1;

	/*
	 * Traverse the tree of nodes until we bubble back up
	 * to where we started.
	 */
	while (level > 0) {
		/*
		 * Get the next child of this parent node. When child_node is NULL,
		 * the first child of the parent is returned
		 */
		child_node = acpi_ns_get_next_node(parent_node, child_node);

		if (deletion_node) {
			acpi_ns_delete_children(deletion_node);
			acpi_ns_remove_node(deletion_node);
			deletion_node = NULL;
		}

		if (child_node) {
			if (child_node->owner_id == owner_id) {

				/* Found a matching child node - detach any attached object */

				acpi_ns_detach_object(child_node);
			}

			/* Check if this node has any children */

			if (child_node->child) {
				/*
				 * There is at least one child of this node,
				 * visit the node
				 */
				level++;
				parent_node = child_node;
				child_node = NULL;
			} else if (child_node->owner_id == owner_id) {
				deletion_node = child_node;
			}
		} else {
			/*
			 * No more children of this parent node.
			 * Move up to the grandparent.
			 */
			level--;
			if (level != 0) {
				if (parent_node->owner_id == owner_id) {
					deletion_node = parent_node;
				}
			}

			/* New "last child" is this parent node */

			child_node = parent_node;

			/* Move up the tree to the grandparent */

			parent_node = acpi_ns_get_parent_node(parent_node);
		}
	}

	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
	return_VOID;
}
Пример #9
0
void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
{
	struct acpi_namespace_node *child_node = NULL;
	u32 level = 1;

	ACPI_FUNCTION_TRACE(ns_delete_namespace_subtree);

	if (!parent_node) {
		return_VOID;
	}

	/*
	 * Traverse the tree of objects until we bubble back up
	 * to where we started.
	 */
	while (level > 0) {

		/* Get the next node in this scope (NULL if none) */

		child_node = acpi_ns_get_next_node(parent_node, child_node);
		if (child_node) {

			/* Found a child node - detach any attached object */

			acpi_ns_detach_object(child_node);

			/* Check if this node has any children */

			if (child_node->child) {
				/*
				 * There is at least one child of this node,
				 * visit the node
				 */
				level++;
				parent_node = child_node;
				child_node = NULL;
			}
		} else {
			/*
			 * No more children of this parent node.
			 * Move up to the grandparent.
			 */
			level--;

			/*
			 * Now delete all of the children of this parent
			 * all at the same time.
			 */
			acpi_ns_delete_children(parent_node);

			/* New "last child" is this parent node */

			child_node = parent_node;

			/* Move up the tree to the grandparent */

			parent_node = acpi_ns_get_parent_node(parent_node);
		}
	}

	return_VOID;
}
Пример #10
0
void
acpi_ns_delete_namespace_by_owner (
	u16                             owner_id)
{
	struct acpi_namespace_node      *child_node;
	struct acpi_namespace_node      *deletion_node;
	u32                             level;
	struct acpi_namespace_node      *parent_node;


	ACPI_FUNCTION_TRACE_U32 ("ns_delete_namespace_by_owner", owner_id);


	parent_node   = acpi_gbl_root_node;
	child_node    = NULL;
	deletion_node = NULL;
	level         = 1;

	/*
	 * Traverse the tree of nodes until we bubble back up
	 * to where we started.
	 */
	while (level > 0) {
		/*
		 * Get the next child of this parent node. When child_node is NULL,
		 * the first child of the parent is returned
		 */
		child_node = acpi_ns_get_next_node (ACPI_TYPE_ANY, parent_node, child_node);

		if (deletion_node) {
			acpi_ns_remove_reference (deletion_node);
			deletion_node = NULL;
		}

		if (child_node) {
			if (child_node->owner_id == owner_id) {
				/* Found a matching child node - detach any attached object */

				acpi_ns_detach_object (child_node);
			}

			/* Check if this node has any children */

			if (acpi_ns_get_next_node (ACPI_TYPE_ANY, child_node, NULL)) {
				/*
				 * There is at least one child of this node,
				 * visit the node
				 */
				level++;
				parent_node = child_node;
				child_node = NULL;
			}
			else if (child_node->owner_id == owner_id) {
				deletion_node = child_node;
			}
		}
		else {
			/*
			 * No more children of this parent node.
			 * Move up to the grandparent.
			 */
			level--;
			if (level != 0) {
				if (parent_node->owner_id == owner_id) {
					deletion_node = parent_node;
				}
			}

			/* New "last child" is this parent node */

			child_node = parent_node;

			/* Move up the tree to the grandparent */

			parent_node = acpi_ns_get_parent_node (parent_node);
		}
	}

	return_VOID;
}
Пример #11
0
acpi_status
acpi_ns_walk_namespace(acpi_object_type type,
		       acpi_handle start_node,
		       u32 max_depth,
		       u32 flags,
		       acpi_walk_callback pre_order_visit,
		       acpi_walk_callback post_order_visit,
		       void *context, void **return_value)
{
	acpi_status status;
	acpi_status mutex_status;
	struct acpi_namespace_node *child_node;
	struct acpi_namespace_node *parent_node;
	acpi_object_type child_type;
	u32 level;
	u8 node_previously_visited = FALSE;

	ACPI_FUNCTION_TRACE(ns_walk_namespace);

	

	if (start_node == ACPI_ROOT_OBJECT) {
		start_node = acpi_gbl_root_node;
	}

	

	parent_node = start_node;
	child_node = acpi_ns_get_next_node(parent_node, NULL);
	child_type = ACPI_TYPE_ANY;
	level = 1;

	while (level > 0 && child_node) {
		status = AE_OK;

		

		if (type != ACPI_TYPE_ANY) {
			child_type = child_node->type;
		}

		if ((child_node->flags & ANOBJ_TEMPORARY) &&
		    !(flags & ACPI_NS_WALK_TEMP_NODES)) {
			status = AE_CTRL_DEPTH;
		}

		

		else if (child_type == type) {
			if (flags & ACPI_NS_WALK_UNLOCK) {
				mutex_status =
				    acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
				if (ACPI_FAILURE(mutex_status)) {
					return_ACPI_STATUS(mutex_status);
				}
			}

			if (!node_previously_visited) {
				if (pre_order_visit) {
					status =
					    pre_order_visit(child_node, level,
							    context,
							    return_value);
				}
			} else {
				if (post_order_visit) {
					status =
					    post_order_visit(child_node, level,
							     context,
							     return_value);
				}
			}

			if (flags & ACPI_NS_WALK_UNLOCK) {
				mutex_status =
				    acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
				if (ACPI_FAILURE(mutex_status)) {
					return_ACPI_STATUS(mutex_status);
				}
			}

			switch (status) {
			case AE_OK:
			case AE_CTRL_DEPTH:

				
				break;

			case AE_CTRL_TERMINATE:

				

				return_ACPI_STATUS(AE_OK);

			default:

				

				return_ACPI_STATUS(status);
			}
		}

		if (!node_previously_visited &&
		    (level < max_depth) && (status != AE_CTRL_DEPTH)) {
			if (child_node->child) {

				

				level++;
				parent_node = child_node;
				child_node =
				    acpi_ns_get_next_node(parent_node, NULL);
				continue;
			}
		}

		

		if (!node_previously_visited) {
			node_previously_visited = TRUE;
			continue;
		}

		

		child_node = acpi_ns_get_next_node(parent_node, child_node);
		if (child_node) {
			node_previously_visited = FALSE;
		}

		

		else {
			level--;
			child_node = parent_node;
			parent_node = parent_node->parent;

			node_previously_visited = TRUE;
		}
	}

	

	return_ACPI_STATUS(AE_OK);
}
Пример #12
0
/**ltl
 * 功能: 遍历以start_node为始的节点,分别调用user_function
 * 参数: type			->要遍历的节点类型
 *		start_node	->起始节点
 *		max_depth		->深度
 *		unlock_before_callback->
 *		user_function	->每个遍历到的节点调用的回调函数
 *		context		->给回调函数传递的参数
 *		return_value	->[out]返回值
 * 返回值:
 * 说明:
 */
acpi_status
acpi_ns_walk_namespace(acpi_object_type type,
		       acpi_handle start_node,
		       u32 max_depth,
		       u8 unlock_before_callback,
		       acpi_walk_callback user_function,
		       void *context, void **return_value)
{
	acpi_status status;
	acpi_status mutex_status;
	struct acpi_namespace_node *child_node;
	struct acpi_namespace_node *parent_node;
	acpi_object_type child_type;
	u32 level;

	ACPI_FUNCTION_TRACE(ns_walk_namespace);

	/* Special case for the namespace Root Node */

	if (start_node == ACPI_ROOT_OBJECT) {
		start_node = acpi_gbl_root_node;
	}

	/* Null child means "get first node" */

	parent_node = start_node;
	child_node = NULL;
	child_type = ACPI_TYPE_ANY;
	level = 1;

	/*
	 * Traverse the tree of nodes until we bubble back up to where we
	 * started. When Level is zero, the loop is done because we have
	 * bubbled up to (and passed) the original parent handle (start_entry)
	 */
	while (level > 0) {

		/* Get the next node in this scope.  Null if not found */

		status = AE_OK;
		/* 获取下一个节点 */
		child_node =
		    acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node, child_node);
		if (child_node) {	/* 子节点不为NULL */
			/*
			 * Found node, Get the type if we are not
			 * searching for ANY
			 */
			if (type != ACPI_TYPE_ANY) {
				child_type = child_node->type;
			}

			if (child_type == type) { /* 节点类型一致 */
				/*
				 * Found a matching node, invoke the user
				 * callback function
				 */
				if (unlock_before_callback) {
					mutex_status =
					    acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
					if (ACPI_FAILURE(mutex_status)) {
						return_ACPI_STATUS(mutex_status);
					}
				}
				/* 调用回调函数 */
				status = user_function(child_node, level, context, return_value);

				if (unlock_before_callback) {
					mutex_status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
					if (ACPI_FAILURE(mutex_status)) {
						return_ACPI_STATUS(mutex_status);
					}
				}

				switch (status) {
				case AE_OK:
				case AE_CTRL_DEPTH:

					/* Just keep going */
					break;

				case AE_CTRL_TERMINATE:

					/* Exit now, with OK status */

					return_ACPI_STATUS(AE_OK);

				default:

					/* All others are valid exceptions */

					return_ACPI_STATUS(status);
				}
			}

			/*
			 * Depth first search:
			 * Attempt to go down another level in the namespace
			 * if we are allowed to.  Don't go any further if we
			 * have reached the caller specified maximum depth
			 * or if the user function has specified that the
			 * maximum depth has been reached.
			 */
			/* 节点深度 */
			if ((level < max_depth) && (status != AE_CTRL_DEPTH)) {
				if (acpi_ns_get_next_node(ACPI_TYPE_ANY, child_node, NULL)) { /*存在下一个子节点*/
					/*
					 * There is at least one child of this
					 * node, visit the onde
					 */
					level++; /* 递增深度 */
					parent_node = child_node; /* 以子节点做为起始,开始新的遍历 */
					child_node = NULL;
				}
			}
		}
		else { /* 子节点不存在 */
			/*
			 * No more children of this node (acpi_ns_get_next_node
			 * failed), go back upwards in the namespace tree to
			 * the node's parent.
			 */
			level--; /* 回溯深度 */
			child_node = parent_node; 
			parent_node = acpi_ns_get_parent_node(parent_node); /* 获取父节点 */
		}
	}

	/* Complete walk, not terminated by user function */

	return_ACPI_STATUS(AE_OK);
}