Jelajahi Sumber

qcacld-3.0: Use wma callback to get vdev dp handle

PMO should not know about vdev data path handle, but
pmo_unpause_all_vdev() need it, so register a wma callback to retrieve
the vdev dp handle instead of keep a copy in pmo vdev private context.

Refine current code to retrieve vdev dp handle using a wma callback

Change-Id: I1f668fff633a5e5cdfc478e7f619e9600930b333
CRs-Fixed: 2227384
Will Huang 7 tahun lalu
induk
melakukan
ca44875a70

+ 12 - 27
pmo/core/inc/wlan_pmo_main.h

@@ -214,41 +214,26 @@ static inline void *pmo_core_psoc_get_dp_handle(struct wlan_objmgr_psoc *psoc)
 	return dp_hdl;
 	return dp_hdl;
 }
 }
 
 
-/**
- * pmo_core_vdev_update_dp_handle() - update vdev data path handle
- * @vdev: objmgr vdev handle
- * @dp_hdl: Vdev data path handle
- *
- * Return: None
- */
-static inline
-void pmo_core_vdev_update_dp_handle(struct wlan_objmgr_vdev *vdev,
-	void *dp_hdl)
-{
-	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->vdev_dp_hdl = dp_hdl;
-	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
-}
-
 /**
 /**
  * pmo_core_vdev_get_dp_handle() - Get vdev data path handle
  * pmo_core_vdev_get_dp_handle() - Get vdev data path handle
- * @vdev: objmgr vdev handle
+ * @psoc_ctx: pmo psoc private context
+ * @vdev_id: vdev id config to get data path handle
  *
  *
  * Return: Vdev data path handle
  * Return: Vdev data path handle
  */
  */
 static inline
 static inline
-void *pmo_core_vdev_get_dp_handle(struct wlan_objmgr_vdev *vdev)
+struct cdp_vdev *pmo_core_vdev_get_dp_handle(struct pmo_psoc_priv_obj *psoc_ctx,
+					     uint8_t vdev_id)
 {
 {
-	void *dp_hdl;
-	struct pmo_vdev_priv_obj *vdev_ctx;
+	struct cdp_vdev *dp_hdl = NULL;
+	pmo_get_vdev_dp_handle handler;
+
+	qdf_spin_lock_bh(&psoc_ctx->lock);
+	handler = psoc_ctx->get_vdev_dp_handle;
+	qdf_spin_unlock_bh(&psoc_ctx->lock);
 
 
-	vdev_ctx = pmo_vdev_get_priv(vdev);
-	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
-	dp_hdl = vdev_ctx->vdev_dp_hdl;
-	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+	if (handler)
+		dp_hdl = handler(vdev_id);
 
 
 	return dp_hdl;
 	return dp_hdl;
 }
 }

+ 1 - 2
pmo/core/inc/wlan_pmo_priv.h

@@ -62,6 +62,7 @@ struct pmo_psoc_priv_obj {
 	void *txrx_hdl;
 	void *txrx_hdl;
 	pmo_notify_pause_bitmap pause_bitmap_notifier;
 	pmo_notify_pause_bitmap pause_bitmap_notifier;
 	pmo_get_pause_bitmap get_pause_bitmap;
 	pmo_get_pause_bitmap get_pause_bitmap;
+	pmo_get_vdev_dp_handle get_vdev_dp_handle;
 	pmo_is_device_in_low_pwr_mode is_device_in_low_pwr_mode;
 	pmo_is_device_in_low_pwr_mode is_device_in_low_pwr_mode;
 	pmo_get_cfg_int get_cfg_int;
 	pmo_get_cfg_int get_cfg_int;
 	pmo_get_dtim_period get_dtim_period;
 	pmo_get_dtim_period get_dtim_period;
@@ -110,7 +111,6 @@ struct wlan_pmo_ctx {
  * @beacon_interval: vdev beacon interval
  * @beacon_interval: vdev beacon interval
  * @alt_modulated_dtim_enabled:dynamic modulated dtim enabled
  * @alt_modulated_dtim_enabled:dynamic modulated dtim enabled
  * @dtim_policy: tells vdev beacon dtim policy
  * @dtim_policy: tells vdev beacon dtim policy
- * @vdev_dp_hdl: vdev data path handle
  * @pmo_vdev_lock: spin lock for pmo vdev priv ctx
  * @pmo_vdev_lock: spin lock for pmo vdev priv ctx
  */
  */
 struct pmo_vdev_priv_obj {
 struct pmo_vdev_priv_obj {
@@ -133,7 +133,6 @@ struct pmo_vdev_priv_obj {
 	uint8_t beacon_interval;
 	uint8_t beacon_interval;
 	bool alt_modulated_dtim_enable;
 	bool alt_modulated_dtim_enable;
 	uint32_t dtim_policy;
 	uint32_t dtim_policy;
-	void *vdev_dp_hdl;
 	qdf_spinlock_t pmo_vdev_lock;
 	qdf_spinlock_t pmo_vdev_lock;
 };
 };
 
 

+ 4 - 4
pmo/core/src/wlan_pmo_suspend_resume.c

@@ -520,18 +520,18 @@ static void pmo_unpause_all_vdev(struct wlan_objmgr_psoc *psoc,
 				 struct pmo_psoc_priv_obj *psoc_ctx)
 				 struct pmo_psoc_priv_obj *psoc_ctx)
 {
 {
 	uint8_t vdev_id;
 	uint8_t vdev_id;
-	struct wlan_objmgr_vdev *vdev;
+	struct cdp_vdev *vdev_dp;
 
 
 	/* Iterate through VDEV list */
 	/* Iterate through VDEV list */
 	for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
 	for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
-		vdev = pmo_psoc_get_vdev(psoc, vdev_id);
-		if (!vdev)
+		vdev_dp = pmo_core_vdev_get_dp_handle(psoc_ctx, vdev_id);
+		if (!vdev_dp)
 			continue;
 			continue;
 
 
 		/* When host resumes, by default unpause all active vdev */
 		/* When host resumes, by default unpause all active vdev */
 		if (pmo_core_vdev_get_pause_bitmap(psoc_ctx, vdev_id)) {
 		if (pmo_core_vdev_get_pause_bitmap(psoc_ctx, vdev_id)) {
 			cdp_fc_vdev_unpause(pmo_core_psoc_get_dp_handle(psoc),
 			cdp_fc_vdev_unpause(pmo_core_psoc_get_dp_handle(psoc),
-					    pmo_core_vdev_get_dp_handle(vdev),
+					    vdev_dp,
 					    0xffffffff);
 					    0xffffffff);
 			if (psoc_ctx->pause_bitmap_notifier)
 			if (psoc_ctx->pause_bitmap_notifier)
 				psoc_ctx->pause_bitmap_notifier(vdev_id, 0);
 				psoc_ctx->pause_bitmap_notifier(vdev_id, 0);

+ 31 - 0
pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h

@@ -250,6 +250,24 @@ pmo_register_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc,
 QDF_STATUS
 QDF_STATUS
 pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc);
 pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc);
 
 
+/**
+ * pmo_register_get_vdev_dp_handle(): API to register get vdev datapath handle
+ * @psoc: objmgr psoc handle
+ * @handler: get vdev datapath handle callback
+ *
+ * Return QDF_STATUS status - in case of success else return error
+ */
+QDF_STATUS pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
+					   pmo_get_vdev_dp_handle handler);
+
+/**
+ * pmo_unregister_get_vdev_dp_handle(): API to unregister get vdev dp handle
+ * @psoc: objmgr psoc handle
+ *
+ * Return QDF_STATUS status - in case of success else return error
+ */
+QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc);
+
 /**
 /**
  * pmo_register_is_device_in_low_pwr_mode(): API to get register device  power
  * pmo_register_is_device_in_low_pwr_mode(): API to get register device  power
  * save check notifier.
  * save check notifier.
@@ -403,6 +421,19 @@ pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc)
 	return QDF_STATUS_SUCCESS;
 	return QDF_STATUS_SUCCESS;
 }
 }
 
 
+static inline QDF_STATUS
+pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
+				pmo_get_vdev_dp_handle handler)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
 static inline QDF_STATUS
 static inline QDF_STATUS
 pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc,
 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)

+ 5 - 0
pmo/dispatcher/inc/wlan_pmo_obj_mgmt_public_struct.h

@@ -60,6 +60,11 @@ typedef QDF_STATUS (*pmo_get_beacon_interval)(uint8_t vdev_id, uint16_t *value);
  */
  */
 typedef  uint16_t(*pmo_get_pause_bitmap)(uint8_t vdev_id);
 typedef  uint16_t(*pmo_get_pause_bitmap)(uint8_t vdev_id);
 
 
+/**
+ * typedef for getting vdev datapath handle
+ */
+typedef struct cdp_vdev * (*pmo_get_vdev_dp_handle)(uint8_t vdev_id);
+
 /**
 /**
  * typedef to know is deviec is in power save mode
  * typedef to know is deviec is in power save mode
  */
  */

+ 0 - 10
pmo/dispatcher/inc/wlan_pmo_ucfg_api.h

@@ -455,16 +455,6 @@ void pmo_ucfg_psoc_update_power_save_mode(struct wlan_objmgr_psoc *psoc,
 void pmo_ucfg_psoc_update_dp_handle(struct wlan_objmgr_psoc *psoc,
 void pmo_ucfg_psoc_update_dp_handle(struct wlan_objmgr_psoc *psoc,
 	void *dp_hdl);
 	void *dp_hdl);
 
 
-/**
- * pmo_ucfg_vdev_update_dp_handle() - update vdev data path handle
- * @vdev: objmgr vdev handle
- * @dp_hdl: vdev data path handle
- *
- * Return: None
- */
-void pmo_ucfg_vdev_update_dp_handle(struct wlan_objmgr_vdev *vdev,
-	void *dp_hdl);
-
 /**
 /**
  * pmo_ucfg_psoc_update_htc_handle() - update psoc htc layer handle
  * pmo_ucfg_psoc_update_htc_handle() - update psoc htc layer handle
  * @psoc: objmgr psoc handle
  * @psoc: objmgr psoc handle

+ 41 - 0
pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c

@@ -744,6 +744,47 @@ pmo_unregister_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc)
 	return QDF_STATUS_SUCCESS;
 	return QDF_STATUS_SUCCESS;
 }
 }
 
 
+QDF_STATUS pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
+					   pmo_get_vdev_dp_handle handler)
+{
+	struct pmo_psoc_priv_obj *psoc_ctx;
+
+	if (!psoc) {
+		QDF_BUG(psoc);
+		pmo_err("psoc is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (!handler) {
+		QDF_BUG(handler);
+		pmo_err("pmo_get_vdev_dp_handle is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	pmo_psoc_with_ctx(psoc, psoc_ctx) {
+		psoc_ctx->get_vdev_dp_handle = handler;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc)
+{
+	struct pmo_psoc_priv_obj *psoc_ctx;
+
+	if (!psoc) {
+		QDF_BUG(psoc);
+		pmo_err("psoc is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	pmo_psoc_with_ctx(psoc, psoc_ctx) {
+		psoc_ctx->get_vdev_dp_handle = NULL;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
 QDF_STATUS pmo_register_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc,
 QDF_STATUS pmo_register_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc,
 					     pmo_get_cfg_int handler)
 					     pmo_get_cfg_int handler)
 {
 {

+ 0 - 6
pmo/dispatcher/src/wlan_pmo_ucfg_api.c

@@ -273,12 +273,6 @@ void pmo_ucfg_psoc_update_dp_handle(struct wlan_objmgr_psoc *psoc,
 	pmo_core_psoc_update_dp_handle(psoc, dp_handle);
 	pmo_core_psoc_update_dp_handle(psoc, dp_handle);
 }
 }
 
 
-void pmo_ucfg_vdev_update_dp_handle(struct wlan_objmgr_vdev *vdev,
-		void *dp_handle)
-{
-	pmo_core_vdev_update_dp_handle(vdev, dp_handle);
-}
-
 void pmo_ucfg_psoc_update_htc_handle(struct wlan_objmgr_psoc *psoc,
 void pmo_ucfg_psoc_update_htc_handle(struct wlan_objmgr_psoc *psoc,
 		void *htc_handle)
 		void *htc_handle)
 {
 {