[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