xo1-rfkill: only act when blocked state is changed
authorDaniel Drake <dsd@laptop.org>
Wed, 18 Apr 2012 17:08:21 +0000 (18:08 +0100)
committerMatthew Garrett <mjg@redhat.com>
Thu, 31 May 2012 18:23:39 +0000 (14:23 -0400)
The XO-1 rfkill driver should only send EC commands when changing
between blocked/unblocked state.

The rfkill switch is asked to be unblocked on every resume (even when
the card was never blocked before) and sending a EC_WLAN_LEAVE_RESET
command here upsets the resume sequence of the libertas driver. Adding
the check to avoid the spurious EC_WLAN_LEAVE_RESET fixes the wifi resume
behaviour.

The rfkill state is maintained by the hardware over suspend/resume
so no extra consideration is needed here.

Signed-off-by: Daniel Drake <dsd@laptop.org>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
drivers/platform/x86/xo1-rfkill.c

index 41781ed8301c737018494bb30a19677640cc9018..b57ad8641480424b660f4d447acebdcf9ec9a2b4 100644 (file)
 
 #include <asm/olpc.h>
 
+static bool card_blocked;
+
 static int rfkill_set_block(void *data, bool blocked)
 {
        unsigned char cmd;
+       int r;
+
+       if (blocked == card_blocked)
+               return 0;
+
        if (blocked)
                cmd = EC_WLAN_ENTER_RESET;
        else
                cmd = EC_WLAN_LEAVE_RESET;
 
-       return olpc_ec_cmd(cmd, NULL, 0, NULL, 0);
+       r = olpc_ec_cmd(cmd, NULL, 0, NULL, 0);
+       if (r == 0)
+               card_blocked = blocked;
+
+       return r;
 }
 
 static const struct rfkill_ops rfkill_ops = {