From 01d9cfbdaadc64a46b57437c989bbad241074135 Mon Sep 17 00:00:00 2001 From: Kalle Valo Date: Fri, 12 Jun 2009 14:16:26 +0300 Subject: 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 Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho Signed-off-by: John W. Linville --- drivers/net/wireless/wl12xx/main.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'drivers/net/wireless/wl12xx/main.c') 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) if (wl->state == WL12XX_STATE_OFF) goto out; + wl12xx_ps_elp_wakeup(wl); + ret = wl12xx_cmd_join(wl, wl->bss_type, 1, 100, 0); if (ret < 0) goto out; out: + wl12xx_ps_elp_sleep(wl); mutex_unlock(&wl->mutex); } @@ -521,6 +524,8 @@ static int wl12xx_op_config(struct ieee80211_hw *hw, u32 changed) mutex_lock(&wl->mutex); + wl12xx_ps_elp_wakeup(wl); + if (channel != wl->channel) { /* FIXME: use beacon interval provided by mac80211 */ 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) } out: + wl12xx_ps_elp_sleep(wl); mutex_unlock(&wl->mutex); return ret; } @@ -702,6 +708,8 @@ static int wl12xx_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, mutex_lock(&wl->mutex); + wl12xx_ps_elp_wakeup(wl); + switch (cmd) { case SET_KEY: 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, } out_unlock: + wl12xx_ps_elp_sleep(wl); mutex_unlock(&wl->mutex); out: @@ -946,7 +955,11 @@ static int wl12xx_op_hw_scan(struct ieee80211_hw *hw, } mutex_lock(&wl->mutex); + wl12xx_ps_elp_wakeup(wl); + ret = wl12xx_hw_scan(hw->priv, ssid, ssid_len, 1, 0, 13, 3); + + wl12xx_ps_elp_sleep(wl); mutex_unlock(&wl->mutex); return ret; @@ -959,11 +972,15 @@ static int wl12xx_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value) mutex_lock(&wl->mutex); + wl12xx_ps_elp_wakeup(wl); + ret = wl12xx_acx_rts_threshold(wl, (u16) value); if (ret < 0) wl12xx_warning("wl12xx_op_set_rts_threshold failed: %d", ret); + wl12xx_ps_elp_sleep(wl); + mutex_unlock(&wl->mutex); return ret; @@ -983,6 +1000,8 @@ static void wl12xx_op_bss_info_changed(struct ieee80211_hw *hw, mutex_lock(&wl->mutex); + wl12xx_ps_elp_wakeup(wl); + if (changed & BSS_CHANGED_ASSOC) { if (bss_conf->assoc) { wl->aid = bss_conf->aid; @@ -1072,6 +1091,7 @@ static void wl12xx_op_bss_info_changed(struct ieee80211_hw *hw, } out: + wl12xx_ps_elp_sleep(wl); mutex_unlock(&wl->mutex); } -- cgit v1.2.1