aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/wl12xx/main.c
diff options
context:
space:
mode:
authorKalle Valo <kalle.valo@nokia.com>2009-06-12 07:16:26 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-07-10 14:57:47 -0400
commit01d9cfbdaadc64a46b57437c989bbad241074135 (patch)
tree8c3946f17ee1571515271ffa550c22a643b8bb33 /drivers/net/wireless/wl12xx/main.c
parentcee4fd2712a3db21f432bdff14e59aed160453b2 (diff)
wl12xx: optimise elp wakeup and sleep calls
The wakeup call was done too deep in code path, it's better to wakeup chip from higher levels. This will also reduce wakeup calls significantly. Signed-off-by: Kalle Valo <kalle.valo@nokia.com> Reviewed-by: Luciano Coelho <luciano.coelho@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/main.c')
-rw-r--r--drivers/net/wireless/wl12xx/main.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c
index 7ec174992787..894d5cc43d25 100644
--- a/drivers/net/wireless/wl12xx/main.c
+++ b/drivers/net/wireless/wl12xx/main.c
@@ -239,11 +239,14 @@ static void wl12xx_filter_work(struct work_struct *work)
239 if (wl->state == WL12XX_STATE_OFF) 239 if (wl->state == WL12XX_STATE_OFF)
240 goto out; 240 goto out;
241 241
242 wl12xx_ps_elp_wakeup(wl);
243
242 ret = wl12xx_cmd_join(wl, wl->bss_type, 1, 100, 0); 244 ret = wl12xx_cmd_join(wl, wl->bss_type, 1, 100, 0);
243 if (ret < 0) 245 if (ret < 0)
244 goto out; 246 goto out;
245 247
246out: 248out:
249 wl12xx_ps_elp_sleep(wl);
247 mutex_unlock(&wl->mutex); 250 mutex_unlock(&wl->mutex);
248} 251}
249 252
@@ -521,6 +524,8 @@ static int wl12xx_op_config(struct ieee80211_hw *hw, u32 changed)
521 524
522 mutex_lock(&wl->mutex); 525 mutex_lock(&wl->mutex);
523 526
527 wl12xx_ps_elp_wakeup(wl);
528
524 if (channel != wl->channel) { 529 if (channel != wl->channel) {
525 /* FIXME: use beacon interval provided by mac80211 */ 530 /* FIXME: use beacon interval provided by mac80211 */
526 ret = wl12xx_cmd_join(wl, wl->bss_type, 1, 100, 0); 531 ret = wl12xx_cmd_join(wl, wl->bss_type, 1, 100, 0);
@@ -564,6 +569,7 @@ static int wl12xx_op_config(struct ieee80211_hw *hw, u32 changed)
564 } 569 }
565 570
566out: 571out:
572 wl12xx_ps_elp_sleep(wl);
567 mutex_unlock(&wl->mutex); 573 mutex_unlock(&wl->mutex);
568 return ret; 574 return ret;
569} 575}
@@ -702,6 +708,8 @@ static int wl12xx_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
702 708
703 mutex_lock(&wl->mutex); 709 mutex_lock(&wl->mutex);
704 710
711 wl12xx_ps_elp_wakeup(wl);
712
705 switch (cmd) { 713 switch (cmd) {
706 case SET_KEY: 714 case SET_KEY:
707 wl_cmd->key_action = KEY_ADD_OR_REPLACE; 715 wl_cmd->key_action = KEY_ADD_OR_REPLACE;
@@ -752,6 +760,7 @@ static int wl12xx_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
752 } 760 }
753 761
754out_unlock: 762out_unlock:
763 wl12xx_ps_elp_sleep(wl);
755 mutex_unlock(&wl->mutex); 764 mutex_unlock(&wl->mutex);
756 765
757out: 766out:
@@ -946,7 +955,11 @@ static int wl12xx_op_hw_scan(struct ieee80211_hw *hw,
946 } 955 }
947 956
948 mutex_lock(&wl->mutex); 957 mutex_lock(&wl->mutex);
958 wl12xx_ps_elp_wakeup(wl);
959
949 ret = wl12xx_hw_scan(hw->priv, ssid, ssid_len, 1, 0, 13, 3); 960 ret = wl12xx_hw_scan(hw->priv, ssid, ssid_len, 1, 0, 13, 3);
961
962 wl12xx_ps_elp_sleep(wl);
950 mutex_unlock(&wl->mutex); 963 mutex_unlock(&wl->mutex);
951 964
952 return ret; 965 return ret;
@@ -959,11 +972,15 @@ static int wl12xx_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
959 972
960 mutex_lock(&wl->mutex); 973 mutex_lock(&wl->mutex);
961 974
975 wl12xx_ps_elp_wakeup(wl);
976
962 ret = wl12xx_acx_rts_threshold(wl, (u16) value); 977 ret = wl12xx_acx_rts_threshold(wl, (u16) value);
963 978
964 if (ret < 0) 979 if (ret < 0)
965 wl12xx_warning("wl12xx_op_set_rts_threshold failed: %d", ret); 980 wl12xx_warning("wl12xx_op_set_rts_threshold failed: %d", ret);
966 981
982 wl12xx_ps_elp_sleep(wl);
983
967 mutex_unlock(&wl->mutex); 984 mutex_unlock(&wl->mutex);
968 985
969 return ret; 986 return ret;
@@ -983,6 +1000,8 @@ static void wl12xx_op_bss_info_changed(struct ieee80211_hw *hw,
983 1000
984 mutex_lock(&wl->mutex); 1001 mutex_lock(&wl->mutex);
985 1002
1003 wl12xx_ps_elp_wakeup(wl);
1004
986 if (changed & BSS_CHANGED_ASSOC) { 1005 if (changed & BSS_CHANGED_ASSOC) {
987 if (bss_conf->assoc) { 1006 if (bss_conf->assoc) {
988 wl->aid = bss_conf->aid; 1007 wl->aid = bss_conf->aid;
@@ -1072,6 +1091,7 @@ static void wl12xx_op_bss_info_changed(struct ieee80211_hw *hw,
1072 } 1091 }
1073 1092
1074out: 1093out:
1094 wl12xx_ps_elp_sleep(wl);
1075 mutex_unlock(&wl->mutex); 1095 mutex_unlock(&wl->mutex);
1076} 1096}
1077 1097