mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-20 11:13:58 +08:00
ACPICA: AcpiGetDevices: Eliminate unnecessary _STA calls
In the case where a specific _HID is requested, do not run _STA until a _HID match is found. This eliminates potentially dozens of _STA calls during a search for a particular device/HID. Signed-off-by: Lin Ming <ming.m.lin@intel.com> Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
a8357b0c95
commit
5f8902acf8
@ -562,25 +562,20 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Run _STA to determine if device is present */
|
||||
|
||||
status = acpi_ut_execute_STA(node, &flags);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (AE_CTRL_DEPTH);
|
||||
}
|
||||
|
||||
if (!(flags & ACPI_STA_DEVICE_PRESENT) &&
|
||||
!(flags & ACPI_STA_DEVICE_FUNCTIONING)) {
|
||||
/*
|
||||
* Don't examine the children of the device only when the
|
||||
* device is neither present nor functional. See ACPI spec,
|
||||
* description of _STA for more information.
|
||||
*/
|
||||
return (AE_CTRL_DEPTH);
|
||||
}
|
||||
|
||||
/* Filter based on device HID & CID */
|
||||
|
||||
/*
|
||||
* First, filter based on the device HID and CID.
|
||||
*
|
||||
* 01/2010: For this case where a specific HID is requested, we don't
|
||||
* want to run _STA until we have an actual HID match. Thus, we will
|
||||
* not unnecessarily execute _STA on devices for which the caller
|
||||
* doesn't care about. Previously, _STA was executed unconditionally
|
||||
* on all devices found here.
|
||||
*
|
||||
* A side-effect of this change is that now we will continue to search
|
||||
* for a matching HID even under device trees where the parent device
|
||||
* would have returned a _STA that indicates it is not present or
|
||||
* not functioning (thus aborting the search on that branch).
|
||||
*/
|
||||
if (info->hid != NULL) {
|
||||
status = acpi_ut_execute_HID(node, &hid);
|
||||
if (status == AE_NOT_FOUND) {
|
||||
@ -620,6 +615,25 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
|
||||
}
|
||||
}
|
||||
|
||||
/* Run _STA to determine if device is present */
|
||||
|
||||
status = acpi_ut_execute_STA(node, &flags);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (AE_CTRL_DEPTH);
|
||||
}
|
||||
|
||||
if (!(flags & ACPI_STA_DEVICE_PRESENT) &&
|
||||
!(flags & ACPI_STA_DEVICE_FUNCTIONING)) {
|
||||
/*
|
||||
* Don't examine the children of the device only when the
|
||||
* device is neither present nor functional. See ACPI spec,
|
||||
* description of _STA for more information.
|
||||
*/
|
||||
return (AE_CTRL_DEPTH);
|
||||
}
|
||||
|
||||
/* We have a valid device, invoke the user function */
|
||||
|
||||
status = info->user_function(obj_handle, nesting_level, info->context,
|
||||
return_value);
|
||||
return (status);
|
||||
|
Loading…
Reference in New Issue
Block a user