static ACPI_STATUS acpi_ns_get_device_callback ( ACPI_HANDLE obj_handle, u32 nesting_level, void *context, void **return_value) { ACPI_STATUS status; ACPI_NAMESPACE_NODE *node; u32 flags; DEVICE_ID device_id; ACPI_GET_DEVICES_INFO *info; info = context; acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); node = acpi_ns_convert_handle_to_entry (obj_handle); if (!node) { acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); return (AE_BAD_PARAMETER); } acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); /* * Run _STA to determine if device is present */ status = acpi_cm_execute_STA (node, &flags); if (ACPI_FAILURE (status)) { return (status); } if (!(flags & 0x01)) { /* don't return at the device or children of the device if not there */ return (AE_CTRL_DEPTH); } /* * Filter based on device HID */ if (info->hid != NULL) { status = acpi_cm_execute_HID (node, &device_id); if (status == AE_NOT_FOUND) { return (AE_OK); } else if (ACPI_FAILURE (status)) { return (status); } if (STRNCMP (device_id.buffer, info->hid, sizeof (device_id.buffer)) != 0) { return (AE_OK); } } info->user_function (obj_handle, nesting_level, info->context, return_value); return (AE_OK); }