Explorar el Código

qcacld-3.0: Set user configured listen interval before going to sleep

Before the host triggers sleep mode, it configures listen
interval while setting power save parameters to firmware.
If user configured listen interval is present in host,
that configured listen interval is set while setting
power save params.

Change-Id: I158a547f95bca4750b5180840113c03a89ced17c
CRs-Fixed: 3528793
Shailendra Singh hace 1 año
padre
commit
16eaca8093

+ 13 - 0
components/pmo/core/inc/wlan_pmo_main.h

@@ -445,4 +445,17 @@ QDF_STATUS pmo_set_vdev_bridge_addr(struct wlan_objmgr_vdev *vdev,
 
 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
 
+/**
+ * pmo_core_get_listen_interval() - function to get configured
+ * listen interval
+ * @vdev: vdev objmgr vdev
+ * @listen_interval: Pointer variable to return listen interval
+ *
+ * This function allows get configured listen interval
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS pmo_core_get_listen_interval(struct wlan_objmgr_vdev *vdev,
+					uint32_t *listen_interval);
+
 #endif /* end  of _WLAN_PMO_MAIN_H_ */

+ 18 - 0
components/pmo/core/src/wlan_pmo_main.c

@@ -574,3 +574,21 @@ QDF_STATUS pmo_set_vdev_bridge_addr(struct wlan_objmgr_vdev *vdev,
 
 	return QDF_STATUS_SUCCESS;
 }
+
+QDF_STATUS pmo_core_get_listen_interval(struct wlan_objmgr_vdev *vdev,
+					uint32_t *listen_interval)
+{
+	struct pmo_vdev_priv_obj *vdev_ctx;
+
+	if (!vdev || !listen_interval) {
+		pmo_err("vdev NULL or NULL ptr");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	vdev_ctx = pmo_vdev_get_priv(vdev);
+	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+	*listen_interval = vdev_ctx->dyn_listen_interval;
+	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+
+	return QDF_STATUS_SUCCESS;
+}

+ 9 - 0
components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h

@@ -322,6 +322,9 @@ uint32_t
 wlan_pmo_get_interval_for_pagefault_wakeup_counts(
 						struct wlan_objmgr_psoc *psoc);
 
+QDF_STATUS wlan_pmo_get_listen_interval(struct wlan_objmgr_vdev *vdev,
+					uint32_t *listen_interval);
+
 #else /* WLAN_POWER_MANAGEMENT_OFFLOAD */
 
 static inline QDF_STATUS pmo_init(void)
@@ -503,6 +506,12 @@ wlan_pmo_get_interval_for_pagefault_wakeup_counts(struct wlan_objmgr_psoc *psoc)
 	return 0;
 }
 
+static QDF_STATUS wlan_pmo_get_listen_interval(struct wlan_objmgr_vdev *vdev,
+					       uint32_t *listen_interval)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
 
 #endif /* end  of _WLAN_PMO_OBJ_MGMT_API_H_ */

+ 6 - 0
components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c

@@ -900,3 +900,9 @@ wlan_pmo_get_interval_for_pagefault_wakeup_counts(struct wlan_objmgr_psoc *psoc)
 {
 	return pmo_get_interval_for_pagefault_wakeup_counts(psoc);
 }
+
+QDF_STATUS wlan_pmo_get_listen_interval(struct wlan_objmgr_vdev *vdev,
+					uint32_t *listen_interval)
+{
+	return pmo_core_get_listen_interval(vdev, listen_interval);
+}

+ 1 - 13
components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c

@@ -568,19 +568,7 @@ QDF_STATUS ucfg_pmo_config_listen_interval(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS ucfg_pmo_get_listen_interval(struct wlan_objmgr_vdev *vdev,
 					uint32_t *listen_interval)
 {
-	struct pmo_vdev_priv_obj *vdev_ctx;
-
-	if (!vdev)
-		return QDF_STATUS_E_INVAL;
-
-	vdev_ctx = pmo_vdev_get_priv(vdev);
-	if (!vdev_ctx)
-		return QDF_STATUS_E_INVAL;
-
-	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
-	*listen_interval = vdev_ctx->dyn_listen_interval;
-	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
-	return QDF_STATUS_SUCCESS;
+	return pmo_core_get_listen_interval(vdev, listen_interval);
 }
 
 QDF_STATUS ucfg_pmo_config_modulated_dtim(struct wlan_objmgr_vdev *vdev,

+ 19 - 6
core/wma/src/wma_power.c

@@ -470,7 +470,6 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
 				bool enable_ps)
 {
 	QDF_STATUS ret;
-	uint32_t cfg_data_val = 0;
 	/* get mac to access CFG data base */
 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
 	uint32_t rx_wake_policy;
@@ -478,6 +477,8 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
 	uint32_t pspoll_count;
 	uint32_t inactivity_time;
 	uint32_t psmode;
+	struct wlan_objmgr_vdev *vdev;
+	u32 listen_interval = 0;
 
 	wma_debug("Set Force Sleep vdevId %d val %d", vdev_id, enable);
 
@@ -595,16 +596,28 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
 	}
 
 	/* Set Listen Interval */
-	cfg_data_val = mac->mlme_cfg->sap_cfg.listen_interval;
-	ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
-					      wmi_vdev_param_listen_interval,
-					      cfg_data_val);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc, vdev_id,
+						    WLAN_LEGACY_WMA_ID);
+	/* If user has configured listen interval already
+	 * No need to send vdev set param cmd
+	 */
+	if (vdev) {
+		ret = wlan_pmo_get_listen_interval(vdev, &listen_interval);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
+	}
+
+	if (!listen_interval || QDF_IS_STATUS_ERROR(ret)) {
+		listen_interval = mac->mlme_cfg->sap_cfg.listen_interval;
+		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_err("Failed to Set Listen Interval vdevId %d", vdev_id);
 	}
 	wma_debug("Set Listen Interval vdevId %d Listen Intv %d",
-		 vdev_id, cfg_data_val);
+		 vdev_id, listen_interval);
 
 	return QDF_STATUS_SUCCESS;
 }