Bladeren bron

qcacld-3.0: Add support for getting cfg integer from PMO

Add support for getting cfg integer from PMO. Register callbacks
during pe_open/close so that PMO can query CFG int values for
calculating parameters like listen interval etc.

Change-Id: I52d165586576e547e175ba276e6b7225db5b27e0
CRs-Fixed: 2252661
Mukul Sharma 6 jaren geleden
bovenliggende
commit
4474604869

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

@@ -46,6 +46,7 @@
  * @txrx_hdl: txrx pdev handle
  * @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
  * @lock: spin lock for pmo psoc
  */
 struct pmo_psoc_priv_obj {
@@ -60,6 +61,7 @@ struct pmo_psoc_priv_obj {
 	pmo_notify_pause_bitmap pause_bitmap_notifier;
 	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;
 	qdf_spinlock_t lock;
 };
 
@@ -131,6 +133,15 @@ struct pmo_vdev_priv_obj {
 	qdf_spinlock_t pmo_vdev_lock;
 };
 
+/**
+ * enum pmo_cfg_int_type: Mapping for Mac config param ID's
+ * @PMO_CFG_DTIM_PERIOD: CFG ID for Dtim Period value
+ * @PMO_CFG_LISTEN_INTERVAL: CFG ID for Listen Interval value
+ */
+enum pmo_cfg_int_type {
+	PMO_CFG_DTIM_PERIOD = 0x5,
+	PMO_CFG_LISTEN_INTERVAL = 0x26,
+};
 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
 
 #endif /* end  of _WLAN_PMO_PRIV_STRUCT_H_ */

+ 95 - 89
components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h

@@ -54,8 +54,8 @@ QDF_STATUS pmo_deinit(void);
  *
  * Return QDF_STATUS status in case of success else return error
  */
-QDF_STATUS pmo_psoc_object_created_notification(
-		struct wlan_objmgr_psoc *psoc, void *arg);
+QDF_STATUS pmo_psoc_object_created_notification(struct wlan_objmgr_psoc *psoc,
+						void *arg);
 
 /**
  *  pmo_psoc_object_destroyed_notification(): pmo psoc delete handler
@@ -66,8 +66,8 @@ QDF_STATUS pmo_psoc_object_created_notification(
  *
  * Return QDF_STATUS status in case of success else return error
  */
-QDF_STATUS pmo_psoc_object_destroyed_notification(
-		struct wlan_objmgr_psoc *psoc, void *arg);
+QDF_STATUS pmo_psoc_object_destroyed_notification(struct wlan_objmgr_psoc *psoc,
+						  void *arg);
 
 /**
  * pmo_vdev_object_created_notification(): pmo vdev create handler
@@ -78,8 +78,8 @@ QDF_STATUS pmo_psoc_object_destroyed_notification(
  *
  * Return QDF_STATUS status in case of success else return error
  */
-QDF_STATUS pmo_vdev_object_created_notification(
-		struct wlan_objmgr_vdev *vdev, void *arg);
+QDF_STATUS pmo_vdev_object_created_notification(struct wlan_objmgr_vdev *vdev,
+						void *arg);
 
 /**
  * pmo_vdev_ready() - handles vdev ready in firmware event
@@ -102,8 +102,8 @@ QDF_STATUS pmo_vdev_ready(struct wlan_objmgr_vdev *vdev);
  *
  * Return QDF_STATUS status in case of success else return error
  */
-QDF_STATUS pmo_vdev_object_destroyed_notification(
-		struct wlan_objmgr_vdev *vdev, void *arg);
+QDF_STATUS pmo_vdev_object_destroyed_notification(struct wlan_objmgr_vdev *vdev,
+						  void *arg);
 
 /**
  * pmo_register_suspend_handler(): register suspend handler for components
@@ -113,10 +113,9 @@ QDF_STATUS pmo_vdev_object_destroyed_notification(
  *
  * Return QDF_STATUS status -in case of success else return error
  */
-QDF_STATUS pmo_register_suspend_handler(
-		enum wlan_umac_comp_id id,
-		pmo_psoc_suspend_handler handler,
-		void *arg);
+QDF_STATUS pmo_register_suspend_handler(enum wlan_umac_comp_id id,
+					pmo_psoc_suspend_handler handler,
+					void *arg);
 
 /**
  * pmo_unregister_suspend_handler():unregister suspend handler for components
@@ -125,9 +124,8 @@ QDF_STATUS pmo_register_suspend_handler(
  *
  * Return QDF_STATUS status -in case of success else return error
  */
-QDF_STATUS pmo_unregister_suspend_handler(
-		enum wlan_umac_comp_id id,
-		pmo_psoc_suspend_handler handler);
+QDF_STATUS pmo_unregister_suspend_handler(enum wlan_umac_comp_id id,
+					  pmo_psoc_suspend_handler handler);
 
 /**
  * pmo_register_resume_handler(): API to register resume handler for components
@@ -137,10 +135,9 @@ QDF_STATUS pmo_unregister_suspend_handler(
  *
  * Return QDF_STATUS status - in case of success else return error
  */
-QDF_STATUS pmo_register_resume_handler(
-		enum wlan_umac_comp_id id,
-		pmo_psoc_resume_handler handler,
-		void *arg);
+QDF_STATUS pmo_register_resume_handler(enum wlan_umac_comp_id id,
+				       pmo_psoc_resume_handler handler,
+				       void *arg);
 
 /**
  * pmo_unregister_resume_handler(): unregister resume handler for components
@@ -149,9 +146,8 @@ QDF_STATUS pmo_register_resume_handler(
  *
  * Return QDF_STATUS status - in case of success else return error
  */
-QDF_STATUS pmo_unregister_resume_handler(
-		enum wlan_umac_comp_id id,
-		pmo_psoc_resume_handler handler);
+QDF_STATUS pmo_unregister_resume_handler(enum wlan_umac_comp_id id,
+					 pmo_psoc_resume_handler handler);
 
 /**
  * pmo_suspend_all_components(): API to suspend all component
@@ -161,7 +157,7 @@ QDF_STATUS pmo_unregister_resume_handler(
  * Return QDF_STATUS status - in case of success else return error
  */
 QDF_STATUS pmo_suspend_all_components(struct wlan_objmgr_psoc *psoc,
-		enum qdf_suspend_type suspend_type);
+				      enum qdf_suspend_type suspend_type);
 
 /**
  * pmo_resume_all_components(): API to resume all component
@@ -171,7 +167,7 @@ QDF_STATUS pmo_suspend_all_components(struct wlan_objmgr_psoc *psoc,
  * Return QDF_STATUS status - in case of success else return error
  */
 QDF_STATUS pmo_resume_all_components(struct wlan_objmgr_psoc *psoc,
-		enum qdf_suspend_type suspend_type);
+				     enum qdf_suspend_type suspend_type);
 
 /**
  * pmo_register_pause_bitmap_notifier(): API to register pause bitmap notifier
@@ -180,20 +176,17 @@ QDF_STATUS pmo_resume_all_components(struct wlan_objmgr_psoc *psoc,
  *
  * Return QDF_STATUS status - in case of success else return error
  */
-QDF_STATUS pmo_register_pause_bitmap_notifier(
-		struct wlan_objmgr_psoc *psoc,
-		pmo_notify_pause_bitmap handler);
+QDF_STATUS pmo_register_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc,
+					      pmo_notify_pause_bitmap handler);
 
 /**
- * pmo_unregister_pause_bitmap_notifier(): API to unregister pause bitmap notifier
+ * pmo_unregister_pause_bitmap_notifier(): API to unregister pause bitmap
+ * notifier
  * @psoc: objmgr psoc handle
- * @handler: pause bitmap updated notifier
  *
  * Return QDF_STATUS status - in case of success else return error
  */
-QDF_STATUS pmo_unregister_pause_bitmap_notifier(
-		struct wlan_objmgr_psoc *psoc,
-		pmo_notify_pause_bitmap handler);
+QDF_STATUS pmo_unregister_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc);
 
 /**
  * pmo_register_get_pause_bitmap(): API to get register pause bitmap notifier
@@ -203,17 +196,16 @@ QDF_STATUS pmo_unregister_pause_bitmap_notifier(
  * Return QDF_STATUS status - in case of success else return error
  */
 QDF_STATUS pmo_register_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
-		pmo_get_pause_bitmap handler);
+					 pmo_get_pause_bitmap handler);
 
 /**
- * pmo_unregister_get_pause_bitmap(): API to unregister get pause bitmap callback
+ * pmo_unregister_get_pause_bitmap(): API to unregister get pause bitmap
+ * callback
  * @psoc: objmgr psoc handle
- * @handler: pause bitmap updated notifier
  *
  * Return QDF_STATUS status - in case of success else return error
  */
-QDF_STATUS pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
-		pmo_get_pause_bitmap handler);
+QDF_STATUS pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc);
 
 
 /**
@@ -225,20 +217,40 @@ QDF_STATUS pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
  * Return QDF_STATUS status - in case of success else return error
  */
 QDF_STATUS pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc,
-		pmo_is_device_in_low_pwr_mode handler);
+					 pmo_is_device_in_low_pwr_mode handler);
 
 /**
  * pmo_unregister_is_device_in_low_pwr_mode(): API to unregister device  power
  * save check notifier.
  * @psoc: objmgr psoc handle
- * @handler: device power save check notifier
  *
  * Return QDF_STATUS status - in case of success else return error
  */
-QDF_STATUS pmo_unregister_is_device_in_low_pwr_mode(
-			struct wlan_objmgr_psoc *psoc,
-			pmo_is_device_in_low_pwr_mode handler);
-#else
+QDF_STATUS
+pmo_unregister_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc);
+
+/**
+ * pmo_register_get_cfg_int_callback(): API to register callback for getting
+ * cfg integer from mlme
+ * @psoc: objmgr psoc handle
+ * @handler: get cfg integer callback notifier
+ *
+ * Return QDF_STATUS status - in case of success else return error
+ */
+QDF_STATUS pmo_register_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc,
+					     pmo_get_cfg_int handler);
+
+/**
+ * pmo_unregister_get_cfg_int_callback(): API to unregister callback that gets
+ * cfg integer from mlme
+ * @psoc: objmgr psoc handle
+ *
+ * Return QDF_STATUS status - in case of success else return error
+ */
+QDF_STATUS pmo_unregister_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc);
+
+#else /* WLAN_POWER_MANAGEMENT_OFFLOAD */
+
 static inline QDF_STATUS pmo_init(void)
 {
 	return QDF_STATUS_SUCCESS;
@@ -250,22 +262,19 @@ static inline QDF_STATUS pmo_deinit(void)
 }
 
 static inline QDF_STATUS
-pmo_psoc_object_created_notification(
-		struct wlan_objmgr_psoc *psoc, void *arg)
+pmo_psoc_object_created_notification(struct wlan_objmgr_psoc *psoc, void *arg)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_psoc_object_destroyed_notification(
-		struct wlan_objmgr_psoc *psoc, void *arg)
+pmo_psoc_object_destroyed_notification(struct wlan_objmgr_psoc *psoc, void *arg)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_vdev_object_created_notification(
-		struct wlan_objmgr_vdev *vdev, void *arg)
+pmo_vdev_object_created_notification(struct wlan_objmgr_vdev *vdev, void *arg)
 {
 	return QDF_STATUS_SUCCESS;
 }
@@ -277,106 +286,103 @@ pmo_vdev_ready(struct wlan_objmgr_vdev *vdev)
 }
 
 static inline QDF_STATUS
-pmo_vdev_object_destroyed_notification(
-		struct wlan_objmgr_vdev *vdev, void *arg)
+pmo_vdev_object_destroyed_notification(struct wlan_objmgr_vdev *vdev, void *arg)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+pmo_register_suspend_handler(enum wlan_umac_comp_id id,
+			     pmo_psoc_suspend_handler handler,
+			     void *arg)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+pmo_unregister_suspend_handler(enum wlan_umac_comp_id id,
+			       pmo_psoc_suspend_handler handler)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_register_suspend_handler(
-		enum wlan_umac_comp_id id,
-		pmo_psoc_suspend_handler handler,
-		void *arg)
+pmo_register_resume_handler(enum wlan_umac_comp_id id,
+			    pmo_psoc_resume_handler handler,
+			    void *arg)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_unregister_suspend_handler(
-		enum wlan_umac_comp_id id,
-		pmo_psoc_suspend_handler handler)
+pmo_unregister_resume_handler(enum wlan_umac_comp_id id,
+			      pmo_psoc_resume_handler handler)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_register_resume_handler(
-		enum wlan_umac_comp_id id,
-		pmo_psoc_resume_handler handler,
-		void *arg)
+pmo_suspend_all_components(struct wlan_objmgr_psoc *psoc,
+			   enum qdf_suspend_type suspend_type)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_unregister_resume_handler(
-		enum wlan_umac_comp_id id,
-		pmo_psoc_resume_handler handler)
+pmo_resume_all_components(struct wlan_objmgr_psoc *psoc,
+			  enum qdf_suspend_type suspend_type)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_suspend_all_components(
-		struct wlan_objmgr_psoc *psoc,
-		enum qdf_suspend_type suspend_type)
+pmo_register_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc,
+				   pmo_notify_pause_bitmap handler)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_resume_all_components(
-		struct wlan_objmgr_psoc *psoc,
-		enum qdf_suspend_type suspend_type)
+pmo_unregister_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_register_pause_bitmap_notifier(
-		struct wlan_objmgr_psoc *psoc,
-		pmo_notify_pause_bitmap handler)
+pmo_register_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
+			      pmo_get_pause_bitmap handler)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_unregister_pause_bitmap_notifier(
-		struct wlan_objmgr_psoc *psoc,
-		pmo_notify_pause_bitmap handler)
+pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_register_get_pause_bitmap(
-		struct wlan_objmgr_psoc *psoc,
-		pmo_get_pause_bitmap handler)
+pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc,
+				       pmo_is_device_in_low_pwr_mode handler)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_unregister_get_pause_bitmap(
-		struct wlan_objmgr_psoc *psoc,
-		pmo_get_pause_bitmap handler)
+pmo_unregister_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_register_is_device_in_low_pwr_mode(
-		struct wlan_objmgr_psoc *psoc,
-		pmo_is_device_in_low_pwr_mode handler)
+pmo_register_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc,
+				  pmo_get_cfg_int handler)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline QDF_STATUS
-pmo_unregister_is_device_in_low_pwr_mode(
-		struct wlan_objmgr_psoc *psoc,
-		pmo_is_device_in_low_pwr_mode handler)
+pmo_unregister_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc)
 {
 	return QDF_STATUS_SUCCESS;
 }

+ 9 - 7
components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_public_struct.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -38,8 +38,12 @@
 /**
  * typedef for vdev notifying the vdev pause bitmap new value to mlme
  */
-typedef void (*pmo_notify_pause_bitmap)(
-			uint8_t vdev_id, uint16_t value);
+typedef void (*pmo_notify_pause_bitmap)(uint8_t vdev_id, uint16_t value);
+
+/**
+ * typedef for getting cfg integer from mlme
+ */
+typedef QDF_STATUS (*pmo_get_cfg_int)(int cfg_id, int *value);
 
 /**
  * typedef for getting vdev pause bitmap
@@ -54,14 +58,12 @@ typedef  bool (*pmo_is_device_in_low_pwr_mode)(uint8_t vdev_id);
 /*
  * typedef for pld auto suspend callback during runtime suspend
  */
-typedef
-int (*pmo_pld_auto_suspend_cb)(void);
+typedef int (*pmo_pld_auto_suspend_cb)(void);
 
 /*
  * typedef for pld auto resume callback during runtime resume
  */
-typedef
-int (*pmo_pld_auto_resume_cb)(void);
+typedef int (*pmo_pld_auto_resume_cb)(void);
 
 /**
  * struct wlan_pmo_tx_ops - structure of tx function

+ 59 - 23
components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c

@@ -606,8 +606,7 @@ QDF_STATUS pmo_register_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS pmo_unregister_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc,
-		pmo_notify_pause_bitmap handler)
+QDF_STATUS pmo_unregister_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc)
 {
 	struct pmo_psoc_priv_obj *psoc_ctx;
 	QDF_STATUS status;
@@ -617,11 +616,6 @@ QDF_STATUS pmo_unregister_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	if (!handler) {
-		pmo_err("pmo_notify_vdev_pause_bitmap 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");
@@ -629,8 +623,7 @@ QDF_STATUS pmo_unregister_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc,
 	}
 
 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
-		if (psoc_ctx->pause_bitmap_notifier == handler)
-			psoc_ctx->pause_bitmap_notifier = NULL;
+		psoc_ctx->pause_bitmap_notifier = NULL;
 	}
 
 	pmo_psoc_put_ref(psoc);
@@ -669,8 +662,7 @@ QDF_STATUS pmo_register_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
-		pmo_get_pause_bitmap handler)
+QDF_STATUS pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc)
 {
 	struct pmo_psoc_priv_obj *psoc_ctx;
 	QDF_STATUS status;
@@ -680,11 +672,6 @@ QDF_STATUS pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	if (!handler) {
-		pmo_err("pmo_get_pause_bitmap 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");
@@ -692,8 +679,7 @@ QDF_STATUS pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
 	}
 
 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
-		if (psoc_ctx->get_pause_bitmap == handler)
-			psoc_ctx->get_pause_bitmap = NULL;
+		psoc_ctx->get_pause_bitmap = NULL;
 	}
 
 	pmo_psoc_put_ref(psoc);
@@ -732,9 +718,34 @@ QDF_STATUS pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS pmo_unregister_is_device_in_low_pwr_mode(
-			struct wlan_objmgr_psoc *psoc,
-			pmo_is_device_in_low_pwr_mode handler)
+QDF_STATUS
+pmo_unregister_is_device_in_low_pwr_mode(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->is_device_in_low_pwr_mode = NULL;
+	}
+
+	pmo_psoc_put_ref(psoc);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS pmo_register_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc,
+					     pmo_get_cfg_int handler)
 {
 	struct pmo_psoc_priv_obj *psoc_ctx;
 	QDF_STATUS status;
@@ -745,7 +756,7 @@ QDF_STATUS pmo_unregister_is_device_in_low_pwr_mode(
 	}
 
 	if (!handler) {
-		pmo_err("pmo_get_pause_bitmap is null");
+		pmo_err("pmo_get_cfg_int is null");
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
@@ -756,7 +767,32 @@ QDF_STATUS pmo_unregister_is_device_in_low_pwr_mode(
 	}
 
 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
-		psoc_ctx->is_device_in_low_pwr_mode = NULL;
+		psoc_ctx->get_cfg_int = handler;
+	}
+
+	pmo_psoc_put_ref(psoc);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS pmo_unregister_get_cfg_int_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_cfg_int = NULL;
 	}
 
 	pmo_psoc_put_ref(psoc);

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

@@ -2384,6 +2384,35 @@ static inline bool wma_vdev_is_device_in_low_pwr_mode(uint8_t vdev_id)
 	return iface->in_bmps || wma->in_imps;
 }
 
+/**
+ * wma_vdev_get_cfg_int - Get cfg integer value
+ * @cfg_id: cfg item number
+ * @value: fill the out value
+ *
+ * Note caller must verify return status before using value
+ *
+ * Return: QDF_STATUS_SUCCESS when got item from cfg else QDF_STATUS_E_FAILURE
+ */
+static inline
+QDF_STATUS wma_vdev_get_cfg_int(int cfg_id, int *value)
+{
+	struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
+	/* set value to zero */
+	*value = 0;
+
+	if (!mac) {
+		WMA_LOGE("%s: Failed to get mac context!", __func__);
+		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);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * wma_vdev_set_pause_bit() - Set a bit in vdev pause bitmap
  * @vdev_id: the Id of the vdev to configure

+ 37 - 18
core/wma/src/wma_main.c

@@ -3534,6 +3534,8 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
 		wma_vdev_get_pause_bitmap);
 	pmo_register_is_device_in_low_pwr_mode(wma_handle->psoc,
 		wma_vdev_is_device_in_low_pwr_mode);
+	pmo_register_get_cfg_int_callback(wma_handle->psoc,
+					  wma_vdev_get_cfg_int);
 	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)) {
@@ -4711,12 +4713,10 @@ QDF_STATUS wma_close(void)
 		wma_handle->pdev = NULL;
 	}
 
-	pmo_unregister_pause_bitmap_notifier(wma_handle->psoc,
-		wma_vdev_update_pause_bitmap);
-	pmo_unregister_get_pause_bitmap(wma_handle->psoc,
-		wma_vdev_get_pause_bitmap);
-	pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc,
-		wma_vdev_is_device_in_low_pwr_mode);
+	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);
+	pmo_unregister_pause_bitmap_notifier(wma_handle->psoc);
 
 	target_if_free_psoc_tgt_info(wma_handle->psoc);
 
@@ -5622,6 +5622,33 @@ static void wma_set_component_caps(struct wlan_objmgr_psoc *psoc)
 	wma_set_pmo_caps(psoc);
 }
 
+#if defined(WLAN_FEATURE_GTK_OFFLOAD) && defined(WLAN_POWER_MANAGEMENT_OFFLOAD)
+static QDF_STATUS wma_register_gtk_offload_event(tp_wma_handle wma_handle)
+{
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
+
+	if (!wma_handle) {
+		WMA_LOGE("%s: wma_handle passed is NULL", __func__);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (wmi_service_enabled(wma_handle->wmi_handle,
+				wmi_service_gtk_offload)) {
+		status = wmi_unified_register_event_handler(
+					wma_handle->wmi_handle,
+					wmi_gtk_offload_status_event_id,
+					target_if_pmo_gtk_offload_status_event,
+					WMA_RX_WORK_CTX);
+	}
+	return status;
+}
+#else
+static QDF_STATUS wma_register_gtk_offload_event(tp_wma_handle wma_handle)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif /* WLAN_FEATURE_GTK_OFFLOAD && WLAN_POWER_MANAGEMENT_OFFLOAD */
+
 /**
  * wma_rx_service_ready_event() - event handler to process
  *                                wmi rx sevice ready event.
@@ -5830,19 +5857,11 @@ int wma_rx_service_ready_event(void *handle, uint8_t *cmd_param_info,
 		WMA_LOGE("FW doesnot support WMI_SERVICE_MGMT_TX_WMI, Use HTT interface for Management Tx");
 	}
 
-#ifdef WLAN_FEATURE_GTK_OFFLOAD
-	if (wmi_service_enabled(wmi_handle, wmi_service_gtk_offload)) {
-		status = wmi_unified_register_event_handler(
-					wma_handle->wmi_handle,
-					wmi_gtk_offload_status_event_id,
-					target_if_pmo_gtk_offload_status_event,
-					WMA_RX_WORK_CTX);
-		if (QDF_IS_STATUS_ERROR(status)) {
-			WMA_LOGE("Failed to register GTK offload event cb");
-			goto free_hw_mode_list;
-		}
+	status = wma_register_gtk_offload_event(wma_handle);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		WMA_LOGE("Failed to register GTK offload event cb");
+		goto free_hw_mode_list;
 	}
-#endif /* WLAN_FEATURE_GTK_OFFLOAD */
 
 	status = wmi_unified_register_event_handler(wmi_handle,
 				wmi_tbttoffset_update_event_id,