diff --git a/components/pmo/core/inc/wlan_pmo_main.h b/components/pmo/core/inc/wlan_pmo_main.h index ed696b6005..8f478aebbd 100644 --- a/components/pmo/core/inc/wlan_pmo_main.h +++ b/components/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; } -/** - * 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 - * @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 */ 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; - 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); + qdf_spin_lock_bh(&psoc_ctx->lock); + handler = psoc_ctx->get_vdev_dp_handle; + qdf_spin_unlock_bh(&psoc_ctx->lock); + + if (handler) + dp_hdl = handler(vdev_id); return dp_hdl; } diff --git a/components/pmo/core/inc/wlan_pmo_priv.h b/components/pmo/core/inc/wlan_pmo_priv.h index c72b9fac98..2cd3c3674b 100644 --- a/components/pmo/core/inc/wlan_pmo_priv.h +++ b/components/pmo/core/inc/wlan_pmo_priv.h @@ -62,6 +62,7 @@ struct pmo_psoc_priv_obj { void *txrx_hdl; pmo_notify_pause_bitmap pause_bitmap_notifier; 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_get_cfg_int get_cfg_int; pmo_get_dtim_period get_dtim_period; @@ -110,7 +111,6 @@ struct wlan_pmo_ctx { * @beacon_interval: vdev beacon interval * @alt_modulated_dtim_enabled:dynamic modulated dtim enabled * @dtim_policy: tells vdev beacon dtim policy - * @vdev_dp_hdl: vdev data path handle * @pmo_vdev_lock: spin lock for pmo vdev priv ctx */ struct pmo_vdev_priv_obj { @@ -133,7 +133,6 @@ struct pmo_vdev_priv_obj { uint8_t beacon_interval; bool alt_modulated_dtim_enable; uint32_t dtim_policy; - void *vdev_dp_hdl; qdf_spinlock_t pmo_vdev_lock; }; diff --git a/components/pmo/core/src/wlan_pmo_suspend_resume.c b/components/pmo/core/src/wlan_pmo_suspend_resume.c index 21c87408ae..53953d0d95 100644 --- a/components/pmo/core/src/wlan_pmo_suspend_resume.c +++ b/components/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) { uint8_t vdev_id; - struct wlan_objmgr_vdev *vdev; + struct cdp_vdev *vdev_dp; /* 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); - if (!vdev) + vdev_dp = pmo_core_vdev_get_dp_handle(psoc_ctx, vdev_id); + if (!vdev_dp) continue; /* When host resumes, by default unpause all active vdev */ if (pmo_core_vdev_get_pause_bitmap(psoc_ctx, vdev_id)) { cdp_fc_vdev_unpause(pmo_core_psoc_get_dp_handle(psoc), - pmo_core_vdev_get_dp_handle(vdev), + vdev_dp, 0xffffffff); if (psoc_ctx->pause_bitmap_notifier) psoc_ctx->pause_bitmap_notifier(vdev_id, 0); diff --git a/components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h b/components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h index b1255823cf..3d69e1cfde 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h +++ b/components/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 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 * save check notifier. @@ -403,6 +421,19 @@ pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc) 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 pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc, pmo_is_device_in_low_pwr_mode handler) diff --git a/components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_public_struct.h b/components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_public_struct.h index 6cb2b1d25f..3461a64390 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_public_struct.h +++ b/components/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 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 */ diff --git a/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h b/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h index 9291180755..6c52c4ac3a 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h +++ b/components/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 *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 * @psoc: objmgr psoc handle diff --git a/components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c b/components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c index 2045f39a4a..f0b9d956e3 100644 --- a/components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c +++ b/components/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; } +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, pmo_get_cfg_int handler) { diff --git a/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c b/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c index 121f7907cd..36fdb3a860 100644 --- a/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c +++ b/components/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); } -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 *htc_handle) { diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index f41fed7196..70c9a097dc 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -2351,6 +2351,37 @@ uint16_t wma_vdev_get_pause_bitmap(uint8_t vdev_id) return iface->pause_bitmap; } +/** + * wma_vdev_get_dp_handle() - Get vdev datapth handle + * @vdev_id: the Id of the vdev to configure + * + * Return: Vdev datapath handle else NULL on error + */ +static inline +struct cdp_vdev *wma_vdev_get_vdev_dp_handle(uint8_t vdev_id) +{ + tp_wma_handle wma = (tp_wma_handle)cds_get_context(QDF_MODULE_ID_WMA); + struct wma_txrx_node *iface; + + if (!wma) { + WMA_LOGE("%s: WMA context is invald!", __func__); + return NULL; + } + + if (vdev_id >= wma->max_bssid) + return NULL; + + iface = &wma->interfaces[vdev_id]; + + if (!iface) { + WMA_LOGE("%s: Failed to get iface: NULL", + __func__); + return NULL; + } + + return iface->handle; +} + /** * wma_vdev_is_device_in_low_pwr_mode - is device in power save mode * @vdev_id: the Id of the vdev to configure diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 840f615c22..24260fdb25 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -3532,6 +3532,8 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc, wma_vdev_update_pause_bitmap); pmo_register_get_pause_bitmap(wma_handle->psoc, wma_vdev_get_pause_bitmap); + pmo_register_get_vdev_dp_handle(wma_handle->psoc, + wma_vdev_get_vdev_dp_handle); 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, @@ -4723,6 +4725,7 @@ QDF_STATUS wma_close(void) 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); + pmo_unregister_get_vdev_dp_handle(wma_handle->psoc); target_if_free_psoc_tgt_info(wma_handle->psoc);