From: "Lee, Chun-Yi" <[email protected]>

Have many non-acer machines have AMW0_GUID2 method in DSDT, in
original acer-wmi design, driver direct set ACER_CAP_WIRELESS flag
for those machines but didn't check the functionality for set/get
wireless state.
It causes acer-wmi driver create a broken wireless rfkill and it
already set to soft blocked.

So, this patch add a wireless capability check before we set
ACER_CAP_WIRELESS flag to the machines that were included AMW0_GUID2.
It avoid acer-wmi create a broken wireless rfkill.

Thank's for Matthew Garrett give the idea.

Reference: brc#674353
        https://bugzilla.redhat.com/show_bug.cgi?id=674353

Tested on Lenovo E520.
Tested on Acer TravelMate 4750.

Tested-by: mr.kobzar <[email protected]>
Cc: Carlos Corbacho <[email protected]>
Cc: Matthew Garrett <[email protected]>
Cc: Dmitry Torokhov <[email protected]>
Cc: Corentin Chary <[email protected]>
Cc: Thomas Renninger <[email protected]>
Signed-off-by: Lee, Chun-Yi <[email protected]>
---
 drivers/platform/x86/acer-wmi.c |   33 ++++++++++++++++++++++++++++++++-
 1 files changed, 32 insertions(+), 1 deletions(-)

diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c
index 88dfecf..5dfa46a 100644
--- a/drivers/platform/x86/acer-wmi.c
+++ b/drivers/platform/x86/acer-wmi.c
@@ -678,6 +678,37 @@ static acpi_status AMW0_find_mailled(void)
        return AE_OK;
 }
 
+static void AMW0_GUID2_set_capabilities(void)
+{
+       acpi_status status;
+       u32 original_state, new_state;
+
+       /* set wireless capability when detected has quirk */
+       if (quirks->wireless > 0) {
+               interface->capability |= ACER_CAP_WIRELESS;
+               return;
+       }
+
+       status = AMW0_get_u32(&original_state, ACER_CAP_WIRELESS);
+       if (ACPI_FAILURE(status))
+               return;
+
+       status = AMW0_set_u32(!original_state, ACER_CAP_WIRELESS);
+       if (ACPI_FAILURE(status))
+               return;
+
+       status = AMW0_get_u32(&new_state, ACER_CAP_WIRELESS);
+       if (ACPI_FAILURE(status))
+               return;
+
+       status = AMW0_set_u32(original_state, ACER_CAP_WIRELESS);
+       if (ACPI_FAILURE(status))
+               return;
+
+       if (new_state != original_state)
+               interface->capability |= ACER_CAP_WIRELESS;
+}
+
 static acpi_status AMW0_set_capabilities(void)
 {
        struct wmab_args args;
@@ -691,7 +722,7 @@ static acpi_status AMW0_set_capabilities(void)
         * work.
         */
        if (wmi_has_guid(AMW0_GUID2)) {
-               interface->capability |= ACER_CAP_WIRELESS;
+               AMW0_GUID2_set_capabilities();
                return AE_OK;
        }
 
-- 
1.7.7

--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" 
in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to