diff options
author | Juuso Oikarinen <juuso.oikarinen@nokia.com> | 2010-04-09 04:07:29 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-04-09 13:43:10 -0400 |
commit | e19728181ca7187fa0ecb7076ce681311cf785e7 (patch) | |
tree | f766521cd0a678317fbedf20edccb6ed981ddaf9 /drivers/net/wireless/wl12xx | |
parent | aecb0565e3e331d4dd23b4d35180519532015f22 (diff) |
wl1271: Go to ELP in idle
Allow the wl1271 go to ELP mode also in idle. This will reduce current
consumption remarkably in idle mode (~12mA -> ~0.2mA)
Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: Teemu Paasikivi <ext-teemu.3.paasikivi@nokia.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/wl12xx')
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_main.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_ps.c | 6 |
3 files changed, 8 insertions, 3 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271.h b/drivers/net/wireless/wl12xx/wl1271.h index a29969efc86..78946007467 100644 --- a/drivers/net/wireless/wl12xx/wl1271.h +++ b/drivers/net/wireless/wl12xx/wl1271.h | |||
@@ -374,6 +374,7 @@ struct wl1271 { | |||
374 | #define WL1271_FLAG_PSM_REQUESTED (8) | 374 | #define WL1271_FLAG_PSM_REQUESTED (8) |
375 | #define WL1271_FLAG_IRQ_PENDING (9) | 375 | #define WL1271_FLAG_IRQ_PENDING (9) |
376 | #define WL1271_FLAG_IRQ_RUNNING (10) | 376 | #define WL1271_FLAG_IRQ_RUNNING (10) |
377 | #define WL1271_FLAG_IDLE (11) | ||
377 | unsigned long flags; | 378 | unsigned long flags; |
378 | 379 | ||
379 | struct wl1271_partition_set part; | 380 | struct wl1271_partition_set part; |
diff --git a/drivers/net/wireless/wl12xx/wl1271_main.c b/drivers/net/wireless/wl12xx/wl1271_main.c index 4adc5162e7e..551714164ff 100644 --- a/drivers/net/wireless/wl12xx/wl1271_main.c +++ b/drivers/net/wireless/wl12xx/wl1271_main.c | |||
@@ -1272,7 +1272,9 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed) | |||
1272 | wl1271_acx_keep_alive_config( | 1272 | wl1271_acx_keep_alive_config( |
1273 | wl, CMD_TEMPL_KLV_IDX_NULL_DATA, | 1273 | wl, CMD_TEMPL_KLV_IDX_NULL_DATA, |
1274 | ACX_KEEP_ALIVE_TPL_INVALID); | 1274 | ACX_KEEP_ALIVE_TPL_INVALID); |
1275 | } | 1275 | set_bit(WL1271_FLAG_IDLE, &wl->flags); |
1276 | } else | ||
1277 | clear_bit(WL1271_FLAG_IDLE, &wl->flags); | ||
1276 | } | 1278 | } |
1277 | 1279 | ||
1278 | if (conf->flags & IEEE80211_CONF_PS && | 1280 | if (conf->flags & IEEE80211_CONF_PS && |
diff --git a/drivers/net/wireless/wl12xx/wl1271_ps.c b/drivers/net/wireless/wl12xx/wl1271_ps.c index 5a04482b935..a5e60e0403e 100644 --- a/drivers/net/wireless/wl12xx/wl1271_ps.c +++ b/drivers/net/wireless/wl12xx/wl1271_ps.c | |||
@@ -40,7 +40,8 @@ void wl1271_elp_work(struct work_struct *work) | |||
40 | mutex_lock(&wl->mutex); | 40 | mutex_lock(&wl->mutex); |
41 | 41 | ||
42 | if (test_bit(WL1271_FLAG_IN_ELP, &wl->flags) || | 42 | if (test_bit(WL1271_FLAG_IN_ELP, &wl->flags) || |
43 | !test_bit(WL1271_FLAG_PSM, &wl->flags)) | 43 | (!test_bit(WL1271_FLAG_PSM, &wl->flags) && |
44 | !test_bit(WL1271_FLAG_IDLE, &wl->flags))) | ||
44 | goto out; | 45 | goto out; |
45 | 46 | ||
46 | wl1271_debug(DEBUG_PSM, "chip to elp"); | 47 | wl1271_debug(DEBUG_PSM, "chip to elp"); |
@@ -56,7 +57,8 @@ out: | |||
56 | /* Routines to toggle sleep mode while in ELP */ | 57 | /* Routines to toggle sleep mode while in ELP */ |
57 | void wl1271_ps_elp_sleep(struct wl1271 *wl) | 58 | void wl1271_ps_elp_sleep(struct wl1271 *wl) |
58 | { | 59 | { |
59 | if (test_bit(WL1271_FLAG_PSM, &wl->flags)) { | 60 | if (test_bit(WL1271_FLAG_PSM, &wl->flags) || |
61 | test_bit(WL1271_FLAG_IDLE, &wl->flags)) { | ||
60 | cancel_delayed_work(&wl->elp_work); | 62 | cancel_delayed_work(&wl->elp_work); |
61 | ieee80211_queue_delayed_work(wl->hw, &wl->elp_work, | 63 | ieee80211_queue_delayed_work(wl->hw, &wl->elp_work, |
62 | msecs_to_jiffies(ELP_ENTRY_DELAY)); | 64 | msecs_to_jiffies(ELP_ENTRY_DELAY)); |