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

Commit 91c12917 authored by Loic Poulain's avatar Loic Poulain Committed by Greg Kroah-Hartman
Browse files

wcn36xx: Fix dynamic power saving




[ Upstream commit 0856655a25476d4431005e39d606e349050066b0 ]

Since driver does not report hardware dynamic power saving cap,
this is up to the mac80211 to manage power saving timeout and
state machine, using the ieee80211 config callback to report
PS changes. This patch enables/disables PS mode according to
the new configuration.

Remove old behaviour enabling PS mode in a static way, this make
the device unusable when power save is enabled since device is
forced to PS regardless RX/TX traffic.

Acked-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: default avatarLoic Poulain <loic.poulain@linaro.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Signed-off-by: default avatarSasha Levin <alexander.levin@verizon.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3f39cc7f
Loading
Loading
Loading
Loading
+12 −11
Original line number Diff line number Diff line
@@ -384,6 +384,18 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed)
		}
	}

	if (changed & IEEE80211_CONF_CHANGE_PS) {
		list_for_each_entry(tmp, &wcn->vif_list, list) {
			vif = wcn36xx_priv_to_vif(tmp);
			if (hw->conf.flags & IEEE80211_CONF_PS) {
				if (vif->bss_conf.ps) /* ps allowed ? */
					wcn36xx_pmc_enter_bmps_state(wcn, vif);
			} else {
				wcn36xx_pmc_exit_bmps_state(wcn, vif);
			}
		}
	}

	mutex_unlock(&wcn->conf_mutex);

	return 0;
@@ -747,17 +759,6 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
		vif_priv->dtim_period = bss_conf->dtim_period;
	}

	if (changed & BSS_CHANGED_PS) {
		wcn36xx_dbg(WCN36XX_DBG_MAC,
			    "mac bss PS set %d\n",
			    bss_conf->ps);
		if (bss_conf->ps) {
			wcn36xx_pmc_enter_bmps_state(wcn, vif);
		} else {
			wcn36xx_pmc_exit_bmps_state(wcn, vif);
		}
	}

	if (changed & BSS_CHANGED_BSSID) {
		wcn36xx_dbg(WCN36XX_DBG_MAC, "mac bss changed_bssid %pM\n",
			    bss_conf->bssid);
+4 −2
Original line number Diff line number Diff line
@@ -45,8 +45,10 @@ int wcn36xx_pmc_exit_bmps_state(struct wcn36xx *wcn,
	struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif);

	if (WCN36XX_BMPS != vif_priv->pw_state) {
		wcn36xx_err("Not in BMPS mode, no need to exit from BMPS mode!\n");
		return -EINVAL;
		/* Unbalanced call or last BMPS enter failed */
		wcn36xx_dbg(WCN36XX_DBG_PMC,
			    "Not in BMPS mode, no need to exit\n");
		return -EALREADY;
	}
	wcn36xx_smd_exit_bmps(wcn, vif);
	vif_priv->pw_state = WCN36XX_FULL_POWER;