Explorar el Código

qcacld-3.0: Add support for getting dtim and beacon interval

Add support for getting vdev dtim and beacon interval from
mlme in PMO.

Change-Id: I97c117eec290f6b9452b98629bf6b3ee10c38ce6
CRs-Fixed: 2252713
Nachiket Kukade hace 6 años
padre
commit
37b4e6dfbe

+ 4 - 0
components/pmo/core/inc/wlan_pmo_priv.h

@@ -47,6 +47,8 @@
  * @pause_bitmap_notifier: registered callback to update pause bitmap value
  * @pmo_get_pause_bitmap: registered callback to get pause bitmap value
  * @get_cfg_int: register callback to get integer from cfg
+ * @get_dtim_period: register callback to get dtim period from mlme
+ * @get_beacon_interval: register callback to get beacon interval from mlme
  * @lock: spin lock for pmo psoc
  */
 struct pmo_psoc_priv_obj {
@@ -62,6 +64,8 @@ struct pmo_psoc_priv_obj {
 	pmo_get_pause_bitmap get_pause_bitmap;
 	pmo_is_device_in_low_pwr_mode is_device_in_low_pwr_mode;
 	pmo_get_cfg_int get_cfg_int;
+	pmo_get_dtim_period get_dtim_period;
+	pmo_get_beacon_interval get_beacon_interval;
 	qdf_spinlock_t lock;
 };
 

+ 0 - 44
components/pmo/core/inc/wlan_pmo_suspend_resume.h

@@ -140,50 +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_get_vdev_dtim_period() - Get vdev dtim period
- * @vdev: objmgr vdev handle
- *
- * Return: Vdev dtim period
- */
-static inline
-uint8_t pmo_core_get_vdev_dtim_period(struct wlan_objmgr_vdev *vdev)
-{
-	uint8_t dtim_period = 0;
-
-	if (!vdev) {
-		pmo_err("vdev is null");
-		QDF_ASSERT(0);
-		return 0;
-	}
-	/* TODO */
-	/* dtim_period = wlan_vdev_mlme_get_dtim_period(vdev); */
-
-	return dtim_period;
-}
-
-/**
- * pmo_core_get_vdev_beacon_interval() - Get vdev beacon interval
- * @vdev: objmgr vdev handle
- *
- * Return: Vdev beacon interval
- */
-static inline
-uint16_t pmo_core_get_vdev_beacon_interval(struct wlan_objmgr_vdev *vdev)
-{
-	uint16_t beacon_interval = 0;
-
-	if (!vdev) {
-		pmo_err("vdev is null");
-		QDF_ASSERT(0);
-		return 0;
-	}
-	/* TODO */
-	/* beacon_interval = wlan_vdev_mlme_get_beacon_interval(vdev); */
-
-	return beacon_interval;
-}
-
 /**
  * pmo_core_update_alt_modulated_dtim_enable() - update alt modulatate dtim
  * @vdev: objmgr vdev handle

+ 2 - 0
components/pmo/core/inc/wlan_pmo_wow.h

@@ -109,6 +109,8 @@
 
 #define PMO_WOW_FILTERS_ARP_NS		2
 #define PMO_WOW_FILTERS_PKT_OR_APF	5
+/* Default Listen Interval */
+#define PMO_DEFAULT_LISTEN_INTERVAL 1
 
 /**
  * pmo_get_and_increment_wow_default_ptrn() -Get and increment wow default ptrn

+ 58 - 1
components/pmo/core/src/wlan_pmo_suspend_resume.c

@@ -36,6 +36,63 @@
 #include "cds_api.h"
 #include "wlan_pmo_static_config.h"
 
+/**
+ * pmo_core_get_vdev_dtim_period() - Get vdev dtim period
+ * @vdev: objmgr vdev handle
+ *
+ * Return: Vdev dtim period
+ */
+static uint8_t pmo_core_get_vdev_dtim_period(struct wlan_objmgr_vdev *vdev)
+{
+	uint8_t dtim_period = 0;
+	struct pmo_psoc_priv_obj *psoc_ctx;
+	struct wlan_objmgr_psoc *psoc;
+	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
+
+	psoc = pmo_vdev_get_psoc(vdev);
+
+	pmo_psoc_with_ctx(psoc, psoc_ctx) {
+		if (psoc_ctx->get_dtim_period)
+			ret = psoc_ctx->get_dtim_period(pmo_vdev_get_id(vdev),
+							&dtim_period);
+	}
+
+	if (QDF_IS_STATUS_ERROR(ret))
+		pmo_err("Failed to get to dtim period for vdevId %d",
+				pmo_vdev_get_id(vdev));
+
+	return dtim_period;
+}
+
+/**
+ * pmo_core_get_vdev_beacon_interval() - Get vdev beacon interval
+ * @vdev: objmgr vdev handle
+ *
+ * Return: Vdev beacon interval
+ */
+static uint16_t pmo_core_get_vdev_beacon_interval(struct wlan_objmgr_vdev *vdev)
+{
+	uint16_t beacon_interval = 0;
+	struct pmo_psoc_priv_obj *psoc_ctx;
+	struct wlan_objmgr_psoc *psoc;
+	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
+
+	psoc = pmo_vdev_get_psoc(vdev);
+
+	pmo_psoc_with_ctx(psoc, psoc_ctx) {
+		if (psoc_ctx->get_beacon_interval)
+			ret = psoc_ctx->get_beacon_interval(
+							pmo_vdev_get_id(vdev),
+							&beacon_interval);
+	}
+
+	if (QDF_IS_STATUS_ERROR(ret))
+		pmo_err("Failed to get beacon interval for vdev id %d",
+			pmo_vdev_get_id(vdev));
+
+	return beacon_interval;
+}
+
 /**
  * pmo_core_calculate_listen_interval() - Calculate vdev listen interval
  * @vdev: objmgr vdev handle
@@ -107,7 +164,7 @@ static void pmo_core_set_vdev_suspend_dtim(struct wlan_objmgr_psoc *psoc,
 		struct wlan_objmgr_vdev *vdev,
 		struct pmo_vdev_priv_obj *vdev_ctx)
 {
-	uint32_t listen_interval;
+	uint32_t listen_interval = PMO_DEFAULT_LISTEN_INTERVAL;
 	QDF_STATUS ret;
 	uint8_t vdev_id;
 	enum pmo_power_save_qpower_mode qpower_config;

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

@@ -207,6 +207,48 @@ QDF_STATUS pmo_register_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
  */
 QDF_STATUS pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc);
 
+/**
+ * pmo_register_get_dtim_period_callback(): API to register callback that gets
+ * dtim period from mlme
+ * @psoc: objmgr psoc handle
+ * @handler: pointer to the callback function
+ *
+ * Return: QDF_STATUS_SUCCESS in case of success else error
+ */
+QDF_STATUS pmo_register_get_dtim_period_callback(struct wlan_objmgr_psoc *psoc,
+						 pmo_get_dtim_period handler);
+
+/**
+ * pmo_unregister_get_dtim_period_callback(): API to unregister callback that
+ * gets dtim period from mlme
+ * @psoc: objmgr psoc handle
+ *
+ * Return: QDF_STATUS_SUCCESS in case of success else error
+ */
+QDF_STATUS
+pmo_unregister_get_dtim_period_callback(struct wlan_objmgr_psoc *psoc);
+
+/**
+ * pmo_register_get_beacon_interval_callback(): API to register callback that
+ * gets beacon interval from mlme
+ * @psoc: objmgr psoc handle
+ * @handler: pointer to the callback function
+ *
+ * Return: QDF_STATUS_SUCCESS in case of success else error
+ */
+QDF_STATUS
+pmo_register_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc,
+					  pmo_get_beacon_interval handler);
+
+/**
+ * pmo_unregister_get_beacon_interval_callback(): API to unregister callback
+ * that gets beacon interval from mlme
+ * @psoc: objmgr psoc handle
+ *
+ * Return: QDF_STATUS_SUCCESS in case of success else error
+ */
+QDF_STATUS
+pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc);
 
 /**
  * pmo_register_is_device_in_low_pwr_mode(): API to get register device  power
@@ -386,6 +428,33 @@ pmo_unregister_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc)
 {
 	return QDF_STATUS_SUCCESS;
 }
+
+static inline QDF_STATUS
+pmo_register_get_dtim_period_callback(struct wlan_objmgr_psoc *psoc,
+				      pmo_get_dtim_period handler)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+pmo_unregister_get_dtim_period_callback(struct wlan_objmgr_psoc *psoc)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+pmo_register_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc,
+					  pmo_get_beacon_interval handler)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
 
 #endif /* end  of _WLAN_PMO_OBJ_MGMT_API_H_ */

+ 11 - 1
components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_public_struct.h

@@ -41,10 +41,20 @@
 typedef void (*pmo_notify_pause_bitmap)(uint8_t vdev_id, uint16_t value);
 
 /**
- * typedef for getting cfg integer from mlme
+ * typedef for function that gets cfg integer from mlme
  */
 typedef QDF_STATUS (*pmo_get_cfg_int)(int cfg_id, int *value);
 
+/**
+ * typedef for function that gets dtim period from mlme
+ */
+typedef QDF_STATUS (*pmo_get_dtim_period)(uint8_t vdev_id, uint8_t *value);
+
+/**
+ * typedef for function that gets  beacon interval from mlme
+ */
+typedef QDF_STATUS (*pmo_get_beacon_interval)(uint8_t vdev_id, uint16_t *value);
+
 /**
  * typedef for getting vdev pause bitmap
  */

+ 110 - 1
components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c

@@ -769,7 +769,6 @@ QDF_STATUS pmo_register_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc,
 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
 		psoc_ctx->get_cfg_int = handler;
 	}
-
 	pmo_psoc_put_ref(psoc);
 
 	return QDF_STATUS_SUCCESS;
@@ -794,7 +793,117 @@ QDF_STATUS pmo_unregister_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc)
 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
 		psoc_ctx->get_cfg_int = NULL;
 	}
+	pmo_psoc_put_ref(psoc);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS pmo_register_get_dtim_period_callback(struct wlan_objmgr_psoc *psoc,
+						 pmo_get_dtim_period handler)
+{
+	struct pmo_psoc_priv_obj *psoc_ctx;
+	QDF_STATUS status;
+
+	if (!psoc) {
+		pmo_err("psoc is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (!handler) {
+		pmo_err("pmo_get_dtim_period is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	status = pmo_psoc_get_ref(psoc);
+	if (status != QDF_STATUS_SUCCESS) {
+		pmo_err("pmo cannot get the reference out of psoc");
+		return status;
+	}
+
+	pmo_psoc_with_ctx(psoc, psoc_ctx) {
+		psoc_ctx->get_dtim_period = handler;
+	}
+	pmo_psoc_put_ref(psoc);
 
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+pmo_unregister_get_dtim_period_callback(struct wlan_objmgr_psoc *psoc)
+{
+	struct pmo_psoc_priv_obj *psoc_ctx;
+	QDF_STATUS status;
+
+	if (!psoc) {
+		pmo_err("psoc is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	status = pmo_psoc_get_ref(psoc);
+	if (status != QDF_STATUS_SUCCESS) {
+		pmo_err("pmo cannot get the reference out of psoc");
+		return status;
+	}
+
+	pmo_psoc_with_ctx(psoc, psoc_ctx) {
+		psoc_ctx->get_dtim_period = NULL;
+	}
+	pmo_psoc_put_ref(psoc);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+pmo_register_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc,
+					  pmo_get_beacon_interval handler)
+{
+	struct pmo_psoc_priv_obj *psoc_ctx;
+	QDF_STATUS status;
+
+	if (!psoc) {
+		pmo_err("psoc is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (!handler) {
+		pmo_err("pmo_get_beacon_interval is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	status = pmo_psoc_get_ref(psoc);
+	if (status != QDF_STATUS_SUCCESS) {
+		pmo_err("pmo cannot get the reference out of psoc");
+		return status;
+	}
+
+	pmo_psoc_with_ctx(psoc, psoc_ctx) {
+		psoc_ctx->get_beacon_interval = handler;
+	}
+	pmo_psoc_put_ref(psoc);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc)
+{
+	struct pmo_psoc_priv_obj *psoc_ctx;
+	QDF_STATUS status;
+
+	if (!psoc) {
+		pmo_err("psoc is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	status = pmo_psoc_get_ref(psoc);
+	if (status != QDF_STATUS_SUCCESS) {
+		pmo_err("pmo cannot get the reference out of psoc");
+		return status;
+	}
+
+	pmo_psoc_with_ctx(psoc, psoc_ctx) {
+		psoc_ctx->get_beacon_interval = NULL;
+	}
 	pmo_psoc_put_ref(psoc);
 
 	return QDF_STATUS_SUCCESS;

+ 62 - 6
core/wma/inc/wma.h

@@ -2400,16 +2400,72 @@ QDF_STATUS wma_vdev_get_cfg_int(int cfg_id, int *value)
 	/* set value to zero */
 	*value = 0;
 
-	if (!mac) {
-		WMA_LOGE("%s: Failed to get mac context!", __func__);
+	if (!mac)
 		return QDF_STATUS_E_FAILURE;
-	}
 
-	if (wlan_cfg_get_int(mac, cfg_id, value) != eSIR_SUCCESS) {
-		WMA_LOGE("%s: Can't get cfg_id :%d", __func__, cfg_id);
+	if (wlan_cfg_get_int(mac, cfg_id, value) != eSIR_SUCCESS)
+		return QDF_STATUS_E_FAILURE;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * wma_vdev_get_dtim_period - Get dtim period value from mlme
+ * @vdev_id: vdev index number
+ * @value: pointer to the value to fill out
+ *
+ * Note caller must verify return status before using value
+ *
+ * Return: QDF_STATUS_SUCCESS when fetched a valid value from cfg else
+ * QDF_STATUS_E_FAILURE
+ */
+static inline
+QDF_STATUS wma_vdev_get_dtim_period(uint8_t vdev_id, uint8_t *value)
+{
+	tp_wma_handle wma = (tp_wma_handle)cds_get_context(QDF_MODULE_ID_WMA);
+	struct wma_txrx_node *iface;
+	/* set value to zero */
+	*value = 0;
+
+	if (!wma)
+		return QDF_STATUS_E_FAILURE;
+
+	iface = &wma->interfaces[vdev_id];
+
+	if (!iface || !iface->handle)
+		return QDF_STATUS_E_FAILURE;
+
+	*value = iface->dtimPeriod;
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * wma_vdev_get_beacon_interval - Get beacon interval from mlme
+ * @vdev_id: vdev index number
+ * @value: pointer to the value to fill out
+ *
+ * Note caller must verify return status before using value
+ *
+ * Return: QDF_STATUS_SUCCESS when fetched a valid value from cfg else
+ * QDF_STATUS_E_FAILURE
+ */
+static inline
+QDF_STATUS wma_vdev_get_beacon_interval(uint8_t  vdev_id, uint16_t *value)
+{
+	tp_wma_handle wma = (tp_wma_handle)cds_get_context(QDF_MODULE_ID_WMA);
+	struct wma_txrx_node *iface;
+	/* set value to zero */
+	*value = 0;
+
+	if (!wma)
+		return QDF_STATUS_E_FAILURE;
+
+	iface = &wma->interfaces[vdev_id];
+
+	if (!iface || !iface->handle)
 		return QDF_STATUS_E_FAILURE;
-	}
 
+	*value = iface->beaconInterval;
 	return QDF_STATUS_SUCCESS;
 }
 

+ 6 - 0
core/wma/src/wma_main.c

@@ -3536,6 +3536,10 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
 		wma_vdev_is_device_in_low_pwr_mode);
 	pmo_register_get_cfg_int_callback(wma_handle->psoc,
 					  wma_vdev_get_cfg_int);
+	pmo_register_get_dtim_period_callback(wma_handle->psoc,
+					      wma_vdev_get_dtim_period);
+	pmo_register_get_beacon_interval_callback(wma_handle->psoc,
+						  wma_vdev_get_beacon_interval);
 	wma_cbacks.wma_get_connection_info = wma_get_connection_info;
 	qdf_status = policy_mgr_register_wma_cb(wma_handle->psoc, &wma_cbacks);
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
@@ -4713,6 +4717,8 @@ QDF_STATUS wma_close(void)
 		wma_handle->pdev = NULL;
 	}
 
+	pmo_unregister_get_beacon_interval_callback(wma_handle->psoc);
+	pmo_unregister_get_dtim_period_callback(wma_handle->psoc);
 	pmo_unregister_get_cfg_int_callback(wma_handle->psoc);
 	pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc);
 	pmo_unregister_get_pause_bitmap(wma_handle->psoc);