[PATCH][Natty SRU] acer-wmi: does not set persistence state by rfkill_init_sw_state

Seth Forshee seth.forshee at canonical.com
Thu Apr 21 15:57:48 UTC 2011

From: Lee, Chun-Yi <joeyli.kernel at gmail.com>

BugLink: http://bugs.launchpad.net/bugs/710738

Acer BIOS keeps devices state when system reboot, but reset to default
device states (Wlan on, Bluetooth off, wwan on) if system cold boot.
That means BIOS's initial state is not always real persistence.

So, removed rfkill_init_sw_state because it sets initial state to
persistence then replicate to other new killswitch when rfkill-input
After removed it, acer-wmi set initial soft-block state after rfkill
register, and doesn't allow set_block until rfkill initial finished.

Reference: bko#31002

Cc: Carlos Corbacho <carlos at strangeworlds.co.uk>
Cc: Matthew Garrett <mjg at redhat.com>
Cc: Dmitry Torokhov <dtor at mail.ru>
Cc: Corentin Chary <corentincj at iksaif.net>
Cc: Oldřich Jedlička <oldium.pro at seznam.cz>
Cc: Johannes Berg <johannes at sipsolutions.net>
Signed-off-by: Lee, Chun-Yi <jlee at novell.com>
Signed-off-by: Matthew Garrett <mjg at redhat.com>
(cherry picked from commit 8215af019040ce9182728afee9642d8fdeb17f59)

Signed-off-by: Seth Forshee <seth.forshee at canonical.com>
 drivers/platform/x86/acer-wmi.c |   19 ++++++++++++++-----
 1 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c
index 38b34a7..fa54ba7 100644
--- a/drivers/platform/x86/acer-wmi.c
+++ b/drivers/platform/x86/acer-wmi.c
@@ -222,6 +222,7 @@ struct acer_debug {
 static struct rfkill *wireless_rfkill;
 static struct rfkill *bluetooth_rfkill;
 static struct rfkill *threeg_rfkill;
+static bool rfkill_inited;
 /* Each low-level interface must define at least some of the following */
 struct wmi_interface {
@@ -1161,9 +1162,13 @@ static int acer_rfkill_set(void *data, bool blocked)
 	acpi_status status;
 	u32 cap = (unsigned long)data;
-	status = set_u32(!blocked, cap);
-	if (ACPI_FAILURE(status))
-		return -ENODEV;
+	if (rfkill_inited) {
+		status = set_u32(!blocked, cap);
+		if (ACPI_FAILURE(status))
+			return -ENODEV;
+	}
 	return 0;
@@ -1187,14 +1192,16 @@ static struct rfkill *acer_rfkill_register(struct device *dev,
 		return ERR_PTR(-ENOMEM);
 	status = get_device_status(&state, cap);
-	if (ACPI_SUCCESS(status))
-		rfkill_init_sw_state(rfkill_dev, !state);
 	err = rfkill_register(rfkill_dev);
 	if (err) {
 		return ERR_PTR(err);
+	if (ACPI_SUCCESS(status))
+		rfkill_set_sw_state(rfkill_dev, !state);
 	return rfkill_dev;
@@ -1229,6 +1236,8 @@ static int acer_rfkill_init(struct device *dev)
+	rfkill_inited = true;
 	schedule_delayed_work(&acer_rfkill_work, round_jiffies_relative(HZ));
 	return 0;

More information about the kernel-team mailing list