acpiphp: Identify more removable slots
PATCH v2 1/2 acpiphp: Identify more removable slots
From: Matthew Garrett <[email protected]>
According to section 6.3.6 of the ACPI spec, the presence of an _RMV method that evaluates to 1 is sufficient to indicate that a slot is removable without needing an eject method. This patch refactors the ejectable slot detection code a little in order to flag these slots as ejectable and register them. Acpihp therefore binds to the expresscard slot on my HP test machine.
--- drivers/pci/hotplug/acpiphp_glue.c | 32 +++++++++++++++++--------------- 1 files changed, 17 insertions(+), 15 deletions(-)
drivers/pci/hotplug/acpiphp_glue.c +17 -15
@@ -74,7 +74,7 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *contex* Ejectable slot should satisfy at least these conditions: * * 1. has _ADR method -* 2. has _EJ0 method +* 2. has _EJ0 method or _RMV method * * optionally *
@@ -87,18 +87,25 @@ static int is_ejectable(acpi_handle handle) {acpi_status status;acpi_handle tmp; +unsigned long long removable; status =acpi_get_handle (handle,"_ADR" , &tmp); -if (ACPI_FAILURE (status)) { +if (ACPI_FAILURE (status))return 0 ; - } status =acpi_get_handle (handle,"_EJ0" , &tmp); -if (ACPI_FAILURE (status)) { -return 0 ; +if (ACPI_SUCCESS (status)) +return 1 ; + + status =acpi_get_handle (handle,"_RMV" , &tmp); +if (ACPI_SUCCESS (status)) { + status =acpi_evaluate_integer (handle,"_RMV" ,NULL , + &removable); +if (ACPI_SUCCESS (status) && removable) +return 1 ; } -return 1 ; +return 0 ; }
@@ -185,16 +192,10 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)unsigned long long adr, sun;int device, function, retval; - status =acpi_evaluate_integer (handle,"_ADR" ,NULL , &adr); - -if (ACPI_FAILURE (status)) -return AE_OK ; - - status =acpi_get_handle (handle,"_EJ0" , &tmp); - -if (ACPI_FAILURE (status) && !(is_dock_device (handle))) +if (!is_ejectable (handle) && !is_dock_device (handle))return AE_OK ; +acpi_evaluate_integer (handle,"_ADR" ,NULL , &adr); device = (adr >>16 ) &0xffff ; function = adr &0xffff ;
@@ -205,7 +206,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)INIT_LIST_HEAD (&newfunc->sibling); newfunc->handle = handle; newfunc->function = function; -if (ACPI_SUCCESS (status)) + +if (ACPI_SUCCESS (acpi_get_handle (handle,"_EJ0" , &tmp))) newfunc->flags =FUNC_HAS_EJ0 ;if (ACPI_SUCCESS (acpi_get_handle (handle,"_STA" , &tmp)))
Signature · 1 line
Matthew Garrett | [email protected]
PATCH v2 2/2 acpiphp: Call _LCK method
From: Matthew Garrett <[email protected]>
Removable ACPI devices may have _LCK methods to indicate a software controlled lock. These should be locked on device insertion and unlocked when the user requests the device be ejected. Add support for flagging devices with a _LCK method and then call appropriately on the add and eject paths.
--- drivers/pci/hotplug/acpiphp.h | 1 + drivers/pci/hotplug/acpiphp_glue.c | 45 +++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletions(-)
drivers/pci/hotplug/acpiphp.h +1 -0
@@ -194,6 +194,7 @@ struct acpiphp_ioapic {#define FUNC_HAS_PS2 (0x00000040)#define FUNC_HAS_PS3 (0x00000080)#define FUNC_HAS_DCK (0x00000100) +#define FUNC_HAS_LCK (0x00000200)/* function prototypes */
drivers/pci/hotplug/acpiphp_glue.c +44 -1
75 lines not on this page · raw message
Signature · 1 line
Matthew Garrett | [email protected]
Re: [PATCH v2 2/2] acpiphp: Call _LCK method
Quoted 7 lines · Matthew Garrett
From: Matthew Garrett <[email protected]>
Removable ACPI devices may have
_LCKmethods to indicate a software controlled lock. These should be locked on device insertion and unlocked when the user requests the device be ejected. Add support for flagging devices with a_LCKmethod and then call appropriately on the add and eject paths.
Please ignore this one - I've just realised it'll break on device reenumeration. The other patch in the series should be good, though.
Signature · 1 line
Matthew Garrett | [email protected]
PATCH 1/1 acpiphp: Identify more removable slots
In reply to Matthew GarrettAccording to section 6.3.6 of the ACPI spec, the presence of an _RMV method that evaluates to 1 is sufficient to indicate that a slot is removable without needing an eject method. This patch refactors the ejectable slot detection code a little in order to flag these slots as ejectable and register them. Acpihp then binds to the expresscard slot on my HP test machine.
---
The _LCK handling code requires some more cleanup and ideally some hardware that actually implements it
drivers/pci/hotplug/acpiphp_glue.c | 32 +++++++++++++++++--------------- 1 files changed, 17 insertions(+), 15 deletions(-)
drivers/pci/hotplug/acpiphp_glue.c +17 -15
@@ -74,7 +74,7 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *contex* Ejectable slot should satisfy at least these conditions: * * 1. has _ADR method -* 2. has _EJ0 method +* 2. has _EJ0 method or _RMV method * * optionally *
@@ -87,18 +87,25 @@ static int is_ejectable(acpi_handle handle) {acpi_status status;acpi_handle tmp; +unsigned long long removable; status =acpi_get_handle (handle,"_ADR" , &tmp); -if (ACPI_FAILURE (status)) { +if (ACPI_FAILURE (status))return 0 ; - } status =acpi_get_handle (handle,"_EJ0" , &tmp); -if (ACPI_FAILURE (status)) { -return 0 ; +if (ACPI_SUCCESS (status)) +return 1 ; + + status =acpi_get_handle (handle,"_RMV" , &tmp); +if (ACPI_SUCCESS (status)) { + status =acpi_evaluate_integer (handle,"_RMV" ,NULL , + &removable); +if (ACPI_SUCCESS (status) && removable) +return 1 ; } -return 1 ; +return 0 ; }
@@ -185,16 +192,10 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)unsigned long long adr, sun;int device, function, retval; - status =acpi_evaluate_integer (handle,"_ADR" ,NULL , &adr); - -if (ACPI_FAILURE (status)) -return AE_OK ; - - status =acpi_get_handle (handle,"_EJ0" , &tmp); - -if (ACPI_FAILURE (status) && !(is_dock_device (handle))) +if (!is_ejectable (handle) && !is_dock_device (handle))return AE_OK ; +acpi_evaluate_integer (handle,"_ADR" ,NULL , &adr); device = (adr >>16 ) &0xffff ; function = adr &0xffff ;
@@ -205,7 +206,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)INIT_LIST_HEAD (&newfunc->sibling); newfunc->handle = handle; newfunc->function = function; -if (ACPI_SUCCESS (status)) + +if (ACPI_SUCCESS (acpi_get_handle (handle,"_EJ0" , &tmp))) newfunc->flags =FUNC_HAS_EJ0 ;if (ACPI_SUCCESS (acpi_get_handle (handle,"_STA" , &tmp)))
Signature · 1 line
Matthew Garrett | [email protected]
PATCH 1/1 acpiphp: Identify more removable slots
According to section 6.3.6 of the ACPI spec, the presence of an _RMV method that evaluates to 1 is sufficient to indicate that a slot is removable without needing an eject method. This patch refactors the ejectable slot detection code a little in order to flag these slots as ejectable and register them. Acpihp then binds to the expresscard slot on my HP test machine.
---
The _LCK handling code requires some more cleanup and ideally some hardware that actually implements it
drivers/pci/hotplug/acpiphp_glue.c | 32 +++++++++++++++++--------------- 1 files changed, 17 insertions(+), 15 deletions(-)
drivers/pci/hotplug/acpiphp_glue.c +17 -15
@@ -74,7 +74,7 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *contex* Ejectable slot should satisfy at least these conditions: * * 1. has _ADR method -* 2. has _EJ0 method +* 2. has _EJ0 method or _RMV method * * optionally *
@@ -87,18 +87,25 @@ static int is_ejectable(acpi_handle handle) {acpi_status status;acpi_handle tmp; +unsigned long long removable; status =acpi_get_handle (handle,"_ADR" , &tmp); -if (ACPI_FAILURE (status)) { +if (ACPI_FAILURE (status))return 0 ; - } status =acpi_get_handle (handle,"_EJ0" , &tmp); -if (ACPI_FAILURE (status)) { -return 0 ; +if (ACPI_SUCCESS (status)) +return 1 ; + + status =acpi_get_handle (handle,"_RMV" , &tmp); +if (ACPI_SUCCESS (status)) { + status =acpi_evaluate_integer (handle,"_RMV" ,NULL , + &removable); +if (ACPI_SUCCESS (status) && removable) +return 1 ; } -return 1 ; +return 0 ; }
@@ -185,16 +192,10 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)unsigned long long adr, sun;int device, function, retval; - status =acpi_evaluate_integer (handle,"_ADR" ,NULL , &adr); - -if (ACPI_FAILURE (status)) -return AE_OK ; - - status =acpi_get_handle (handle,"_EJ0" , &tmp); - -if (ACPI_FAILURE (status) && !(is_dock_device (handle))) +if (!is_ejectable (handle) && !is_dock_device (handle))return AE_OK ; +acpi_evaluate_integer (handle,"_ADR" ,NULL , &adr); device = (adr >>16 ) &0xffff ; function = adr &0xffff ;
@@ -205,7 +206,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)INIT_LIST_HEAD (&newfunc->sibling); newfunc->handle = handle; newfunc->function = function; -if (ACPI_SUCCESS (status)) + +if (ACPI_SUCCESS (acpi_get_handle (handle,"_EJ0" , &tmp))) newfunc->flags =FUNC_HAS_EJ0 ;if (ACPI_SUCCESS (acpi_get_handle (handle,"_STA" , &tmp)))
Signature · 1 line
Matthew Garrett | [email protected]
Quoted 8 lines · On Tue, 25 Nov 2008 13:48:14 -0800 Matthew Garrett <[email protected]> wrote:
According to section 6.3.6 of the ACPI spec, the presence of an
_RMVmethod that evaluates to 1 is sufficient to indicate that a slot is removable without needing an eject method. This patch refactors the ejectable slot detection code a little in order to flag these slots as ejectable and register them. Acpihp then binds to the expresscard slot on my HP test machine.Signed-off-by Matthew Garrett <[email protected]>
This looks good to me.
Quoted 83 lines
---
The
_LCKhandling code requires some more cleanup and ideally some hardware that actually implements itdrivers/pci/hotplug/acpiphp_glue.c | 32 +++++++++++++++++--------------- 1 files changed, 17 insertions(+), 15 deletions(-)drivers/pci/hotplug/acpiphp_glue.c +17
-15@@ -74,7 +74,7 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *contex* Ejectable slot should satisfy at least these conditions: * * 1. has _ADR method -* 2. has _EJ0 method +* 2. has _EJ0 method or _RMV method * * optionally * @@ -87,18 +87,25 @@ static int is_ejectable(acpi_handle handle) {acpi_status status;acpi_handle tmp; +unsigned long long removable; status =acpi_get_handle (handle,"_ADR" , &tmp); -if (ACPI_FAILURE (status)) { +if (ACPI_FAILURE (status))return 0 ; - } status =acpi_get_handle (handle,"_EJ0" , &tmp); -if (ACPI_FAILURE (status)) { -return 0 ; +if (ACPI_SUCCESS (status)) +return 1 ; + + status =acpi_get_handle (handle,"_RMV" , &tmp); +if (ACPI_SUCCESS (status)) { + status =acpi_evaluate_integer (handle,"_RMV" ,NULL , + &removable); +if (ACPI_SUCCESS (status) && removable) +return 1 ; } -return 1 ; +return 0 ; }@@ -185,16 +192,10 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)unsigned long long adr, sun;int device, function, retval; - status =acpi_evaluate_integer (handle,"_ADR" ,NULL , &adr); - -if (ACPI_FAILURE (status)) -return AE_OK ; - - status =acpi_get_handle (handle,"_EJ0" , &tmp); - -if (ACPI_FAILURE (status) && !(is_dock_device (handle))) +if (!is_ejectable (handle) && !is_dock_device (handle))return AE_OK ; +acpi_evaluate_integer (handle,"_ADR" ,NULL , &adr); device = (adr >>16 ) &0xffff ; function = adr &0xffff ;@@ -205,7 +206,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)INIT_LIST_HEAD (&newfunc->sibling); newfunc->handle = handle; newfunc->function = function; -if (ACPI_SUCCESS (status)) + +if (ACPI_SUCCESS (acpi_get_handle (handle,"_EJ0" , &tmp))) newfunc->flags =FUNC_HAS_EJ0 ;if (ACPI_SUCCESS (acpi_get_handle (handle,"_STA" , &tmp)))
Jesse Barnes
AppliedQuoted 8 lines · Matthew Garrett
According to section 6.3.6 of the ACPI spec, the presence of an
_RMVmethod that evaluates to 1 is sufficient to indicate that a slot is removable without needing an eject method. This patch refactors the ejectable slot detection code a little in order to flag these slots as ejectable and register them. Acpihp then binds to the expresscard slot on my HP test machine.Signed-off-by Matthew Garrett <[email protected]>
Applied to my linux-next branch, thanks Matthew.
Signature · 1 line
Jesse Barnes, Intel Open Source Technology Center