wl1271: Idle handling into own function
As there is more and more stuff triggered by going in and out of idle, create a separate function for handling that. 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>
This commit is contained in:
parent
db81956cc4
commit
0d58cbff24
@ -349,6 +349,7 @@ struct wl1271 {
|
||||
#define WL1271_FLAG_IRQ_PENDING (9)
|
||||
#define WL1271_FLAG_IRQ_RUNNING (10)
|
||||
#define WL1271_FLAG_IDLE (11)
|
||||
#define WL1271_FLAG_IDLE_REQUESTED (12)
|
||||
unsigned long flags;
|
||||
|
||||
struct wl1271_partition_set part;
|
||||
|
@ -1135,11 +1135,6 @@ static int wl1271_dummy_join(struct wl1271 *wl)
|
||||
|
||||
memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
|
||||
|
||||
/* increment the session counter */
|
||||
wl->session_counter++;
|
||||
if (wl->session_counter >= SESSION_COUNTER_MAX)
|
||||
wl->session_counter = 0;
|
||||
|
||||
/* pass through frames from all BSS */
|
||||
wl1271_configure_filters(wl, FIF_OTHER_BSS);
|
||||
|
||||
@ -1253,6 +1248,42 @@ static u32 wl1271_min_rate_get(struct wl1271 *wl)
|
||||
return rate;
|
||||
}
|
||||
|
||||
static int wl1271_handle_idle(struct wl1271 *wl, bool idle)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (idle) {
|
||||
if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
|
||||
ret = wl1271_unjoin(wl);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
}
|
||||
wl->rate_set = wl1271_min_rate_get(wl);
|
||||
wl->sta_rate_set = 0;
|
||||
ret = wl1271_acx_rate_policies(wl);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
ret = wl1271_acx_keep_alive_config(
|
||||
wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
|
||||
ACX_KEEP_ALIVE_TPL_INVALID);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
set_bit(WL1271_FLAG_IDLE, &wl->flags);
|
||||
} else {
|
||||
/* increment the session counter */
|
||||
wl->session_counter++;
|
||||
if (wl->session_counter >= SESSION_COUNTER_MAX)
|
||||
wl->session_counter = 0;
|
||||
ret = wl1271_dummy_join(wl);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
clear_bit(WL1271_FLAG_IDLE, &wl->flags);
|
||||
}
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
|
||||
{
|
||||
struct wl1271 *wl = hw->priv;
|
||||
@ -1307,22 +1338,9 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_IDLE) {
|
||||
if (conf->flags & IEEE80211_CONF_IDLE &&
|
||||
test_bit(WL1271_FLAG_JOINED, &wl->flags))
|
||||
wl1271_unjoin(wl);
|
||||
else if (!(conf->flags & IEEE80211_CONF_IDLE))
|
||||
wl1271_dummy_join(wl);
|
||||
|
||||
if (conf->flags & IEEE80211_CONF_IDLE) {
|
||||
wl->rate_set = wl1271_min_rate_get(wl);
|
||||
wl->sta_rate_set = 0;
|
||||
wl1271_acx_rate_policies(wl);
|
||||
wl1271_acx_keep_alive_config(
|
||||
wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
|
||||
ACX_KEEP_ALIVE_TPL_INVALID);
|
||||
set_bit(WL1271_FLAG_IDLE, &wl->flags);
|
||||
} else
|
||||
clear_bit(WL1271_FLAG_IDLE, &wl->flags);
|
||||
ret = wl1271_handle_idle(wl, conf->flags & IEEE80211_CONF_IDLE);
|
||||
if (ret < 0)
|
||||
wl1271_warning("idle mode change failed %d", ret);
|
||||
}
|
||||
|
||||
if (conf->flags & IEEE80211_CONF_PS &&
|
||||
|
Loading…
Reference in New Issue
Block a user