ACPI:add _STA evaluating at do_acpi_find_child()
PATCH v2 1/1 ACPI:add _STA evaluating at do_acpi_find_child()
From: Jeff Wu <[email protected]>
v2:
To make do_acpi_find_child() return the disabled device if it's only one matching device. Rafael suggested that it had better to make do_acpi_find_child() return the disabled device if it's only one matching or the first enabled matching deivce otherwise. v1:
Once do_acpi_find_child() found the first matching handle, it makes the acpi_get_child() loop stop and return the matching handle. But, at some of the platforms, a "_ADR" is with the multiple devices, and if one is enabled, the others will be disabled. Just like a case:
Address : 0x1FFFF ; handle : SB_PCI0.SATA.DEV0
Address : 0x1FFFF ; handle : SB_PCI0.SATA.DEV1
Address : 0x1FFFF ; handle : SB_PCI0.SATA.DEV2
If DEV0 and DEV1 are disabled and DEV2 is enabled, the target is to get DEV2 handle, but actually it always return the first disabled device DEV0 handle. So add a _STA evaluating at do_acpi_find_child() to check the device status. If the object exists, but it is disabled, acpi_get_child() will continue looping to get the correct handle that the object exists and is enabled.
---
Changes from v2:
* Rearrange the changelog description.
--- drivers/acpi/glue.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/acpi/glue.c +4 -2
@@ -81,13 +81,15 @@ static struct acpi_bus_type *acpi_get_bus_type(struct device *dev)static acpi_status do_acpi_find_child (acpi_handle handle,u32 lvl_not_used,void *addr_p,void **ret_p) { -unsigned long long addr; +unsigned long long addr, sta;acpi_status status; status =acpi_evaluate_integer (handle,METHOD_NAME__ADR ,NULL , &addr);if (ACPI_SUCCESS (status) && addr == *((u64 *)addr_p)) { *ret_p = handle; -return AE_CTRL_TERMINATE ; + status =acpi_bus_get_status_handle (handle, &sta); +if (ACPI_SUCCESS (status) && (sta &ACPI_STA_DEVICE_ENABLED )) +return AE_CTRL_TERMINATE ; }return AE_OK ; }
Signature · 1 line
1.8.1.2
Hi Rafael,
How about the patch ?Thanks.
Jeff Wu
Quoted 57 lines · On Wed, May 29, 2013 at 2:31 PM, <[email protected]> wrote:
From: Jeff Wu <[email protected]>
v2:
To makedo_acpi_find_child()return the disabled device if it's only one matching device. Rafael suggested that it had better to makedo_acpi_find_child()return the disabled device if it's only one matching or the first enabled matching deivce otherwise. v1:
Oncedo_acpi_find_child()found the first matching handle, it makes theacpi_get_child()loop stop and return the matching handle. But, at some of the platforms, a "_ADR" is with the multiple devices, and if one is enabled, the others will be disabled. Just like a case:
Address :0x1FFFF; handle : SB_PCI0.SATA.DEV0
Address :0x1FFFF; handle : SB_PCI0.SATA.DEV1
Address :0x1FFFF; handle : SB_PCI0.SATA.DEV2If DEV0 and DEV1 are disabled and DEV2 is enabled, the target is to get DEV2 handle, but actually it always return the first disabled device DEV0 handle. So add a
_STAevaluating atdo_acpi_find_child()to check the device status. If the object exists, but it is disabled,acpi_get_child()will continue looping to get the correct handle that the object exists and is enabled.Signed-off-by Jeff Wu <[email protected]>---
Changes from v2:
* Rearrange the changelog description.--- drivers/acpi/glue.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/acpi/glue.c +4
-3@@ -81,13 +81,15 @@ static struct acpi_bus_type *acpi_get_bus_type(struct device *dev)static acpi_status do_acpi_find_child (acpi_handle handle,u32 lvl_not_used,void *addr_p,void **ret_p) { -unsigned long long addr; +unsigned long long addr, sta;acpi_status status; status =acpi_evaluate_integer (handle,METHOD_NAME__ADR ,NULL , &addr);if (ACPI_SUCCESS (status) && addr == *((u64 *)addr_p)) { *ret_p = handle; -return AE_CTRL_TERMINATE ; + status =acpi_bus_get_status_handle (handle, &sta); +if (ACPI_SUCCESS (status) && (sta &ACPI_STA_DEVICE_ENABLED )) +return AE_CTRL_TERMINATE ; }return AE_OK ; } --1.8.1.2
Quoted 3 lines · Jeff Wu
Hi Rafael,
How about the patch ?Thanks.
It's in my linux-next branch. I modified the changelog slightly, though.
Thanks,
Rafael
Quoted 58 lines · On Wed, May 29, 2013 at 2:31 PM, <[email protected]> wrote:
Quoted 57 lines
From: Jeff Wu <[email protected]>
v2:
To makedo_acpi_find_child()return the disabled device if it's only one matching device. Rafael suggested that it had better to makedo_acpi_find_child()return the disabled device if it's only one matching or the first enabled matching deivce otherwise. v1:
Oncedo_acpi_find_child()found the first matching handle, it makes theacpi_get_child()loop stop and return the matching handle. But, at some of the platforms, a "_ADR" is with the multiple devices, and if one is enabled, the others will be disabled. Just like a case:
Address :0x1FFFF; handle : SB_PCI0.SATA.DEV0
Address :0x1FFFF; handle : SB_PCI0.SATA.DEV1
Address :0x1FFFF; handle : SB_PCI0.SATA.DEV2If DEV0 and DEV1 are disabled and DEV2 is enabled, the target is to get DEV2 handle, but actually it always return the first disabled device DEV0 handle. So add a
_STAevaluating atdo_acpi_find_child()to check the device status. If the object exists, but it is disabled,acpi_get_child()will continue looping to get the correct handle that the object exists and is enabled.Signed-off-by Jeff Wu <[email protected]>---
Changes from v2:
* Rearrange the changelog description.--- drivers/acpi/glue.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/acpi/glue.c +4
-3@@ -81,13 +81,15 @@ static struct acpi_bus_type *acpi_get_bus_type(struct device *dev)static acpi_status do_acpi_find_child (acpi_handle handle,u32 lvl_not_used,void *addr_p,void **ret_p) { -unsigned long long addr; +unsigned long long addr, sta;acpi_status status; status =acpi_evaluate_integer (handle,METHOD_NAME__ADR ,NULL , &addr);if (ACPI_SUCCESS (status) && addr == *((u64 *)addr_p)) { *ret_p = handle; -return AE_CTRL_TERMINATE ; + status =acpi_bus_get_status_handle (handle, &sta); +if (ACPI_SUCCESS (status) && (sta &ACPI_STA_DEVICE_ENABLED )) +return AE_CTRL_TERMINATE ; }return AE_OK ; } --1.8.1.2
Signature · 2 lines
I speak only for myself. Rafael J. Wysocki, Intel Open Source Technology Center.