[PATCH 9/9] wcn36xx: Ignore every second dtim when host is down
Eugene Krasnikov
k.eugene.e at gmail.com
Fri Sep 6 04:09:21 EDT 2013
This will save even more power when host is down.
Signed-off-by: Eugene Krasnikov <k.eugene.e at gmail.com>
---
hal.h | 8 ++++----
main.c | 3 +++
smd.c | 29 +++++++++++++++++++++++++++++
smd.h | 1 +
4 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/hal.h b/hal.h
index 56da0dc..c02dbc6 100644
--- a/hal.h
+++ b/hal.h
@@ -4325,7 +4325,7 @@ struct wcn36xx_hal_rcv_flt_pkt_set_mc_list_rsp_msg {
/* Packet Filtering Definitions End */
-struct set_power_params_req_msg {
+struct wcn36xx_hal_set_power_params_req_msg {
struct wcn36xx_hal_msg_header header;
/* Ignore DTIM */
@@ -4345,15 +4345,15 @@ struct set_power_params_req_msg {
/* Beacon Early Termination Interval */
u32 bet_interval;
-};
+} __packed;
-struct set_power_params_resp {
+struct wcn36xx_hal_set_power_params_resp {
struct wcn36xx_hal_msg_header header;
/* status of the request */
u32 status;
-};
+} __packed;
/* Capability bitmap exchange definitions and macros starts */
diff --git a/main.c b/main.c
index 1d47ae3..651863f 100644
--- a/main.c
+++ b/main.c
@@ -733,9 +733,11 @@ static int wcn36xx_sta_remove(struct ieee80211_hw *hw,
static int wcn36xx_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wow)
{
struct wcn36xx *wcn = hw->priv;
+
wcn36xx_dbg(WCN36XX_DBG_MAC, "mac suspend\n");
flush_workqueue(wcn->hal_ind_wq);
+ wcn36xx_smd_set_power_params(wcn, true);
return 0;
}
@@ -746,6 +748,7 @@ static int wcn36xx_resume(struct ieee80211_hw *hw)
wcn36xx_dbg(WCN36XX_DBG_MAC, "mac resume\n");
flush_workqueue(wcn->hal_ind_wq);
+ wcn36xx_smd_set_power_params(wcn, false);
return 0;
}
diff --git a/smd.c b/smd.c
index 3495455..bcf35d5 100644
--- a/smd.c
+++ b/smd.c
@@ -1541,7 +1541,35 @@ out:
mutex_unlock(&wcn->hal_mutex);
return ret;
}
+int wcn36xx_smd_set_power_params(struct wcn36xx *wcn, bool ignore_dtim)
+{
+ struct wcn36xx_hal_set_power_params_req_msg msg_body;
+ int ret = 0;
+
+ mutex_lock(&wcn->hal_mutex);
+ INIT_HAL_MSG(msg_body, WCN36XX_HAL_SET_POWER_PARAMS_REQ);
+
+ /*
+ * When host is down ignore every second dtim
+ */
+ if (ignore_dtim) {
+ msg_body.ignore_dtim = 1;
+ msg_body.dtim_period = 2;
+ }
+ msg_body.listen_interval = WCN36XX_LISTEN_INTERVAL(wcn);
+
+ PREPARE_HAL_BUF(wcn->hal_buf, msg_body);
+ ret = wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
+ if (ret) {
+ wcn36xx_err("Sending hal_set_power_params failed\n");
+ goto out;
+ }
+
+out:
+ mutex_unlock(&wcn->hal_mutex);
+ return ret;
+}
/* Notice: This function should be called after associated, or else it
* will be invalid
*/
@@ -1973,6 +2001,7 @@ static void wcn36xx_smd_rsp_process(struct wcn36xx *wcn, void *buf, size_t len)
case WCN36XX_HAL_RMV_STAKEY_RSP:
case WCN36XX_HAL_RMV_BSSKEY_RSP:
case WCN36XX_HAL_ENTER_BMPS_RSP:
+ case WCN36XX_HAL_SET_POWER_PARAMS_RSP:
case WCN36XX_HAL_EXIT_BMPS_RSP:
case WCN36XX_HAL_KEEP_ALIVE_RSP:
case WCN36XX_HAL_DUMP_COMMAND_RSP:
diff --git a/smd.h b/smd.h
index df1a021..ef6309c 100644
--- a/smd.h
+++ b/smd.h
@@ -100,6 +100,7 @@ int wcn36xx_smd_remove_bsskey(struct wcn36xx *wcn,
u8 keyidx);
int wcn36xx_smd_enter_bmps(struct wcn36xx *wcn, struct ieee80211_vif *vif);
int wcn36xx_smd_exit_bmps(struct wcn36xx *wcn, struct ieee80211_vif *vif);
+int wcn36xx_smd_set_power_params(struct wcn36xx *wcn, bool ignore_dtim);
int wcn36xx_smd_keep_alive_req(struct wcn36xx *wcn,
struct ieee80211_vif *vif,
int packet_type);
--
1.8.2.2
More information about the wcn36xx
mailing list