Skip to content

Commit

Permalink
wl12xx: optimise elp wakeup and sleep calls
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Kalle Valo authored and John W. Linville committed Jul 10, 2009
1 parent cee4fd2 commit 01d9cfb
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 13 deletions.
13 changes: 0 additions & 13 deletions drivers/net/wireless/wl12xx/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@ int wl12xx_cmd_send(struct wl12xx *wl, u16 id, void *buf, size_t len)

WARN_ON(len % 4 != 0);

wl12xx_ps_elp_wakeup(wl);

wl12xx_spi_mem_write(wl, wl->cmd_box_addr, buf, len);

wl12xx_reg_write32(wl, ACX_REG_INTERRUPT_TRIG, INTR_TRIG_CMD);
Expand All @@ -57,8 +55,6 @@ int wl12xx_cmd_send(struct wl12xx *wl, u16 id, void *buf, size_t len)
wl->chip.intr_cmd_complete);

out:
wl12xx_ps_elp_sleep(wl);

return ret;
}

Expand Down Expand Up @@ -91,13 +87,8 @@ int wl12xx_cmd_test(struct wl12xx *wl, void *buf, size_t buf_len, u8 answer)
* The answer would be a wl12xx_command, where the
* parameter array contains the actual answer.
*/

wl12xx_ps_elp_wakeup(wl);

wl12xx_spi_mem_read(wl, wl->cmd_box_addr, buf, buf_len);

wl12xx_ps_elp_sleep(wl);

cmd_answer = buf;

if (cmd_answer->header.status != CMD_STATUS_SUCCESS)
Expand Down Expand Up @@ -134,13 +125,9 @@ int wl12xx_cmd_interrogate(struct wl12xx *wl, u16 id, void *buf, size_t len)
goto out;
}

wl12xx_ps_elp_wakeup(wl);

/* the interrogate command got in, we can read the answer */
wl12xx_spi_mem_read(wl, wl->cmd_box_addr, buf, len);

wl12xx_ps_elp_sleep(wl);

acx = buf;
if (acx->cmd.status != CMD_STATUS_SUCCESS)
wl12xx_error("INTERROGATE command error: %d",
Expand Down
5 changes: 5 additions & 0 deletions drivers/net/wireless/wl12xx/debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

#include "wl12xx.h"
#include "acx.h"
#include "ps.h"

/* ms */
#define WL12XX_DEBUGFS_STATS_LIFETIME 1000
Expand Down Expand Up @@ -96,13 +97,17 @@ static void wl12xx_debugfs_update_stats(struct wl12xx *wl)
{
mutex_lock(&wl->mutex);

wl12xx_ps_elp_wakeup(wl);

if (wl->state == WL12XX_STATE_ON &&
time_after(jiffies, wl->stats.fw_stats_update +
msecs_to_jiffies(WL12XX_DEBUGFS_STATS_LIFETIME))) {
wl12xx_acx_statistics(wl, wl->stats.fw_stats);
wl->stats.fw_stats_update = jiffies;
}

wl12xx_ps_elp_sleep(wl);

mutex_unlock(&wl->mutex);
}

Expand Down
20 changes: 20 additions & 0 deletions drivers/net/wireless/wl12xx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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);
}

Expand Down

0 comments on commit 01d9cfb

Please sign in to comment.