From ac0ddecb36e2d8723e58977c26eb85cca88efac6 Mon Sep 17 00:00:00 2001 From: Edayilliam Jayadev Date: Wed, 8 Aug 2018 11:51:06 +0530 Subject: [PATCH] qcacmn: Get Spectral bin scaling params Extended service ready event has a tlv containing the spectral bin scaling parameters. Populate the spectral capabilities using this info. CRs-Fixed: 2379652 Change-Id: I0b4648302e7170b5965cf1aec68638e70cd36e73 --- target_if/core/inc/target_if.h | 4 +- target_if/core/src/target_if_main.c | 1 + .../init_deinit/inc/service_ready_param.h | 22 ++++++- .../init_deinit/inc/service_ready_util.h | 29 ++++++++- .../init_deinit/src/init_event_handler.c | 6 ++ .../init_deinit/src/service_ready_util.c | 61 ++++++++++++++++++- wmi/inc/wmi_unified_dbr_api.h | 18 +++++- wmi/inc/wmi_unified_priv.h | 5 ++ wmi/src/wmi_unified_api.c | 14 +++++ wmi/src/wmi_unified_dbr_api.c | 2 +- wmi/src/wmi_unified_dbr_tlv.c | 31 +++++++++- wmi/src/wmi_unified_tlv.c | 1 + 12 files changed, 187 insertions(+), 7 deletions(-) diff --git a/target_if/core/inc/target_if.h b/target_if/core/inc/target_if.h index 8020804457..7ab306fbe6 100644 --- a/target_if/core/inc/target_if.h +++ b/target_if/core/inc/target_if.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2019 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 @@ -172,6 +172,7 @@ struct target_supported_modes { * @service_ext_param: ext service params * @mac_phy_cap: phy caps array * @reg_cap: regulatory caps array + * @scaling_params: Spectral bin scaling parameters * @num_mem_chunks: number of mem chunks allocated * @hw_mode_caps: HW mode caps of preferred mode * @mem_chunks: allocated memory blocks for FW @@ -196,6 +197,7 @@ struct tgt_info { struct wlan_psoc_host_mac_phy_caps mac_phy_cap[PSOC_MAX_MAC_PHY_CAP]; struct wlan_psoc_host_dbr_ring_caps *dbr_ring_cap; + struct wlan_psoc_host_spectral_scaling_params *scaling_params; uint32_t num_mem_chunks; struct wmi_host_mem_chunk mem_chunks[MAX_MEM_CHUNKS]; struct wlan_psoc_host_hw_mode_caps hw_mode_cap; diff --git a/target_if/core/src/target_if_main.c b/target_if/core/src/target_if_main.c index ce4045a909..7d68a3014e 100644 --- a/target_if/core/src/target_if_main.c +++ b/target_if/core/src/target_if_main.c @@ -552,6 +552,7 @@ QDF_STATUS target_if_free_psoc_tgt_info(struct wlan_objmgr_psoc *psoc) } init_deinit_chainmask_table_free(ext_param); init_deinit_dbr_ring_cap_free(tgt_psoc_info); + init_deinit_spectral_scaling_params_free(tgt_psoc_info); qdf_event_destroy(&tgt_psoc_info->info.event); diff --git a/target_if/init_deinit/inc/service_ready_param.h b/target_if/init_deinit/inc/service_ready_param.h index 7c284d8a74..45e2626bf1 100644 --- a/target_if/init_deinit/inc/service_ready_param.h +++ b/target_if/init_deinit/inc/service_ready_param.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2019 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 @@ -222,6 +222,24 @@ struct wlan_psoc_host_dbr_ring_caps { uint32_t min_buf_align; }; +/** + * struct wlan_psoc_host_spectral_scaling_params - Spectral scaling params + * @pdev_id: Pdev id of the pdev + * @formula_id: Formula id + * @low_level_offset: Low level offset + * @high_level_offset: High level offset + * @rssi_thr: RSSI threshold + * @default_agc_max_gain: Default agc max gain + */ +struct wlan_psoc_host_spectral_scaling_params { + uint32_t pdev_id; + uint32_t formula_id; + uint32_t low_level_offset; + uint32_t high_level_offset; + uint32_t rssi_thr; + uint32_t default_agc_max_gain; +}; + /** * struct wlan_psoc_host_chainmask_capabilities - chain mask capabilities list * @supports_chan_width_20: channel width 20 support for this chain mask. @@ -280,6 +298,7 @@ struct wlan_psoc_host_chainmask_table { * @num_chainmask_tables: Number of chain mask tables. * @num_dbr_ring_caps: Number of direct buf rx ring capabilities * @max_bssid_indicator: Maximum number of VAPs in MBSS IE + * @num_bin_scaling_params: Number of Spectral bin scaling parameters * @chainmask_table: Available chain mask tables. * @sar_version: SAR version info */ @@ -296,6 +315,7 @@ struct wlan_psoc_host_service_ext_param { uint32_t num_chainmask_tables; uint32_t num_dbr_ring_caps; uint32_t max_bssid_indicator; + uint32_t num_bin_scaling_params; struct wlan_psoc_host_chainmask_table chainmask_table[PSOC_MAX_CHAINMASK_TABLES]; uint32_t sar_version; diff --git a/target_if/init_deinit/inc/service_ready_util.h b/target_if/init_deinit/inc/service_ready_util.h index 3d1cb32c12..898cdc05ad 100644 --- a/target_if/init_deinit/inc/service_ready_util.h +++ b/target_if/init_deinit/inc/service_ready_util.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2019 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 @@ -157,6 +157,22 @@ int init_deinit_populate_dbr_ring_cap(struct wlan_objmgr_psoc *psoc, void *handle, uint8_t *event, struct tgt_info *info); +/** + * init_deinit_populate_spectral_bin_scale_params() - populate Spectral scaling + * @psoc: PSOC object + * @handle: WMI handle pointer + * @event: event buffer received from FW + * @info: tgt_info object + * + * API to populate Spectral bin scaling parameters + * + * Return: zero on successful parsing of scaling params or failure + */ +int init_deinit_populate_spectral_bin_scale_params( + struct wlan_objmgr_psoc *psoc, + void *handle, uint8_t *event, + struct tgt_info *info); + /** * init_deinit_dbr_ring_cap_free() - free dbr ring capability * @tgt_psoc_info: target psoc info object @@ -168,6 +184,17 @@ int init_deinit_populate_dbr_ring_cap(struct wlan_objmgr_psoc *psoc, QDF_STATUS init_deinit_dbr_ring_cap_free( struct target_psoc_info *tgt_psoc_info); +/** + * init_deinit_spectral_scaling_params_free() - free Spectral scaling params + * @tgt_psoc_info: target psoc info object + * + * API to free Spectral scaling params + * + * Return: QDF_STATUS + */ +QDF_STATUS init_deinit_spectral_scaling_params_free( + struct target_psoc_info *tgt_psoc_info); + /** * init_deinit_populate_phy_reg_cap() - populate phy reg capability * @psoc: PSOC object diff --git a/target_if/init_deinit/src/init_event_handler.c b/target_if/init_deinit/src/init_event_handler.c index 2759af5479..e525683385 100644 --- a/target_if/init_deinit/src/init_event_handler.c +++ b/target_if/init_deinit/src/init_event_handler.c @@ -268,6 +268,12 @@ static int init_deinit_service_ext_ready_event_handler(ol_scn_t scn_handle, if (err_code) goto exit; + err_code = init_deinit_populate_spectral_bin_scale_params(psoc, + wmi_handle, + event, info); + if (err_code) + goto exit; + legacy_callback = target_if_get_psoc_legacy_service_ready_cb(); if (legacy_callback) legacy_callback(wmi_service_ready_ext_event_id, diff --git a/target_if/init_deinit/src/service_ready_util.c b/target_if/init_deinit/src/service_ready_util.c index 6daa243c7a..ec863eee09 100644 --- a/target_if/init_deinit/src/service_ready_util.c +++ b/target_if/init_deinit/src/service_ready_util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2019 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 @@ -389,6 +389,49 @@ free_and_return: return qdf_status_to_os_return(status); } +int init_deinit_populate_spectral_bin_scale_params( + struct wlan_objmgr_psoc *psoc, void *handle, + uint8_t *event, struct tgt_info *info) + +{ + uint8_t param_idx; + uint32_t num_bin_scaling_params; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + num_bin_scaling_params = info->service_ext_param.num_bin_scaling_params; + + if (!num_bin_scaling_params) + return 0; + + info->scaling_params = qdf_mem_malloc( + sizeof(struct wlan_psoc_host_spectral_scaling_params) * + num_bin_scaling_params); + + if (!info->scaling_params) { + target_if_err("Mem alloc for bin scaling params failed"); + return -EINVAL; + } + + for (param_idx = 0; param_idx < num_bin_scaling_params; param_idx++) { + status = wmi_extract_spectral_scaling_params_service_ready_ext( + handle, + event, param_idx, + &info->scaling_params[param_idx]); + if (QDF_IS_STATUS_ERROR(status)) { + target_if_err("Extraction of scaling params failed"); + goto free_and_return; + } + } + + return 0; + +free_and_return: + qdf_mem_free(info->scaling_params); + info->scaling_params = NULL; + + return qdf_status_to_os_return(status); +} + QDF_STATUS init_deinit_dbr_ring_cap_free( struct target_psoc_info *tgt_psoc_info) { @@ -403,6 +446,22 @@ QDF_STATUS init_deinit_dbr_ring_cap_free( } qdf_export_symbol(init_deinit_dbr_ring_cap_free); +QDF_STATUS init_deinit_spectral_scaling_params_free( + struct target_psoc_info *tgt_psoc_info) +{ + QDF_STATUS status = QDF_STATUS_E_FAILURE; + + if (tgt_psoc_info->info.scaling_params) { + qdf_mem_free(tgt_psoc_info->info.scaling_params); + tgt_psoc_info->info.scaling_params = NULL; + status = QDF_STATUS_SUCCESS; + } + + return status; +} + +qdf_export_symbol(init_deinit_spectral_scaling_params_free); + int init_deinit_populate_phy_reg_cap(struct wlan_objmgr_psoc *psoc, void *handle, uint8_t *event, struct tgt_info *info, bool service_ready) diff --git a/wmi/inc/wmi_unified_dbr_api.h b/wmi/inc/wmi_unified_dbr_api.h index 7605bf193c..7574722a7c 100644 --- a/wmi/inc/wmi_unified_dbr_api.h +++ b/wmi/inc/wmi_unified_dbr_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2019 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,6 +38,22 @@ typedef struct wmi_unified *wmi_unified_t; QDF_STATUS wmi_unified_dbr_ring_cfg(void *wmi_hdl, struct direct_buf_rx_cfg_req *cfg); +/** + * wmi_extract_spectral_scaling_params_service_ready_ext: Extract Spectral + * scaling params received through + * extended service ready event + * @wmi_hdl: WMI handle + * @evt_buf: Event buffer + * @idx: Index + * @param: Pointer to Spectral scaling params + * + * Return: QDF status of operation + */ +QDF_STATUS wmi_extract_spectral_scaling_params_service_ready_ext( + void *wmi_hdl, + uint8_t *evt_buf, uint8_t idx, + struct wlan_psoc_host_spectral_scaling_params *param); + /** * wmi_extract_dbr_buf_release_fixed : Extract direct buffer rx fixed param * from buffer release event diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index e495feddfa..e09d82598d 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1629,6 +1629,11 @@ QDF_STATUS (*extract_dbr_ring_cap_service_ready_ext)( uint8_t *evt_buf, uint8_t idx, struct wlan_psoc_host_dbr_ring_caps *param); +QDF_STATUS (*extract_scaling_params_service_ready_ext)( + wmi_unified_t wmi_handle, + uint8_t *evt_buf, uint8_t idx, + struct wlan_psoc_host_spectral_scaling_params *param); + QDF_STATUS (*extract_sar_cap_service_ready_ext)( wmi_unified_t wmi_handle, uint8_t *evt_buf, diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 0dc165d98d..42479d901c 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -4061,6 +4061,20 @@ QDF_STATUS wmi_extract_dbr_ring_cap_service_ready_ext( return QDF_STATUS_E_FAILURE; } +QDF_STATUS wmi_extract_spectral_scaling_params_service_ready_ext( + void *wmi_hdl, + uint8_t *evt_buf, uint8_t idx, + struct wlan_psoc_host_spectral_scaling_params *param) +{ + wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl; + + if (wmi_handle->ops->extract_scaling_params_service_ready_ext) + return wmi_handle->ops->extract_scaling_params_service_ready_ext + (wmi_handle, evt_buf, idx, param); + + return QDF_STATUS_E_FAILURE; +} + /** * wmi_extract_pdev_utf_event() - * extract UTF data from pdev utf event diff --git a/wmi/src/wmi_unified_dbr_api.c b/wmi/src/wmi_unified_dbr_api.c index 0abfab7c24..6d73ae6e22 100644 --- a/wmi/src/wmi_unified_dbr_api.c +++ b/wmi/src/wmi_unified_dbr_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2019 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 diff --git a/wmi/src/wmi_unified_dbr_tlv.c b/wmi/src/wmi_unified_dbr_tlv.c index 5cb110f6c0..efaed02dbe 100644 --- a/wmi/src/wmi_unified_dbr_tlv.c +++ b/wmi/src/wmi_unified_dbr_tlv.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2019 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 @@ -85,6 +85,33 @@ static QDF_STATUS send_dbr_cfg_cmd_tlv(wmi_unified_t wmi_handle, return ret; } +static QDF_STATUS extract_scaling_params_service_ready_ext_tlv( + wmi_unified_t wmi_handle, + uint8_t *event, uint8_t idx, + struct wlan_psoc_host_spectral_scaling_params *param) +{ + WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf; + wmi_spectral_bin_scaling_params *spectral_bin_scaling_params; + + param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *)event; + if (!param_buf) + return QDF_STATUS_E_INVAL; + + spectral_bin_scaling_params = ¶m_buf->wmi_bin_scaling_params[idx]; + + param->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host( + spectral_bin_scaling_params->pdev_id); + param->low_level_offset = spectral_bin_scaling_params->low_level_offset; + param->formula_id = spectral_bin_scaling_params->formula_id; + param->high_level_offset = + spectral_bin_scaling_params->high_level_offset; + param->rssi_thr = spectral_bin_scaling_params->rssi_thr; + param->default_agc_max_gain = + spectral_bin_scaling_params->default_agc_max_gain; + + return QDF_STATUS_SUCCESS; +} + static QDF_STATUS extract_dbr_buf_release_fixed_tlv(wmi_unified_t wmi_handle, uint8_t *event, struct direct_buf_rx_rsp *param) { @@ -169,4 +196,6 @@ void wmi_dbr_attach_tlv(wmi_unified_t wmi_handle) ops->extract_dbr_buf_release_entry = extract_dbr_buf_release_entry_tlv; ops->extract_dbr_buf_metadata = extract_dbr_buf_metadata_tlv; ops->extract_dbr_buf_release_fixed = extract_dbr_buf_release_fixed_tlv; + ops->extract_scaling_params_service_ready_ext = + extract_scaling_params_service_ready_ext_tlv; } diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 59ffe1ff8b..23ce94e7fe 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -9063,6 +9063,7 @@ static QDF_STATUS extract_service_ready_ext_tlv(wmi_unified_t wmi_handle, param->max_bssid_rx_filters = ev->max_bssid_rx_filters; param->fw_build_vers_ext = ev->fw_build_vers_ext; param->num_dbr_ring_caps = param_buf->num_dma_ring_caps; + param->num_bin_scaling_params = param_buf->num_wmi_bin_scaling_params; param->max_bssid_indicator = ev->max_bssid_indicator; qdf_mem_copy(¶m->ppet, &ev->ppet, sizeof(param->ppet));