diff --git a/components/pmo/core/inc/wlan_pmo_priv.h b/components/pmo/core/inc/wlan_pmo_priv.h index 56ec12f67ebe..c72b9fac987b 100644 --- a/components/pmo/core/inc/wlan_pmo_priv.h +++ b/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; }; diff --git a/components/pmo/core/inc/wlan_pmo_suspend_resume.h b/components/pmo/core/inc/wlan_pmo_suspend_resume.h index 7de32fa70253..f70a0285db78 100644 --- a/components/pmo/core/inc/wlan_pmo_suspend_resume.h +++ b/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 diff --git a/components/pmo/core/inc/wlan_pmo_wow.h b/components/pmo/core/inc/wlan_pmo_wow.h index 55751d67ebe5..ecc2d24ebdda 100644 --- a/components/pmo/core/inc/wlan_pmo_wow.h +++ b/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 diff --git a/components/pmo/core/src/wlan_pmo_suspend_resume.c b/components/pmo/core/src/wlan_pmo_suspend_resume.c index bfcedb4c59ff..21c87408aecd 100644 --- a/components/pmo/core/src/wlan_pmo_suspend_resume.c +++ b/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; 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 393c5a176596..b1255823cf6d 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h +++ b/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_ */ 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 81dee367a7a6..6cb2b1d25f83 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 @@ -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 */ 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 714cb3ce09cd..2045f39a4a4a 100644 --- a/components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c +++ b/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; diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index e0cdd1c12ea2..f41fed719614 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -2400,19 +2400,75 @@ 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; +} + /** * wma_vdev_set_pause_bit() - Set a bit in vdev pause bitmap * @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 e552d5fd34ac..840f615c222c 100644 --- a/core/wma/src/wma_main.c +++ b/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);