0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0018
0019 #include "wcn36xx.h"
0020
0021 #define WCN36XX_BMPS_FAIL_THREHOLD 3
0022
0023 int wcn36xx_pmc_enter_bmps_state(struct wcn36xx *wcn,
0024 struct ieee80211_vif *vif)
0025 {
0026 int ret = 0;
0027 struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif);
0028
0029 ret = wcn36xx_smd_enter_bmps(wcn, vif);
0030 if (!ret) {
0031 wcn36xx_dbg(WCN36XX_DBG_PMC, "Entered BMPS\n");
0032 vif_priv->pw_state = WCN36XX_BMPS;
0033 vif_priv->bmps_fail_ct = 0;
0034 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
0035 } else {
0036
0037
0038
0039
0040
0041 wcn36xx_err("Can not enter BMPS!\n");
0042
0043 if (vif_priv->bmps_fail_ct++ == WCN36XX_BMPS_FAIL_THREHOLD) {
0044 ieee80211_connection_loss(vif);
0045 vif_priv->bmps_fail_ct = 0;
0046 }
0047 }
0048 return ret;
0049 }
0050
0051 int wcn36xx_pmc_exit_bmps_state(struct wcn36xx *wcn,
0052 struct ieee80211_vif *vif)
0053 {
0054 struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif);
0055
0056 if (WCN36XX_BMPS != vif_priv->pw_state) {
0057
0058 wcn36xx_dbg(WCN36XX_DBG_PMC,
0059 "Not in BMPS mode, no need to exit\n");
0060 return -EALREADY;
0061 }
0062 wcn36xx_smd_exit_bmps(wcn, vif);
0063 vif_priv->pw_state = WCN36XX_FULL_POWER;
0064 vif->driver_flags &= ~IEEE80211_VIF_BEACON_FILTER;
0065 return 0;
0066 }
0067
0068 int wcn36xx_enable_keep_alive_null_packet(struct wcn36xx *wcn,
0069 struct ieee80211_vif *vif)
0070 {
0071 wcn36xx_dbg(WCN36XX_DBG_PMC, "%s\n", __func__);
0072 return wcn36xx_smd_keep_alive_req(wcn, vif,
0073 WCN36XX_HAL_KEEP_ALIVE_NULL_PKT);
0074 }