Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0d58cbff authored by Juuso Oikarinen's avatar Juuso Oikarinen Committed by John W. Linville
Browse files

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: default avatarJuuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: default avatarTeemu Paasikivi <ext-teemu.3.paasikivi@nokia.com>
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent db81956c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
+39 −21
Original line number Diff line number Diff line
@@ -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 &&