diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 6923172ef7..86572e763d 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -164,6 +164,9 @@ enum wmi_rx_exec_ctx { * @param osdev : NIC device * @param target_type : type of supported wmi command * @param use_cookie : flag to indicate cookie based allocation + * @param enable_vdev_pdev_param_conversion : To enable pdev vdev parametric + * id conversion from host type to + * target type * @param ops : handle to wmi ops * @psoc : objmgr psoc * @max_commands : max commands @@ -173,6 +176,7 @@ struct wmi_unified_attach_params { enum wmi_target_type target_type; bool use_cookie; bool is_async_ep; + bool enable_vdev_pdev_param_conversion; struct wmi_rx_ops *rx_ops; struct wlan_objmgr_psoc *psoc; uint16_t max_commands; diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 94f4ee0f8c..fb7a8af11a 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -2001,10 +2001,6 @@ struct wmi_unified { bool use_cookie; bool wmi_stopinprogress; uint32_t *wmi_events; -#ifndef CONFIG_MCL - uint32_t *pdev_param; - uint32_t *vdev_param; -#endif uint32_t *services; struct wmi_soc *soc; uint16_t wmi_max_cmds; @@ -2039,10 +2035,8 @@ struct wmi_soc { /* WMI service bitmap received from target */ uint32_t *wmi_service_bitmap; uint32_t *wmi_ext_service_bitmap; -#ifndef CONFIG_MCL - uint32_t pdev_param[wmi_pdev_param_max]; - uint32_t vdev_param[wmi_vdev_param_max]; -#endif + uint32_t *pdev_param; + uint32_t *vdev_param; uint32_t services[wmi_services_max]; uint16_t wmi_max_cmds; uint32_t soc_idx; diff --git a/wmi/src/wmi_unified.c b/wmi/src/wmi_unified.c index 244182846b..46e99d7b88 100644 --- a/wmi/src/wmi_unified.c +++ b/wmi/src/wmi_unified.c @@ -2397,29 +2397,6 @@ static inline void wmi_interface_logging_init(struct wmi_unified *wmi_handle, } #endif -/** - * wmi_target_params_init: Target specific params init - * @param wmi_soc: Pointer to wmi soc object - * @param wmi_handle: Pointer to wmi handle object - * - * return: None - */ -#ifndef CONFIG_MCL -static inline void wmi_target_params_init(struct wmi_soc *soc, - struct wmi_unified *wmi_handle) -{ - wmi_handle->pdev_param = soc->pdev_param; - wmi_handle->vdev_param = soc->vdev_param; - wmi_handle->services = soc->services; -} -#else -static inline void wmi_target_params_init(struct wmi_soc *soc, - struct wmi_unified *wmi_handle) -{ - wmi_handle->services = soc->services; -} -#endif - /** * wmi_unified_get_pdev_handle: Get WMI SoC handle * @param wmi_soc: Pointer to wmi soc object @@ -2458,7 +2435,7 @@ void *wmi_unified_get_pdev_handle(struct wmi_soc *soc, uint32_t pdev_idx) goto error; } wmi_handle->wmi_events = soc->wmi_events; - wmi_target_params_init(soc, wmi_handle); + wmi_handle->services = soc->services; wmi_handle->soc = soc; wmi_interface_logging_init(wmi_handle, pdev_idx); qdf_atomic_init(&wmi_handle->pending_cmds); @@ -2566,8 +2543,23 @@ void *wmi_unified_attach(void *scn_handle, wmi_handle->event_handler = soc->event_handler; wmi_handle->ctx = soc->ctx; wmi_handle->wmi_events = soc->wmi_events; - wmi_target_params_init(soc, wmi_handle); + wmi_handle->services = soc->services; wmi_handle->scn_handle = scn_handle; + if (param->enable_vdev_pdev_param_conversion) { + if (wmi_pdev_param_max > SIZE_MAX / sizeof(uint32_t)) + goto error; + soc->pdev_param = qdf_mem_malloc( + wmi_pdev_param_max * sizeof(uint32_t)); + if (!soc->pdev_param) + goto error; + + if (wmi_vdev_param_max > SIZE_MAX / sizeof(uint32_t)) + goto error; + soc->vdev_param = qdf_mem_malloc( + wmi_vdev_param_max * sizeof(uint32_t)); + if (!soc->vdev_param) + goto error; + } soc->scn_handle = scn_handle; qdf_atomic_init(&wmi_handle->pending_cmds); qdf_atomic_init(&wmi_handle->is_target_suspended); @@ -2618,6 +2610,14 @@ void *wmi_unified_attach(void *scn_handle, return wmi_handle; error: + if (soc->pdev_param) { + qdf_mem_free(soc->pdev_param); + soc->pdev_param = NULL; + } + if (soc->vdev_param) { + qdf_mem_free(soc->vdev_param); + soc->vdev_param = NULL; + } qdf_mem_free(soc); qdf_mem_free(wmi_handle); @@ -2670,6 +2670,16 @@ void wmi_unified_detach(struct wmi_unified *wmi_handle) } qdf_spinlock_destroy(&soc->ctx_lock); + if (soc->pdev_param) { + qdf_mem_free(soc->pdev_param); + soc->pdev_param = NULL; + } + + if (soc->vdev_param) { + qdf_mem_free(soc->vdev_param); + soc->vdev_param = NULL; + } + if (soc->wmi_service_bitmap) { qdf_mem_free(soc->wmi_service_bitmap); soc->wmi_service_bitmap = NULL; diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 34ef0a8da3..6448589fbf 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -1206,22 +1206,19 @@ send_pdev_utf_cmd_tlv(wmi_unified_t wmi_handle, return ret; } -#ifdef CONFIG_MCL + static inline uint32_t convert_host_pdev_param_tlv(wmi_unified_t wmi_handle, uint32_t host_param) { + if (wmi_handle->soc->pdev_param) { + if (host_param < wmi_pdev_param_max) + return wmi_handle->soc->pdev_param[host_param]; + return WMI_UNAVAILABLE_PARAM; + } + return host_param; } -#else -static inline uint32_t convert_host_pdev_param_tlv(wmi_unified_t wmi_handle, - uint32_t host_param) -{ - if (host_param < wmi_pdev_param_max) - return wmi_handle->pdev_param[host_param]; - return WMI_UNAVAILABLE_PARAM; -} -#endif /** * send_pdev_param_cmd_tlv() - set pdev parameters * @wmi_handle: wmi handle @@ -1597,22 +1594,18 @@ send_dbglog_cmd_tlv(wmi_unified_t wmi_handle, } #endif -#ifdef CONFIG_MCL static inline uint32_t convert_host_vdev_param_tlv(wmi_unified_t wmi_handle, uint32_t host_param) { + if (wmi_handle->soc->vdev_param) { + if (host_param < wmi_vdev_param_max) + return wmi_handle->soc->vdev_param[host_param]; + return WMI_UNAVAILABLE_PARAM; + } + return host_param; } -#else -static inline uint32_t convert_host_vdev_param_tlv(wmi_unified_t wmi_handle, - uint32_t host_param) -{ - if (host_param < wmi_vdev_param_max) - return wmi_handle->vdev_param[host_param]; - return WMI_UNAVAILABLE_PARAM; -} -#endif /** * send_vdev_set_param_cmd_tlv() - WMI vdev set parameter function * @param wmi_handle : handle to WMI. @@ -11952,7 +11945,6 @@ static void populate_tlv_service(uint32_t *wmi_service) wmi_service[wmi_service_cfr_capture_support] = WMI_SERVICE_CFR_CAPTURE_SUPPORT; } -#ifndef CONFIG_MCL /** * populate_pdev_param_tlv() - populates pdev params @@ -12401,7 +12393,6 @@ static void populate_vdev_param_tlv(uint32_t *vdev_param) vdev_param[wmi_vdev_param_rawmode_open_war] = WMI_VDEV_PARAM_RAW_IS_ENCRYPTED; } -#endif /** * populate_target_defines_tlv() - Populate target defines and params @@ -12409,16 +12400,14 @@ static void populate_vdev_param_tlv(uint32_t *vdev_param) * * Return: None */ -#ifndef CONFIG_MCL static void populate_target_defines_tlv(struct wmi_unified *wmi_handle) { - populate_pdev_param_tlv(wmi_handle->pdev_param); - populate_vdev_param_tlv(wmi_handle->vdev_param); + if (wmi_handle->soc->pdev_param) + populate_pdev_param_tlv(wmi_handle->soc->pdev_param); + if (wmi_handle->soc->vdev_param) + populate_vdev_param_tlv(wmi_handle->soc->vdev_param); + } -#else -static void populate_target_defines_tlv(struct wmi_unified *wmi_handle) -{ } -#endif /** * wmi_ocb_ut_attach() - Attach OCB test framework