Ver Fonte

qcacld-3.0: Port modulated dtim and override listen interval

Port modulated dtim and override listen interval to PMO from
WMA.

Change-Id: Id965dd8ee0fbddfa563335fd2fe225dcd20cd162
CRs-Fixed: 2252788
Nachiket Kukade há 6 anos atrás
pai
commit
4b7c8e03c7

+ 6 - 2
components/pmo/core/inc/wlan_pmo_priv.h

@@ -109,8 +109,10 @@ struct wlan_pmo_ctx {
  * @p2plo_in_progress: true when p2plo_in_progress in progress else false
  * @dtim_period: dtim period for vdev
  * @beacon_interval: vdev beacon interval
- * @alt_modulated_dtim_enabled:dynamic modulated dtim enabled
+ * @dyn_modulated_dtim: dynamically configured modulated dtim value
+ * @dyn_modulated_dtim_enabled: if dynamically modulated dtim is set or not
  * @dtim_policy: tells vdev beacon dtim policy
+ * @dyn_listen_interval: dynamically user configured listen interval
  * @pmo_vdev_lock: spin lock for pmo vdev priv ctx
  */
 struct pmo_vdev_priv_obj {
@@ -131,8 +133,10 @@ struct pmo_vdev_priv_obj {
 	bool p2plo_in_progress;
 	uint8_t dtim_period;
 	uint8_t beacon_interval;
-	bool alt_modulated_dtim_enable;
+	uint32_t dyn_modulated_dtim;
+	bool dyn_modulated_dtim_enabled;
 	uint32_t dtim_policy;
+	uint32_t dyn_listen_interval;
 	qdf_spinlock_t pmo_vdev_lock;
 };
 

+ 24 - 19
components/pmo/core/inc/wlan_pmo_suspend_resume.h

@@ -140,25 +140,6 @@ QDF_STATUS pmo_core_psoc_suspend_target(struct wlan_objmgr_psoc *psoc,
 QDF_STATUS pmo_core_psoc_bus_resume_req(struct wlan_objmgr_psoc *psoc,
 		enum qdf_suspend_type type);
 
-/**
- * pmo_core_update_alt_modulated_dtim_enable() - update alt modulatate dtim
- * @vdev: objmgr vdev handle
- * @value: true when alt modulated dtim enable else false
- *
- * Return: None
- */
-static inline
-void pmo_core_update_alt_modulated_dtim_enable(struct wlan_objmgr_vdev *vdev,
-	bool value)
-{
-	struct pmo_vdev_priv_obj *vdev_ctx;
-
-	vdev_ctx = pmo_vdev_get_priv(vdev);
-	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
-	vdev_ctx->alt_modulated_dtim_enable = value;
-	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
-}
-
 /**
  * pmo_core_vdev_set_dtim_policy() - Set vdev beacon dtim policy
  * @vdev: objmgr vdev handle
@@ -388,6 +369,30 @@ void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack);
  */
 void pmo_core_psoc_wakeup_host_event_received(struct wlan_objmgr_psoc *psoc);
 
+/**
+ * pmo_core_config_listen_interval() - function to dynamically configure
+ * listen interval
+ * @vdev: objmgr vdev
+ * @listen_interval: new listen interval passed by user
+ *
+ * This function allows user to configure listen interval dynamically
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS pmo_core_config_listen_interval(struct wlan_objmgr_vdev *vdev,
+					   uint32_t listen_interval);
+
+/**
+ * pmo_core_config_modulated_dtim() - function to configure modulated dtim
+ * @vdev: objmgr vdev handle
+ * @mod_dtim: New modulated dtim value passed by user
+ *
+ * This function configures the modulated dtim in firmware
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS pmo_core_config_modulated_dtim(struct wlan_objmgr_vdev *vdev,
+					  uint32_t mod_dtim);
 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
 
 #endif /* end  of _WLAN_PMO_SUSPEND_RESUME_H_ */

+ 171 - 13
components/pmo/core/src/wlan_pmo_suspend_resume.c

@@ -214,6 +214,26 @@ static void pmo_core_set_vdev_suspend_dtim(struct wlan_objmgr_psoc *psoc,
 	}
 }
 
+/*
+ * pmo_is_listen_interval_user_set() - Check if listen interval is configured
+ * by user or not
+ * @vdev_ctx: PMO vdev private object
+ *
+ * Return: true if listen interval is user configured else false
+ */
+static inline
+bool pmo_is_listen_interval_user_set(struct pmo_vdev_priv_obj *vdev_ctx)
+{
+	bool retval;
+
+	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+	retval = vdev_ctx->dyn_modulated_dtim_enabled
+		 || vdev_ctx->dyn_listen_interval;
+	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+
+	return retval;
+}
+
 /**
  * pmo_core_set_suspend_dtim() - set suspend dtim
  * @psoc: objmgr psoc handle
@@ -225,9 +245,17 @@ static void pmo_core_set_suspend_dtim(struct wlan_objmgr_psoc *psoc)
 	uint8_t vdev_id;
 	struct wlan_objmgr_vdev *vdev;
 	struct pmo_vdev_priv_obj *vdev_ctx;
-	bool alt_mdtim_enabled;
+	struct pmo_psoc_priv_obj *psoc_ctx;
+	bool li_offload_support = false;
 	QDF_STATUS status;
 
+	pmo_psoc_with_ctx(psoc, psoc_ctx) {
+		li_offload_support = psoc_ctx->caps.li_offload;
+	}
+
+	if (li_offload_support)
+		pmo_debug("listen interval offload support is enabled");
+
 	/* Iterate through VDEV list */
 	for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
 		vdev = pmo_psoc_get_vdev(psoc, vdev_id);
@@ -239,11 +267,8 @@ static void pmo_core_set_suspend_dtim(struct wlan_objmgr_psoc *psoc)
 			continue;
 
 		vdev_ctx = pmo_vdev_get_priv(vdev);
-		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
-		alt_mdtim_enabled = vdev_ctx->alt_modulated_dtim_enable;
-		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
-
-		if (!alt_mdtim_enabled)
+		if (!pmo_is_listen_interval_user_set(vdev_ctx)
+		    && !li_offload_support)
 			pmo_core_set_vdev_suspend_dtim(psoc, vdev, vdev_ctx);
 
 		pmo_vdev_put_ref(vdev);
@@ -482,9 +507,17 @@ static void pmo_core_set_resume_dtim(struct wlan_objmgr_psoc *psoc)
 	uint8_t vdev_id;
 	struct wlan_objmgr_vdev *vdev;
 	struct pmo_vdev_priv_obj *vdev_ctx;
-	bool alt_mdtim_enabled;
+	struct pmo_psoc_priv_obj *psoc_ctx;
+	bool li_offload_support = false;
 	QDF_STATUS status;
 
+	pmo_psoc_with_ctx(psoc, psoc_ctx) {
+		li_offload_support = psoc_ctx->caps.li_offload;
+	}
+
+	if (li_offload_support)
+		pmo_debug("listen interval offload support is enabled");
+
 	/* Iterate through VDEV list */
 	for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
 		vdev = pmo_psoc_get_vdev(psoc, vdev_id);
@@ -496,13 +529,9 @@ static void pmo_core_set_resume_dtim(struct wlan_objmgr_psoc *psoc)
 			continue;
 
 		vdev_ctx = pmo_vdev_get_priv(vdev);
-		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
-		alt_mdtim_enabled = vdev_ctx->alt_modulated_dtim_enable;
-		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
-
-		if (!alt_mdtim_enabled)
+		if (!pmo_is_listen_interval_user_set(vdev_ctx)
+		    && !li_offload_support)
 			pmo_core_set_vdev_resume_dtim(psoc, vdev, vdev_ctx);
-
 		pmo_vdev_put_ref(vdev);
 	}
 }
@@ -1270,3 +1299,132 @@ out:
 	pmo_exit();
 }
 
+QDF_STATUS pmo_core_config_listen_interval(struct wlan_objmgr_vdev *vdev,
+					   uint32_t new_li)
+{
+	uint32_t listen_interval;
+	QDF_STATUS status;
+	struct pmo_vdev_priv_obj *vdev_ctx;
+	struct pmo_psoc_priv_obj *psoc_ctx;
+	uint8_t vdev_id;
+
+	pmo_enter();
+
+	status = pmo_vdev_get_ref(vdev);
+	if (QDF_IS_STATUS_ERROR(status))
+		goto out;
+
+	vdev_ctx = pmo_vdev_get_priv(vdev);
+	vdev_id =  pmo_vdev_get_id(vdev);
+
+	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+	if (vdev_ctx->dyn_listen_interval == new_li) {
+		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+		status = QDF_STATUS_SUCCESS;
+		pmo_debug("Listen Interval(%d) already set for vdev id %d",
+			new_li, vdev_id);
+		goto dec_ref;
+	}
+
+	vdev_ctx->dyn_listen_interval = new_li;
+	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+
+	listen_interval = new_li ? new_li : PMO_DEFAULT_LISTEN_INTERVAL;
+
+	if (!new_li) {
+		/* Configure default LI as we do on resume */
+		pmo_psoc_with_ctx(pmo_vdev_get_psoc(vdev), psoc_ctx) {
+			if (psoc_ctx->get_cfg_int &&
+			   (QDF_STATUS_SUCCESS != psoc_ctx->get_cfg_int(
+							PMO_CFG_LISTEN_INTERVAL,
+							&listen_interval))) {
+				pmo_err("Failed to get listen interval");
+			}
+		}
+	}
+
+	pmo_debug("Set Listen Interval %d for vdevId %d", listen_interval,
+			vdev_id);
+	status = pmo_tgt_vdev_update_param_req(vdev,
+					       pmo_vdev_param_listen_interval,
+					       listen_interval);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		/* even it fails continue fwr will take default LI */
+		pmo_err("Failed to Set Listen Interval");
+	}
+
+	/* Set it to Normal DTIM */
+	status = pmo_tgt_vdev_update_param_req(vdev,
+					       pmo_vdev_param_dtim_policy,
+					       pmo_normal_dtim);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		pmo_err("Failed to set Normal DTIM for vdev id %d", vdev_id);
+	} else {
+		pmo_debug("Set DTIM Policy to Normal for vdev id %d", vdev_id);
+		pmo_core_vdev_set_dtim_policy(vdev, pmo_normal_dtim);
+	}
+
+dec_ref:
+	pmo_vdev_put_ref(vdev);
+out:
+	pmo_exit();
+
+	return status;
+}
+
+QDF_STATUS pmo_core_config_modulated_dtim(struct wlan_objmgr_vdev *vdev,
+					  uint32_t mod_dtim)
+{
+	struct pmo_vdev_priv_obj *vdev_ctx;
+	bool prev_dtim_enabled;
+	uint32_t listen_interval;
+	QDF_STATUS status;
+	uint8_t vdev_id;
+
+	pmo_enter();
+
+	status = pmo_vdev_get_ref(vdev);
+	if (status != QDF_STATUS_SUCCESS)
+		goto out;
+
+	vdev_id = pmo_vdev_get_id(vdev);
+	vdev_ctx = pmo_vdev_get_priv(vdev);
+
+	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+	vdev_ctx->dyn_modulated_dtim = mod_dtim;
+	prev_dtim_enabled = vdev_ctx->dyn_modulated_dtim_enabled;
+	vdev_ctx->dyn_modulated_dtim_enabled = mod_dtim != 1;
+	listen_interval = vdev_ctx->dyn_modulated_dtim  *
+		pmo_core_get_vdev_dtim_period(vdev);
+	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+
+	if (prev_dtim_enabled || mod_dtim != 1) {
+		status = pmo_tgt_vdev_update_param_req(vdev,
+					pmo_vdev_param_listen_interval,
+					listen_interval);
+		if (QDF_IS_STATUS_ERROR(status))
+			/* even it fails continue fwr will take default LI */
+			pmo_err("Failed to set Listen Interval for vdev id %d",
+				vdev_id);
+		else
+			pmo_debug("Set Listen Interval %d for  vdev id %d",
+				  listen_interval, vdev_id);
+
+		status = pmo_tgt_vdev_update_param_req(vdev,
+				pmo_vdev_param_dtim_policy,
+				pmo_normal_dtim);
+		if (QDF_IS_STATUS_ERROR(status)) {
+			pmo_err("Failed to set Normal DTIM for vdev id %d",
+				vdev_id);
+		} else {
+			pmo_debug("Set DTIM Policy to Normal for vdev id %d",
+				  vdev_id);
+			pmo_core_vdev_set_dtim_policy(vdev, pmo_normal_dtim);
+		}
+	}
+
+	pmo_vdev_put_ref(vdev);
+out:
+	pmo_exit();
+	return status;
+}

+ 2 - 0
components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h

@@ -322,12 +322,14 @@ struct pmo_psoc_cfg {
  * @unified_wow: Firmware supports "interface pause" flag in WoW command.
  *	This allows both D0-WoW (bus up) and Non-D0-WoW (bus down) to use one
  *	unified command
+ * @li_offload: Firmware has listen interval offload support
  */
 struct pmo_device_caps {
 	bool apf;
 	bool arp_ns_offload;
 	bool packet_filter;
 	bool unified_wow;
+	bool li_offload;
 };
 
 #endif /* end  of _WLAN_PMO_COMMONP_STRUCT_H_ */

+ 38 - 17
components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h

@@ -425,16 +425,6 @@ QDF_STATUS pmo_ucfg_lphb_config_req(struct wlan_objmgr_psoc *psoc,
 		struct pmo_lphb_req *lphb_req, void *lphb_cb_ctx,
 		pmo_lphb_callback callback);
 
-/**
- * pmo_ucfg_update_alt_modulated_dtim_enable() - update alt modulatate dtim
- * @vdev: objmgr vdev handle
- * @value: true for alt_modulated_dtim enable else false
- *
- * Return: QDF status
- */
-void pmo_ucfg_update_alt_modulated_dtim_enable(struct wlan_objmgr_vdev *vdev,
-	bool value);
-
 /**
  * pmo_ucfg_psoc_update_power_save_mode() - update power save mode
  * @vdev: objmgr vdev handle
@@ -619,6 +609,30 @@ void pmo_ucfg_psoc_target_suspend_acknowledge(void *context, bool wow_nack);
  * Return: None
  */
 void pmo_ucfg_psoc_wakeup_host_event_received(struct wlan_objmgr_psoc *psoc);
+
+/**
+ * pmo_ucfg_config_listen_interval() - function to configure listen interval
+ * @vdev: objmgr vdev
+ * @listen_interval: new listen interval passed by user
+ *
+ * This function allows user to configure listen interval dynamically
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS pmo_ucfg_config_listen_interval(struct wlan_objmgr_vdev *vdev,
+					     uint32_t listen_interval);
+
+/**
+ * pmo_ucfg_config_modulated_dtim() - function to configure modulated dtim
+ * @vdev: objmgr vdev handle
+ * @param_value: New modulated dtim value passed by user
+ *
+ * This function configures the modulated dtim in firmware
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS pmo_ucfg_config_modulated_dtim(struct wlan_objmgr_vdev *vdev,
+				       uint32_t mod_dtim);
 #else
 static inline uint32_t
 ucfg_pmo_get_apf_instruction_size(struct wlan_objmgr_psoc *psoc)
@@ -866,13 +880,6 @@ pmo_ucfg_lphb_config_req(
 	return QDF_STATUS_SUCCESS;
 }
 
-static inline void
-pmo_ucfg_update_alt_modulated_dtim_enable(
-		struct wlan_objmgr_vdev *vdev,
-		bool value)
-{
-}
-
 static inline void
 pmo_ucfg_psoc_update_power_save_mode(
 		struct wlan_objmgr_psoc *psoc,
@@ -1046,6 +1053,20 @@ pmo_ucfg_enhanced_mc_filter_disable(struct wlan_objmgr_vdev *vdev)
 {
 	return QDF_STATUS_SUCCESS;
 }
+
+static inline QDF_STATUS
+pmo_ucfg_config_listen_interval(struct wlan_objmgr_vdev *vdev,
+				uint32_t listen_interval)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+pmo_ucfg_config_modulated_dtim(struct wlan_objmgr_vdev *vdev,
+			       uint32_t mod_dtim)
+{
+	return QDF_STATUS_SUCCESS;
+}
 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
 
 #endif /* end  of _WLAN_PMO_UCFG_API_H_ */

+ 11 - 6
components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c

@@ -255,12 +255,6 @@ QDF_STATUS pmo_ucfg_lphb_config_req(struct wlan_objmgr_psoc *psoc,
 	return pmo_core_lphb_config_req(psoc, lphb_req, lphb_cb_ctx, callback);
 }
 
-void pmo_ucfg_update_alt_modulated_dtim_enable(struct wlan_objmgr_vdev *vdev,
-	bool value)
-{
-	pmo_core_update_alt_modulated_dtim_enable(vdev, value);
-}
-
 void pmo_ucfg_psoc_update_power_save_mode(struct wlan_objmgr_psoc *psoc,
 	uint8_t value)
 {
@@ -389,4 +383,15 @@ QDF_STATUS pmo_ucfg_disable_hw_filter_in_fwr(struct wlan_objmgr_vdev *vdev)
 	return pmo_core_disable_hw_filter_in_fwr(vdev);
 }
 
+QDF_STATUS pmo_ucfg_config_listen_interval(struct wlan_objmgr_vdev *vdev,
+					     uint32_t listen_interval)
+{
+	return pmo_core_config_listen_interval(vdev, listen_interval);
+}
+
+QDF_STATUS pmo_ucfg_config_modulated_dtim(struct wlan_objmgr_vdev *vdev,
+				       uint32_t mod_dtim)
+{
+	return pmo_core_config_modulated_dtim(vdev, mod_dtim);
+}
 

+ 4 - 8
core/hdd/src/wlan_hdd_cfg80211.c

@@ -6707,10 +6707,8 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
 		modulated_dtim = nla_get_u32(
 			tb[QCA_WLAN_VENDOR_ATTR_CONFIG_MODULATED_DTIM]);
 
-		status = sme_configure_modulated_dtim(hdd_ctx->hHal,
-						      adapter->session_id,
-						      modulated_dtim);
-
+		status = pmo_ucfg_config_modulated_dtim(adapter->hdd_vdev,
+							modulated_dtim);
 		if (QDF_STATUS_SUCCESS != status)
 			ret_val = -EPERM;
 	}
@@ -6719,10 +6717,8 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
 		override_li = nla_get_u32(
 			tb[QCA_WLAN_VENDOR_ATTR_CONFIG_LISTEN_INTERVAL]);
 
-		status = sme_override_listen_interval(hdd_ctx->hHal,
-						      adapter->session_id,
-						      override_li);
-
+		status = pmo_ucfg_config_listen_interval(adapter->hdd_vdev,
+							 override_li);
 		if (status != QDF_STATUS_SUCCESS)
 			ret_val = -EPERM;
 	}

+ 0 - 6
core/sme/inc/sme_api.h

@@ -1033,12 +1033,6 @@ QDF_STATUS sme_set_miracast(tHalHandle hal, uint8_t filter_type);
 QDF_STATUS sme_ext_change_channel(tHalHandle hHal, uint32_t channel,
 					  uint8_t session_id);
 
-QDF_STATUS sme_configure_modulated_dtim(tHalHandle hal, uint8_t session_id,
-				      uint32_t modulated_dtim);
-
-QDF_STATUS sme_override_listen_interval(tHalHandle h_hal, uint8_t session_id,
-		uint32_t override_li);
-
 QDF_STATUS sme_configure_stats_avg_factor(tHalHandle hal, uint8_t session_id,
 					  uint16_t stats_avg_factor);
 

+ 0 - 114
core/sme/src/common/sme_api.c

@@ -12530,120 +12530,6 @@ QDF_STATUS sme_configure_guard_time(tHalHandle hal, uint8_t session_id,
 	return status;
 }
 
-/**
- * sme_configure_modulated_dtim() - function to configure modulated dtim
- * @h_hal: SME API to enable/disable modulated DTIM instantaneously
- * @session_id: session ID
- * @modulated_dtim: modulated dtim value
- *
- * This function configures the modulated dtim in firmware
- *
- * Return: QDF_STATUS
- */
-QDF_STATUS sme_configure_modulated_dtim(tHalHandle h_hal, uint8_t session_id,
-					uint32_t modulated_dtim)
-{
-	struct scheduler_msg msg = {0};
-	QDF_STATUS status = QDF_STATUS_SUCCESS;
-	tpAniSirGlobal mac  = PMAC_STRUCT(h_hal);
-	wma_cli_set_cmd_t *iwcmd;
-
-	iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
-	if (NULL == iwcmd) {
-		QDF_TRACE(QDF_MODULE_ID_SME,
-			  QDF_TRACE_LEVEL_FATAL,
-			  "%s: qdf_mem_malloc failed", __func__);
-		return QDF_STATUS_E_NOMEM;
-	}
-
-	status = sme_acquire_global_lock(&mac->sme);
-
-	if (QDF_STATUS_SUCCESS == status) {
-
-		iwcmd->param_value = modulated_dtim;
-		iwcmd->param_vdev_id = session_id;
-		iwcmd->param_id = GEN_PARAM_MODULATED_DTIM;
-		iwcmd->param_vp_dev = GEN_CMD;
-		msg.type = WMA_CLI_SET_CMD;
-		msg.reserved = 0;
-		msg.bodyptr = (void *)iwcmd;
-
-		if (!QDF_IS_STATUS_SUCCESS(
-			    scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
-			QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
-				  "%s: Not able to post GEN_PARAM_DYNAMIC_DTIM to WMA!",
-				  __func__);
-			qdf_mem_free(iwcmd);
-			status = QDF_STATUS_E_FAILURE;
-		}
-		sme_release_global_lock(&mac->sme);
-	} else {
-		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
-			  "%s: sme_acquire_global_lock error!",
-			  __func__);
-		qdf_mem_free(iwcmd);
-	}
-
-	return status;
-}
-
-/**
- * sme_override_listen_interval() - function to override static LI
- * @h_hal: SME API to override listen interval
- * @session_id: session ID
- * @override_li: new LI value passed by user
- *
- * This function override (enable/disable) static a.k.a ini based LI
- *
- * Return: QDF_STATUS
- */
-QDF_STATUS sme_override_listen_interval(tHalHandle h_hal, uint8_t session_id,
-					uint32_t override_li)
-{
-	struct scheduler_msg msg = {0};
-	QDF_STATUS status = QDF_STATUS_SUCCESS;
-	tpAniSirGlobal mac  = PMAC_STRUCT(h_hal);
-	wma_cli_set_cmd_t *iwcmd;
-
-	iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
-	if (!iwcmd) {
-		QDF_TRACE(QDF_MODULE_ID_SME,
-			  QDF_TRACE_LEVEL_FATAL,
-			  "%s: qdf_mem_malloc failed", __func__);
-		return QDF_STATUS_E_NOMEM;
-	}
-
-	status = sme_acquire_global_lock(&mac->sme);
-
-	if (status == QDF_STATUS_SUCCESS) {
-
-		iwcmd->param_value = override_li;
-		iwcmd->param_vdev_id = session_id;
-		iwcmd->param_id = GEN_PARAM_LISTEN_INTERVAL;
-		iwcmd->param_vp_dev = GEN_CMD;
-		msg.type = WMA_CLI_SET_CMD;
-		msg.reserved = 0;
-		msg.bodyptr = (void *)iwcmd;
-
-		if (!QDF_IS_STATUS_SUCCESS(
-			    scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
-			QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
-				  "%s: Can't post GEN_PARAM_LISTEN_INTERVAL",
-				  __func__);
-			qdf_mem_free(iwcmd);
-			status = QDF_STATUS_E_FAILURE;
-		}
-		sme_release_global_lock(&mac->sme);
-	} else {
-		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
-			  "%s: sme_acquire_global_lock error!",
-			  __func__);
-		qdf_mem_free(iwcmd);
-	}
-
-	return status;
-}
-
 /*
  * sme_wifi_start_logger() - Send the start/stop logging command to WMA
  * to either start/stop logging

+ 0 - 4
core/wma/inc/wma.h

@@ -1020,7 +1020,6 @@ struct roam_synch_frame_ind {
  * @plink_status_req: link status request
  * @psnr_req: snr request
  * @delay_before_vdev_stop: delay
- * @override_li: dynamically user configured listen interval
  * @tx_streams: number of tx streams can be used by the vdev
  * @rx_streams: number of rx streams can be used by the vdev
  * @chain_mask: chain mask can be used by the vdev
@@ -1096,9 +1095,6 @@ struct wma_txrx_node {
 #ifdef FEATURE_WLAN_EXTSCAN
 	bool extscan_in_progress;
 #endif
-	uint32_t alt_modulated_dtim;
-	bool alt_modulated_dtim_enabled;
-	uint32_t override_li;
 	uint32_t tx_streams;
 	uint32_t rx_streams;
 	uint32_t chain_mask;

+ 0 - 4
core/wma/inc/wma_internal.h

@@ -698,10 +698,6 @@ QDF_STATUS wma_notify_modem_power_state(void *wma_ptr,
 QDF_STATUS wma_set_smps_params(tp_wma_handle wma, uint8_t vdev_id,
 				      int value);
 
-void wma_set_suspend_dtim(tp_wma_handle wma);
-
-void wma_set_resume_dtim(tp_wma_handle wma);
-
 /*
  * wma_data.c functions declarations
  */

+ 3 - 123
core/wma/src/wma_main.c

@@ -946,123 +946,6 @@ static void wma_set_dtim_period(tp_wma_handle wma,
 	iface->dtimPeriod = dtim_params->dtim_period;
 
 }
-/**
- * wma_set_modulated_dtim() - function to configure modulated dtim
- * @wma: wma handle
- * @privcmd: structure containing parameters
- *
- * This function configures the modulated dtim in firmware
- *
- * Return: none
- */
-static void wma_set_modulated_dtim(tp_wma_handle wma,
-				   wma_cli_set_cmd_t *privcmd)
-{
-	uint8_t vdev_id = privcmd->param_vdev_id;
-	struct wma_txrx_node *iface =
-		&wma->interfaces[vdev_id];
-	bool prev_dtim_enabled;
-	uint32_t listen_interval;
-	QDF_STATUS ret;
-
-	iface->alt_modulated_dtim = privcmd->param_value;
-
-	prev_dtim_enabled = iface->alt_modulated_dtim_enabled;
-
-	if (1 != privcmd->param_value)
-		iface->alt_modulated_dtim_enabled = true;
-	else
-		iface->alt_modulated_dtim_enabled = false;
-
-	if ((true == iface->alt_modulated_dtim_enabled) ||
-	    (true == prev_dtim_enabled)) {
-
-		listen_interval = iface->alt_modulated_dtim
-			* iface->dtimPeriod;
-
-		ret = wma_vdev_set_param(wma->wmi_handle,
-						privcmd->param_vdev_id,
-						WMI_VDEV_PARAM_LISTEN_INTERVAL,
-						listen_interval);
-		if (QDF_IS_STATUS_ERROR(ret))
-			/* Even if it fails, continue */
-			WMA_LOGW("Failed to set listen interval %d",
-				 listen_interval);
-
-		ret = wma_vdev_set_param(wma->wmi_handle,
-						privcmd->param_vdev_id,
-						WMI_VDEV_PARAM_DTIM_POLICY,
-						NORMAL_DTIM);
-		if (QDF_IS_STATUS_ERROR(ret))
-			WMA_LOGE("Failed to Set to Normal DTIM policy");
-	}
-}
-
-/**
- * wma_override_listen_interval() - function to override static/ini based LI
- * @wma: wma handle
- * @privcmd: structure containing parameters
- *
- * This function override static/ini based LI in firmware
- *
- * Return: none
- */
-static void wma_override_listen_interval(tp_wma_handle wma,
-				   wma_cli_set_cmd_t *privcmd)
-{
-	uint8_t vdev_id = privcmd->param_vdev_id;
-	struct wma_txrx_node *iface =
-		&wma->interfaces[vdev_id];
-	u32 old_override_li, new_override_li, listen_interval;
-	struct sAniSirGlobal *mac;
-	QDF_STATUS ret;
-
-	mac = cds_get_context(QDF_MODULE_ID_PE);
-	if (!mac) {
-		WMA_LOGE(FL("Failed to get mac context"));
-		return;
-	}
-
-	old_override_li = iface->override_li;
-	new_override_li = privcmd->param_value;
-	iface->override_li = new_override_li;
-
-	if (new_override_li &&
-	    (new_override_li != old_override_li)) {
-		listen_interval = new_override_li;
-	} else if (!new_override_li &&
-		   (new_override_li != old_override_li)) {
-		/* Configure default LI as we do on resume */
-		ret = wlan_cfg_get_int(mac, WNI_CFG_LISTEN_INTERVAL,
-				       &listen_interval);
-		if (ret != QDF_STATUS_SUCCESS) {
-			QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
-				  "Failed to get value for listen interval");
-			listen_interval = POWERSAVE_DEFAULT_LISTEN_INTERVAL;
-		}
-	} else {
-		return;
-	}
-
-	ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
-			WMI_VDEV_PARAM_LISTEN_INTERVAL,
-			listen_interval);
-	if (QDF_IS_STATUS_ERROR(ret)) {
-		/* Even it fails continue Fw will take default LI */
-		WMA_LOGE("Failed to Set Listen Interval vdevId %d",
-			 vdev_id);
-	}
-	WMA_LOGD("%s: Set Listen Interval vdevId %d Listen Intv %d",
-			__func__, vdev_id, listen_interval);
-	ret = wma_vdev_set_param(wma->wmi_handle,
-			privcmd->param_vdev_id,
-			WMI_VDEV_PARAM_DTIM_POLICY,
-			NORMAL_DTIM);
-	if (QDF_IS_STATUS_ERROR(ret))
-		WMA_LOGE("Failed to Set to Normal DTIM policy");
-
-}
-
 
 /**
  * wma_process_cli_set_cmd() - set parameters to fw
@@ -1214,12 +1097,6 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
 		case GEN_PARAM_RESET_TSF_GPIO:
 			ret = wma_reset_tsf_gpio(wma, privcmd->param_value);
 			break;
-		case GEN_PARAM_MODULATED_DTIM:
-			wma_set_modulated_dtim(wma, privcmd);
-			break;
-		case GEN_PARAM_LISTEN_INTERVAL:
-			wma_override_listen_interval(wma, privcmd);
-			break;
 		default:
 			WMA_LOGE("Invalid param id 0x%x",
 				 privcmd->param_id);
@@ -5654,6 +5531,9 @@ static void wma_set_pmo_caps(struct wlan_objmgr_psoc *psoc)
 		wma_is_service_enabled(wmi_service_packet_filter_offload);
 	caps.unified_wow =
 		wma_is_service_enabled(wmi_service_unified_wow_capability);
+	caps.li_offload =
+		wma_is_service_enabled(
+				wmi_service_listen_interval_offload_support);
 
 	status = ucfg_pmo_psoc_set_caps(psoc, &caps);
 	if (QDF_IS_STATUS_ERROR(status))

+ 0 - 319
core/wma/src/wma_power.c

@@ -1690,325 +1690,6 @@ QDF_STATUS wma_set_smps_params(tp_wma_handle wma, uint8_t vdev_id,
 	return ret;
 }
 
-/**
- * wma_configure_vdev_suspend_params() - set suspend related parameters in fw
- * @wma: wma handle
- * @vdev_id: vdev id
- *
- * Return: none
- */
-static void wma_configure_vdev_suspend_params(tp_wma_handle wma,
-		uint8_t vdev_id)
-{
-	uint32_t cfg_data_val = 0;
-	struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
-	struct sAniSirGlobal *mac;
-	QDF_STATUS ret;
-	uint8_t  ito_repeat_count_value = 0;
-	uint32_t inactivity_time;
-
-	if (iface->type != WMI_VDEV_TYPE_STA)
-		return;
-
-	mac = cds_get_context(QDF_MODULE_ID_PE);
-	if (!mac) {
-		WMA_LOGE(FL("Failed to get mac context"));
-		return;
-	}
-
-	if (wlan_cfg_get_int(mac,
-			     WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT,
-			     &cfg_data_val) != QDF_STATUS_SUCCESS) {
-		QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
-			"Can't get WNI_CFG_PS_WOW_DATA_INACTIVITY_TO");
-		cfg_data_val = WOW_POWERSAVE_DEFAULT_INACTIVITY_TIME;
-	}
-
-	WMA_LOGD("%s: Set inactivity_time for wow: %d", __func__,
-			cfg_data_val);
-	ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
-			WMI_STA_PS_PARAM_INACTIVITY_TIME, cfg_data_val);
-	if (ret)
-		WMA_LOGE("%s: Setting InActivity time Failed.",
-			__func__);
-
-	if (wlan_cfg_get_int(mac, WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT,
-		&inactivity_time) != QDF_STATUS_SUCCESS) {
-		QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
-		"Failed to get WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT");
-		inactivity_time = POWERSAVE_DEFAULT_INACTIVITY_TIME;
-	}
-
-	/*
-	 * To keep ito repeat count same in wow mode as in non wow mode,
-	 * modulating ito repeat count value.
-	 */
-	ito_repeat_count_value = (inactivity_time / cfg_data_val) *
-							wma->ito_repeat_count;
-
-	if (ito_repeat_count_value) {
-		ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
-			WMI_STA_PS_PARAM_MAX_RESET_ITO_COUNT_ON_TIM_NO_TXRX,
-			ito_repeat_count_value);
-		WMA_LOGD("%s: Setting ito_repeat_count_value %d.", __func__,
-				ito_repeat_count_value);
-
-		if (ret)
-			WMA_LOGE("%s: Setting ITO count failed.", __func__);
-	}
-
-}
-
-/**
- * wma_set_vdev_suspend_dtim() - set suspend dtim parameters in fw
- * @wma: wma handle
- * @vdev_id: vdev id
- *
- * Return: none
- */
-static void wma_set_vdev_suspend_dtim(tp_wma_handle wma, uint8_t vdev_id)
-{
-	struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
-	uint32_t cfg_data_val = 0;
-
-	if ((iface->type == WMI_VDEV_TYPE_STA) &&
-	    (iface->dtimPeriod != 0)) {
-		QDF_STATUS ret;
-		uint32_t listen_interval;
-		uint32_t max_mod_dtim;
-		uint32_t beacon_interval_mod;
-
-		/* get mac to access CFG data base */
-		struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
-
-		if (!mac) {
-			WMA_LOGE(FL("Failed to get mac context"));
-			return;
-		}
-
-		if (wma->staDynamicDtim) {
-			listen_interval = wma->staDynamicDtim;
-		} else if ((wma->staModDtim) &&
-			   (wma->staMaxLIModDtim)) {
-			/*
-			 * When the system is in suspend
-			 * (maximum beacon will be at 1s == 10)
-			 * If maxModulatedDTIM ((MAX_LI_VAL = 10) / AP_DTIM)
-			 * equal or larger than MDTIM
-			 * (configured in WCNSS_qcom_cfg.ini)
-			 * Set LI to MDTIM * AP_DTIM
-			 * If Dtim = 2 and Mdtim = 2 then LI is 4
-			 * Else
-			 * Set LI to maxModulatedDTIM * AP_DTIM
-			 */
-
-			beacon_interval_mod = iface->beaconInterval / 100;
-			if (beacon_interval_mod == 0)
-				beacon_interval_mod = 1;
-
-			max_mod_dtim = wma->staMaxLIModDtim
-				/ (iface->dtimPeriod*beacon_interval_mod);
-
-			if (max_mod_dtim <= 0)
-				max_mod_dtim = 1;
-
-			if (max_mod_dtim >= wma->staModDtim) {
-				listen_interval =
-					(wma->staModDtim * iface->dtimPeriod);
-			} else {
-				listen_interval =
-					(max_mod_dtim * iface->dtimPeriod);
-			}
-		} else {
-			/* Set Listen Interval */
-			if ((wlan_cfg_get_int(mac, WNI_CFG_LISTEN_INTERVAL,
-				&cfg_data_val) != QDF_STATUS_SUCCESS)) {
-				QDF_TRACE(QDF_MODULE_ID_WMA,
-					  QDF_TRACE_LEVEL_ERROR,
-					"Failed to listen interval");
-				cfg_data_val =
-					POWERSAVE_DEFAULT_LISTEN_INTERVAL;
-			}
-			listen_interval = cfg_data_val;
-		}
-		ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
-					      WMI_VDEV_PARAM_LISTEN_INTERVAL,
-					      listen_interval);
-		if (QDF_IS_STATUS_ERROR(ret)) {
-			/* Even it fails continue Fw will take default LI */
-			WMA_LOGE("Failed to Set Listen Interval vdevId %d",
-				 vdev_id);
-		}
-
-		WMA_LOGD("%s: Set Listen Interval vdevId %d Listen Intv %d",
-			 __func__, vdev_id, listen_interval);
-
-		iface->restore_dtim_setting = true;
-	}
-}
-
-/*
- * wma_is_user_set_li_params() - Check LI related params are set by user or not
- * @iface: wma vdev handle
- *
- * Return: 1 if true else 0
- */
-static inline uint8_t wma_is_user_set_li_params(struct wma_txrx_node *iface)
-{
-	return iface->alt_modulated_dtim_enabled || iface->override_li ? 1 : 0;
-}
-
-/**
- * wma_set_suspend_dtim() - set suspend dtim
- * @wma: wma handle
- *
- * Return: none
- */
-void wma_set_suspend_dtim(tp_wma_handle wma)
-{
-	uint8_t i;
-	bool li_offload_support = false;
-
-	if (NULL == wma) {
-		WMA_LOGE("%s: wma is NULL", __func__);
-		return;
-	}
-	if (WMI_SERVICE_EXT_IS_ENABLED(wma->wmi_service_bitmap,
-			wma->wmi_service_ext_bitmap,
-			WMI_SERVICE_LISTEN_INTERVAL_OFFLOAD_SUPPORT)) {
-		WMA_LOGD("%s: listen interval support is enabled", __func__);
-		li_offload_support = true;
-	}
-
-	for (i = 0; i < wma->max_bssid; i++) {
-		if (wma->interfaces[i].handle) {
-			if (!wma_is_user_set_li_params(&wma->interfaces[i]) &&
-					!li_offload_support)
-				wma_set_vdev_suspend_dtim(wma, i);
-			wma_configure_vdev_suspend_params(wma, i);
-		}
-	}
-}
-
-/**
- * wma_configure_vdev_resume_params() - set resume related parameters in fw
- * @wma: wma handle
- * @vdev_id: vdev id
- *
- * Return: none
- */
-static void wma_configure_vdev_resume_params(tp_wma_handle wma, uint8_t vdev_id)
-{
-	struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
-	u_int32_t cfg_data_val;
-	struct sAniSirGlobal *mac;
-	QDF_STATUS ret;
-
-	if (iface->type != WMI_VDEV_TYPE_STA)
-		return;
-
-	mac = cds_get_context(QDF_MODULE_ID_PE);
-	if (!mac) {
-		WMA_LOGE(FL("Failed to get mac context"));
-		return;
-	}
-
-	if (wlan_cfg_get_int(mac, WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT,
-				&cfg_data_val) != QDF_STATUS_SUCCESS) {
-		QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
-			"Failed to get WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT");
-		cfg_data_val = POWERSAVE_DEFAULT_INACTIVITY_TIME;
-	}
-
-	WMA_LOGD("%s: Setting InActivity time %d.", __func__, cfg_data_val);
-	ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
-				WMI_STA_PS_PARAM_INACTIVITY_TIME,
-				cfg_data_val);
-	if (ret)
-		WMA_LOGE("%s: Setting InActivity time Failed.",
-			__func__);
-
-}
-
-/**
- * wma_set_vdev_resume_dtim() - set resume dtim parameters in fw
- * @wma: wma handle
- * @vdev_id: vdev id
- *
- * Return: none
- */
-static void wma_set_vdev_resume_dtim(tp_wma_handle wma, uint8_t vdev_id)
-{
-	struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
-
-	if ((iface->type == WMI_VDEV_TYPE_STA) &&
-	    (iface->restore_dtim_setting)) {
-		QDF_STATUS ret;
-		uint32_t cfg_data_val = 0;
-		/* get mac to access CFG data base */
-		struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
-
-		if (!mac) {
-			WMA_LOGE(FL("Failed to get mac context"));
-			return;
-		}
-		/* Set Listen Interval */
-		if ((wlan_cfg_get_int(mac, WNI_CFG_LISTEN_INTERVAL,
-				      &cfg_data_val) != QDF_STATUS_SUCCESS)) {
-			QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
-				  "Failed to get value for listen interval");
-			cfg_data_val = POWERSAVE_DEFAULT_LISTEN_INTERVAL;
-		}
-
-		ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
-					      WMI_VDEV_PARAM_LISTEN_INTERVAL,
-					      cfg_data_val);
-		if (QDF_IS_STATUS_ERROR(ret)) {
-			/* Even it fails continue Fw will take default LI */
-			WMA_LOGE("Failed to Set Listen Interval vdevId %d",
-				 vdev_id);
-		}
-
-		WMA_LOGD("%s: Set Listen Interval vdevId %d Listen Intv %d",
-			 __func__, vdev_id, cfg_data_val);
-
-		iface->restore_dtim_setting = false;
-
-	}
-}
-
-/**
- * wma_set_resume_dtim() - set resume dtim
- * @wma: wma handle
- *
- * Return: none
- */
-void wma_set_resume_dtim(tp_wma_handle wma)
-{
-	uint8_t i;
-	bool li_offload_support = false;
-
-	if (NULL == wma) {
-		WMA_LOGE("%s: wma is NULL", __func__);
-		return;
-	}
-	if (WMI_SERVICE_EXT_IS_ENABLED(wma->wmi_service_bitmap,
-			wma->wmi_service_ext_bitmap,
-			WMI_SERVICE_LISTEN_INTERVAL_OFFLOAD_SUPPORT)) {
-		WMA_LOGD("%s: listen interval support is enabled", __func__);
-		li_offload_support = true;
-	}
-
-	for (i = 0; i < wma->max_bssid; i++) {
-		if (wma->interfaces[i].handle) {
-			if (!wma_is_user_set_li_params(&wma->interfaces[i]) &&
-					!li_offload_support)
-				wma_set_vdev_resume_dtim(wma, i);
-			wma_configure_vdev_resume_params(wma, i);
-		}
-	}
-}
-
 /**
  * wma_set_tx_power_scale() - set tx power scale
  * @vdev_id: vdev id