aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform/x86/xo1-rfkill.c
diff options
context:
space:
mode:
authorDaniel Drake <dsd@laptop.org>2012-04-18 13:08:21 -0400
committerMatthew Garrett <mjg@redhat.com>2012-05-31 14:23:39 -0400
commitbc7ab495c7532f06bc03021c0d78ac384fb13c14 (patch)
tree099863503d7c95b356bab64fd88e831ec8e9b4b8 /drivers/platform/x86/xo1-rfkill.c
parent14b234b10544046544a81095c9ab372842f80eea (diff)
xo1-rfkill: only act when blocked state is changed
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>
Diffstat (limited to 'drivers/platform/x86/xo1-rfkill.c')
-rw-r--r--drivers/platform/x86/xo1-rfkill.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/platform/x86/xo1-rfkill.c b/drivers/platform/x86/xo1-rfkill.c
index 41781ed8301c..b57ad8641480 100644
--- a/drivers/platform/x86/xo1-rfkill.c
+++ b/drivers/platform/x86/xo1-rfkill.c
@@ -15,15 +15,26 @@
15 15
16#include <asm/olpc.h> 16#include <asm/olpc.h>
17 17
18static bool card_blocked;
19
18static int rfkill_set_block(void *data, bool blocked) 20static int rfkill_set_block(void *data, bool blocked)
19{ 21{
20 unsigned char cmd; 22 unsigned char cmd;
23 int r;
24
25 if (blocked == card_blocked)
26 return 0;
27
21 if (blocked) 28 if (blocked)
22 cmd = EC_WLAN_ENTER_RESET; 29 cmd = EC_WLAN_ENTER_RESET;
23 else 30 else
24 cmd = EC_WLAN_LEAVE_RESET; 31 cmd = EC_WLAN_LEAVE_RESET;
25 32
26 return olpc_ec_cmd(cmd, NULL, 0, NULL, 0); 33 r = olpc_ec_cmd(cmd, NULL, 0, NULL, 0);
34 if (r == 0)
35 card_blocked = blocked;
36
37 return r;
27} 38}
28 39
29static const struct rfkill_ops rfkill_ops = { 40static const struct rfkill_ops rfkill_ops = {