於 四,2011-08-11 於 03:30 +0000,joeyli(Joey Lee) 提到:
> 於 四,2011-08-11 於 10:48 +0800,AceLan Kao 提到:
> > Dear Joey,
> > 
> > This is the dmesg log.
> > [ 9010.944053] acer_wmi: Acer Laptop ACPI-WMI Extras
> > [ 9010.944071] acer_wmi: Function bitmap for Communication Button: 0x1

Per this log, the 0x1 means your machine have wifi hardware module and
BIOS detected it then write information to SMBIOS area.

> > [ 9010.944075] acer_wmi: Brightness must be controlled by generic video 
> > driver
> > [ 9010.944996] input: Acer WMI hotkeys as /devices/virtual/input/input21
> > [ 9010.947095] acer_wmi: Set Device Status failed: 0xe2 - 0x0
> > 

But, 
here have problem when acer-wmi driver try to set the state by
WMID_GUID3 method, the wmi function response 0xe2.

> > And after adding my quirk, the set device status still failed, but
> > except that, everything works well.
> > 
> 
> So, you machine have wifi hardware module or not?
> 
> > The "failed" comes from acer_rfkill_init(), it'll call
> > acer_rfkill_register() with ACER_CAP_WIRELESS parameter without
> > checking the capability.
> > I don't know why only wifi doesn't check the capability and call
> > acer_rfkill_register() directly, but it doesn't hurt the system.
> > 
> > ===
> > static int acer_rfkill_init(struct device *dev)
> > {
> >         wireless_rfkill = acer_rfkill_register(dev, RFKILL_TYPE_WLAN,
> >                 "acer-wireless", ACER_CAP_WIRELESS);
> >         if (IS_ERR(wireless_rfkill))
> >                 return PTR_ERR(wireless_rfkill);
> > ===
> > 
> > Best regards,
> > AceLan Kao.
> > 
> 
> I checked the history, looks like it's just a original design in old
> patch.
> 
> Yes, you are right, add ACER_CAP_WIRELESS check is better. I am doing
> generate a patch to add ACER_CAP_WIRELESS check.
> Will attached patch on mail.
> 
> 
> Thank's
> Joey Lee
> 

Please let me know does there have any wifi module in your machine when
you test? 
If yes, then you need contact with BIOS team for why the WMID_GUID3
method response 0xe2 when set device state, because this function works
find on my TravelMate 8572 machine.

On the other hand,
The following is patch to check the ACER_CAP_WIRELESS before generate
wireless rfkill.


Thank's
Joey Lee

>From 18c20f2b40bc64ec72b52ae2e4d994237173f982 Mon Sep 17 00:00:00 2001
From: Lee, Chun-Yi <[email protected]>
Date: Thu, 11 Aug 2011 12:49:53 +0800
Subject: [PATCH] acer-wmi: check wireless capability flag before register rfkill

There will be better to check the wireless capability flag
(ACER_CAP_WIRELESS) before register wireless rfkill because maybe
the machine doesn't have wifi module or the module removed by user.

Signed-off-by: Lee, Chun-Yi <[email protected]>
---
 drivers/platform/x86/acer-wmi.c |   64 +++++++++++++++++++++++++-------------
 1 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c
index 712a505..b4078c4 100644
--- a/drivers/platform/x86/acer-wmi.c
+++ b/drivers/platform/x86/acer-wmi.c
@@ -1289,12 +1289,13 @@ static void acer_rfkill_update(struct work_struct 
*ignored)
        u32 state;
        acpi_status status;
 
-       status = get_u32(&state, ACER_CAP_WIRELESS);
-       if (ACPI_SUCCESS(status)) {
-               if (quirks->wireless == 3) {
-                       rfkill_set_hw_state(wireless_rfkill, !state);
-               } else {
-                       rfkill_set_sw_state(wireless_rfkill, !state);
+       if (has_cap(ACER_CAP_WIRELESS)) {
+               status = get_u32(&state, ACER_CAP_WIRELESS);
+               if (ACPI_SUCCESS(status)) {
+                       if (quirks->wireless == 3)
+                               rfkill_set_hw_state(wireless_rfkill, !state);
+                       else
+                               rfkill_set_sw_state(wireless_rfkill, !state);
                }
        }
 
@@ -1362,19 +1363,24 @@ static struct rfkill *acer_rfkill_register(struct 
device *dev,
 
 static int acer_rfkill_init(struct device *dev)
 {
-       wireless_rfkill = acer_rfkill_register(dev, RFKILL_TYPE_WLAN,
-               "acer-wireless", ACER_CAP_WIRELESS);
-       if (IS_ERR(wireless_rfkill))
-               return PTR_ERR(wireless_rfkill);
+       int err;
+
+       if (has_cap(ACER_CAP_WIRELESS)) {
+               wireless_rfkill = acer_rfkill_register(dev, RFKILL_TYPE_WLAN,
+                       "acer-wireless", ACER_CAP_WIRELESS);
+               if (IS_ERR(wireless_rfkill)) {
+                       err = PTR_ERR(wireless_rfkill);
+                       goto error_wireless;
+               }
+       }
 
        if (has_cap(ACER_CAP_BLUETOOTH)) {
                bluetooth_rfkill = acer_rfkill_register(dev,
                        RFKILL_TYPE_BLUETOOTH, "acer-bluetooth",
                        ACER_CAP_BLUETOOTH);
                if (IS_ERR(bluetooth_rfkill)) {
-                       rfkill_unregister(wireless_rfkill);
-                       rfkill_destroy(wireless_rfkill);
-                       return PTR_ERR(bluetooth_rfkill);
+                       err = PTR_ERR(bluetooth_rfkill);
+                       goto error_bluetooth;
                }
        }
 
@@ -1383,30 +1389,44 @@ static int acer_rfkill_init(struct device *dev)
                        RFKILL_TYPE_WWAN, "acer-threeg",
                        ACER_CAP_THREEG);
                if (IS_ERR(threeg_rfkill)) {
-                       rfkill_unregister(wireless_rfkill);
-                       rfkill_destroy(wireless_rfkill);
-                       rfkill_unregister(bluetooth_rfkill);
-                       rfkill_destroy(bluetooth_rfkill);
-                       return PTR_ERR(threeg_rfkill);
+                       err = PTR_ERR(threeg_rfkill);
+                       goto error_threeg;
                }
        }
 
        rfkill_inited = true;
 
-       if (ec_raw_mode || !wmi_has_guid(ACERWMID_EVENT_GUID))
+       if ((ec_raw_mode || !wmi_has_guid(ACERWMID_EVENT_GUID)) &&
+           has_cap(ACER_CAP_WIRELESS | ACER_CAP_BLUETOOTH | ACER_CAP_THREEG))
                schedule_delayed_work(&acer_rfkill_work,
                        round_jiffies_relative(HZ));
 
        return 0;
+
+error_threeg:
+       if (has_cap(ACER_CAP_BLUETOOTH)) {
+               rfkill_unregister(bluetooth_rfkill);
+               rfkill_destroy(bluetooth_rfkill);
+       }
+error_bluetooth:
+       if (has_cap(ACER_CAP_WIRELESS)) {
+               rfkill_unregister(wireless_rfkill);
+               rfkill_destroy(wireless_rfkill);
+       }
+error_wireless:
+       return err;
 }
 
 static void acer_rfkill_exit(void)
 {
-       if (ec_raw_mode || !wmi_has_guid(ACERWMID_EVENT_GUID))
+       if ((ec_raw_mode || !wmi_has_guid(ACERWMID_EVENT_GUID)) &&
+           has_cap(ACER_CAP_WIRELESS | ACER_CAP_BLUETOOTH | ACER_CAP_THREEG))
                cancel_delayed_work_sync(&acer_rfkill_work);
 
-       rfkill_unregister(wireless_rfkill);
-       rfkill_destroy(wireless_rfkill);
+       if (has_cap(ACER_CAP_WIRELESS)) {
+               rfkill_unregister(wireless_rfkill);
+               rfkill_destroy(wireless_rfkill);
+       }
 
        if (has_cap(ACER_CAP_BLUETOOTH)) {
                rfkill_unregister(bluetooth_rfkill);
-- 
1.6.0.2



--
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