+/* Local prototypes */
+static acpi_status
+acpi_ns_execute_control_method(struct acpi_parameter_info *info);
+
+static acpi_status acpi_ns_get_object_value(struct acpi_parameter_info *info);
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ns_evaluate_relative
+ *
+ * PARAMETERS: Pathname - Name of method to execute, If NULL, the
+ * handle is the object to execute
+ * Info - Method info block, contains:
+ * return_object - Where to put method's return value (if
+ * any). If NULL, no value is returned.
+ * Params - List of parameters to pass to the method,
+ * terminated by NULL. Params itself may be
+ * NULL if no parameters are being passed.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Evaluate the object or find and execute the requested method
+ *
+ * MUTEX: Locks Namespace
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ns_evaluate_relative(char *pathname, struct acpi_parameter_info *info)
+{
+ acpi_status status;
+ struct acpi_namespace_node *node = NULL;
+ union acpi_generic_state *scope_info;
+ char *internal_path = NULL;
+
+ ACPI_FUNCTION_TRACE("ns_evaluate_relative");
+
+ /*
+ * Must have a valid object handle
+ */
+ if (!info || !info->node) {
+ return_ACPI_STATUS(AE_BAD_PARAMETER);
+ }
+
+ /* Build an internal name string for the method */
+
+ status = acpi_ns_internalize_name(pathname, &internal_path);
+ if (ACPI_FAILURE(status)) {
+ return_ACPI_STATUS(status);
+ }
+
+ scope_info = acpi_ut_create_generic_state();
+ if (!scope_info) {
+ goto cleanup1;
+ }
+
+ /* Get the prefix handle and Node */
+
+ status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE(status)) {
+ goto cleanup;
+ }
+
+ info->node = acpi_ns_map_handle_to_node(info->node);
+ if (!info->node) {
+ (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+ status = AE_BAD_PARAMETER;
+ goto cleanup;
+ }
+
+ /* Lookup the name in the namespace */
+
+ scope_info->scope.node = info->node;
+ status = acpi_ns_lookup(scope_info, internal_path, ACPI_TYPE_ANY,
+ ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, NULL,
+ &node);
+
+ (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+
+ if (ACPI_FAILURE(status)) {
+ ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "Object [%s] not found [%s]\n",
+ pathname, acpi_format_exception(status)));
+ goto cleanup;
+ }
+
+ /*
+ * Now that we have a handle to the object, we can attempt to evaluate it.
+ */
+ ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "%s [%p] Value %p\n",
+ pathname, node, acpi_ns_get_attached_object(node)));
+
+ info->node = node;
+ status = acpi_ns_evaluate_by_handle(info);
+
+ ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
+ "*** Completed eval of object %s ***\n", pathname));
+
+ cleanup:
+ acpi_ut_delete_generic_state(scope_info);
+
+ cleanup1:
+ ACPI_MEM_FREE(internal_path);
+ return_ACPI_STATUS(status);
+}
+