From 031d51614edafae9f3e39a32cee475eb846b975f Mon Sep 17 00:00:00 2001 From: Basamma Yakkanahalli Date: Sun, 5 Mar 2023 06:04:17 +0530 Subject: [PATCH] qcacmn: Add DBR support for standalone sounding CBF CV data Added change, 1. Define new DBR module DBR_MODULE_CBF to handle TxBF standalone sounding CV data and corresponding ring initialization. 2. API to extract new meta data TLV added for CV data. 3. API to handle standalone sounding complete. Change-Id: Id28c5561bb8b3bf08de7ddd9aa2365e2ae99f1c2 CRs-Fixed: 3415627 --- hal/wifi3.0/hal_internal.h | 2 + hal/wifi3.0/qcn9224/v1/hal_9224v1.c | 6 ++- hal/wifi3.0/qcn9224/v2/hal_9224v2.c | 6 ++- .../inc/target_if_direct_buf_rx_api.h | 12 ++++- .../src/target_if_direct_buf_rx_main.c | 25 +++++++++- wmi/inc/wmi_unified_dbr_api.h | 15 ++++++ wmi/inc/wmi_unified_dbr_param.h | 28 ++++++++++- wmi/inc/wmi_unified_param.h | 6 +++ wmi/inc/wmi_unified_priv.h | 14 ++++++ wmi/src/wmi_unified_dbr_api.c | 14 ++++++ wmi/src/wmi_unified_dbr_tlv.c | 49 +++++++++++++++++-- wmi/src/wmi_unified_tlv.c | 8 +++ 12 files changed, 172 insertions(+), 13 deletions(-) diff --git a/hal/wifi3.0/hal_internal.h b/hal/wifi3.0/hal_internal.h index 19dfe17600..89c393f837 100644 --- a/hal/wifi3.0/hal_internal.h +++ b/hal/wifi3.0/hal_internal.h @@ -307,9 +307,11 @@ enum hal_srng_ring_id { HAL_SRNG_WIFI_POS_SRC_DMA_RING, HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING, HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING1, + HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING2, #else HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING, HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING1, + HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING2, #endif HAL_SRNG_WMAC1_TXMON2SW0, HAL_SRNG_SW2TXMON_BUF0, diff --git a/hal/wifi3.0/qcn9224/v1/hal_9224v1.c b/hal/wifi3.0/qcn9224/v1/hal_9224v1.c index e356d30fcd..b66ee50d2d 100644 --- a/hal/wifi3.0/qcn9224/v1/hal_9224v1.c +++ b/hal/wifi3.0/qcn9224/v1/hal_9224v1.c @@ -421,8 +421,10 @@ struct hal_hw_srng_config hw_srng_table_9224v1[] = { { /* DIR_BUF_RX_DMA_SRC */ .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING, - /* one ring for spectral and one ring for cfr */ - .max_rings = 2, + /* one ring for spectral, one ring for cfr and + * another one ring for txbf cv upload + */ + .max_rings = 3, .entry_size = 2, .lmac_ring = TRUE, .ring_dir = HAL_SRNG_SRC_RING, diff --git a/hal/wifi3.0/qcn9224/v2/hal_9224v2.c b/hal/wifi3.0/qcn9224/v2/hal_9224v2.c index f855c3c973..792a7534ab 100644 --- a/hal/wifi3.0/qcn9224/v2/hal_9224v2.c +++ b/hal/wifi3.0/qcn9224/v2/hal_9224v2.c @@ -421,8 +421,10 @@ struct hal_hw_srng_config hw_srng_table_9224v2[] = { { /* DIR_BUF_RX_DMA_SRC */ .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING, - /* one ring for spectral and one ring for cfr */ - .max_rings = 2, + /* one ring for spectral, one ring for cfr and + * another one ring for txbf cv upload + */ + .max_rings = 3, .entry_size = 2, .lmac_ring = TRUE, .ring_dir = HAL_SRNG_SRC_RING, diff --git a/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h b/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h index 7654776fd2..14ccf7ce3e 100644 --- a/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h +++ b/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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 @@ -28,11 +28,13 @@ * enum DBR_MODULE - Enum containing the modules supporting direct buf rx * @DBR_MODULE_SPECTRAL: Module ID for Spectral * @DBR_MODULE_CFR: Module ID for CFR + * @DBR_MODULE_CBF: Module ID for TXBF CBF CV upload * @DBR_MODULE_MAX: Max module ID */ enum DBR_MODULE { DBR_MODULE_SPECTRAL = 0, DBR_MODULE_CFR = 1, + DBR_MODULE_CBF = 2, DBR_MODULE_MAX, }; @@ -85,7 +87,9 @@ struct wlan_lmac_if_tx_ops; * @cookie: Cookie for the buffer rxed from target * @paddr: physical address of buffer corresponding to vaddr * @meta_data_valid: Indicates that metadata is valid + * @cv_meta_data_valid: Indicates that CV upload metadata is valid * @meta_data: Meta data + * @cv_meta_data: TxBF CV Meta data */ struct direct_buf_rx_data { size_t dbr_len; @@ -93,7 +97,11 @@ struct direct_buf_rx_data { uint32_t cookie; qdf_dma_addr_t paddr; bool meta_data_valid; - struct direct_buf_rx_metadata meta_data; + bool cv_meta_data_valid; + union { + struct direct_buf_rx_metadata meta_data; + struct direct_buf_rx_cv_metadata cv_meta_data; + }; }; #endif diff --git a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c index bda31227b7..59cac1e7a9 100644 --- a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c +++ b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c @@ -36,6 +36,7 @@ struct module_name { static const struct module_name g_dbr_module_name[DBR_MODULE_MAX] = { [DBR_MODULE_SPECTRAL] = {"SPECTRAL"}, [DBR_MODULE_CFR] = {"CFR"}, + [DBR_MODULE_CBF] = {"CBF"}, }; static uint8_t get_num_dbr_modules_per_pdev(struct wlan_objmgr_pdev *pdev) @@ -2177,10 +2178,24 @@ static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn, if (dbr_rsp.num_meta_data_entry > dbr_rsp.num_buf_release_entry) { direct_buf_rx_err("More than expected number of metadata"); + direct_buf_rx_err("meta_data_entry:%d cv_meta_data_entry:%d buf_release_entry:%d", + dbr_rsp.num_meta_data_entry, + dbr_rsp.num_cv_meta_data_entry, + dbr_rsp.num_buf_release_entry); wlan_objmgr_pdev_release_ref(pdev, dbr_mod_id); return QDF_STATUS_E_FAILURE; } - + if (dbr_rsp.num_cv_meta_data_entry > dbr_rsp.num_buf_release_entry) { + direct_buf_rx_err("More than expected number of cv metadata"); + direct_buf_rx_err("meta_data_entry:%d cv_meta_data_entry:%d buf_release_entry:%d", + dbr_rsp.num_meta_data_entry, + dbr_rsp.num_cv_meta_data_entry, + dbr_rsp.num_buf_release_entry); + wlan_objmgr_pdev_release_ref(pdev, dbr_mod_id); + return QDF_STATUS_E_FAILURE; + } + QDF_ASSERT(!(dbr_rsp.num_cv_meta_data_entry && + dbr_rsp.num_meta_data_entry)); for (i = 0; i < dbr_rsp.num_buf_release_entry; i++) { if (wmi_extract_dbr_buf_release_entry( wmi_handle, data_buf, i, @@ -2209,6 +2224,14 @@ static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn, dbr_data.meta_data_valid = true; } + dbr_data.cv_meta_data_valid = false; + if (i < dbr_rsp.num_cv_meta_data_entry) { + if (wmi_extract_dbr_buf_cv_metadata( + wmi_handle, data_buf, i, + &dbr_data.cv_meta_data) == QDF_STATUS_SUCCESS) + dbr_data.cv_meta_data_valid = true; + } + target_if_dbr_add_ring_debug_entry(pdev, dbr_rsp.mod_id, DBR_RING_DEBUG_EVENT_RX, srng_id); diff --git a/wmi/inc/wmi_unified_dbr_api.h b/wmi/inc/wmi_unified_dbr_api.h index de378415c5..39e8ff05e1 100644 --- a/wmi/inc/wmi_unified_dbr_api.h +++ b/wmi/inc/wmi_unified_dbr_api.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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 @@ -78,4 +79,18 @@ QDF_STATUS wmi_extract_dbr_buf_metadata( uint8_t *evt_buf, uint8_t idx, struct direct_buf_rx_metadata *param); +/** + * wmi_extract_dbr_buf_cv_metadata: Extract direct buffer TxBF cbf cv metadata + * + * @wmi_handle: WMI handle + * @evt_buf: Event buffer + * @idx: Index of the module for which capability is received + * @param: Pointer to direct buffer cv metadata + * + * Return: QDF status of operation + */ +QDF_STATUS wmi_extract_dbr_buf_cv_metadata( + wmi_unified_t wmi_handle, + uint8_t *evt_buf, uint8_t idx, + struct direct_buf_rx_cv_metadata *param); #endif /* _WMI_UNIFIED_DBR_API_H_ */ diff --git a/wmi/inc/wmi_unified_dbr_param.h b/wmi/inc/wmi_unified_dbr_param.h index 5207eb8bf8..be6aa1c579 100644 --- a/wmi/inc/wmi_unified_dbr_param.h +++ b/wmi/inc/wmi_unified_dbr_param.h @@ -79,7 +79,8 @@ * @pdev_id: Index of the pdev for which response is received * @mod_id: Index of the module for which respone is received * @num_buf_release_entry: Number of buffers released through event - * @num_meta_data_entry: + * @num_meta_data_entry: Number of meta data released + * @num_cv_meta_data_entry: Number of cv meta data released * @dbr_entries: Pointer to direct buffer rx entry struct */ struct direct_buf_rx_rsp { @@ -87,6 +88,7 @@ struct direct_buf_rx_rsp { uint32_t mod_id; uint32_t num_buf_release_entry; uint32_t num_meta_data_entry; + uint32_t num_cv_meta_data_entry; struct direct_buf_rx_entry *dbr_entries; }; @@ -138,6 +140,30 @@ struct direct_buf_rx_metadata { uint32_t ch_width; }; +/** + * struct direct_buf_rx_cv_metadata: direct buffer metadata for TxBF CV upload + * + * @is_valid: Set cv metadata is valid, + * false if sw_peer_id is invalid or FCS error + * @fb_type: Feedback type, 0 for SU 1 for MU + * @asnr_len: Average SNR length + * @asnr_offset: Average SNR offset + * @dsnr_len: Delta SNR length + * @dsnr_offset: Delta SNR offset + * @peer_mac: Peer macaddr + * @fb_params: Feedback params, [1:0] Nc [3:2] nss_num + */ +struct direct_buf_rx_cv_metadata { + uint32_t is_valid; + uint32_t fb_type; + uint16_t asnr_len; + uint16_t asnr_offset; + uint16_t dsnr_len; + uint16_t dsnr_offset; + struct qdf_mac_addr peer_mac; + uint32_t fb_params; +}; + /** * struct direct_buf_rx_entry: direct buffer rx release entry structure * diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index a76d6837b2..639c58ff7a 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -5264,6 +5264,9 @@ typedef enum { wmi_pdev_set_tgtr2p_table_eventid, #ifdef QCA_MANUAL_TRIGGERED_ULOFDMA wmi_manual_ul_ofdma_trig_feedback_eventid, +#endif +#ifdef QCA_STANDALONE_SOUNDING_TRIGGER + wmi_vdev_standalone_sound_complete_eventid, #endif wmi_events_max, } wmi_conv_event_id; @@ -6307,6 +6310,9 @@ typedef enum { wmi_service_manual_ulofdma_trigger_support, #endif wmi_service_pre_rx_timeout, +#ifdef QCA_STANDALONE_SOUNDING_TRIGGER + wmi_service_standalone_sound, +#endif wmi_services_max, } wmi_conv_service_ids; #define WMI_SERVICE_UNAVAILABLE 0xFFFF diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 82eb55fea0..04dbee2312 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -2283,6 +2283,11 @@ QDF_STATUS (*extract_dbr_buf_metadata)( wmi_unified_t wmi_handle, uint8_t *evt_buf, uint8_t idx, struct direct_buf_rx_metadata *param); + +QDF_STATUS (*extract_dbr_buf_cv_metadata)( + wmi_unified_t wmi_handle, + uint8_t *evt_buf, uint8_t idx, + struct direct_buf_rx_cv_metadata *param); #endif QDF_STATUS (*extract_pdev_utf_event)(wmi_unified_t wmi_hdl, @@ -2708,6 +2713,15 @@ QDF_STATUS(*extract_twt_session_stats_data) ); #endif +#ifdef QCA_STANDALONE_SOUNDING_TRIGGER +QDF_STATUS (*extract_standalone_sounding_evt_params) + ( + wmi_unified_t wmi_handle, + void *evt_buf, + struct wmi_host_standalone_sounding_evt_params *ss_params + ); +#endif + #ifdef QCA_SUPPORT_CP_STATS QDF_STATUS (*extract_cca_stats)(wmi_unified_t wmi_handle, void *evt_buf, struct wmi_host_congestion_stats *stats); diff --git a/wmi/src/wmi_unified_dbr_api.c b/wmi/src/wmi_unified_dbr_api.c index c59633ed53..a402339a6b 100644 --- a/wmi/src/wmi_unified_dbr_api.c +++ b/wmi/src/wmi_unified_dbr_api.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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 @@ -66,3 +67,16 @@ QDF_STATUS wmi_extract_dbr_buf_metadata( return QDF_STATUS_E_FAILURE; } + +QDF_STATUS wmi_extract_dbr_buf_cv_metadata( + wmi_unified_t wmi_handle, + uint8_t *evt_buf, uint8_t idx, + struct direct_buf_rx_cv_metadata *param) +{ + if (wmi_handle->ops->extract_dbr_buf_cv_metadata) + return wmi_handle->ops->extract_dbr_buf_cv_metadata( + wmi_handle, + evt_buf, idx, param); + + return QDF_STATUS_E_FAILURE; +} diff --git a/wmi/src/wmi_unified_dbr_tlv.c b/wmi/src/wmi_unified_dbr_tlv.c index 8f2b8a22b7..1ba03ea212 100644 --- a/wmi/src/wmi_unified_dbr_tlv.c +++ b/wmi/src/wmi_unified_dbr_tlv.c @@ -133,17 +133,20 @@ static QDF_STATUS extract_dbr_buf_release_fixed_tlv(wmi_unified_t wmi_handle, ev->pdev_id); param->mod_id = ev->mod_id; if ((!param_buf->num_entries) || - param_buf->num_entries < ev->num_buf_release_entry){ + param_buf->num_entries < ev->num_buf_release_entry) { wmi_err("actual num of buf release entries less than provided entries"); return QDF_STATUS_E_INVAL; } param->num_buf_release_entry = ev->num_buf_release_entry; - if ((!param_buf->num_meta_data) || - param_buf->num_meta_data < ev->num_meta_data_entry) { - wmi_err("actual num of meta data entries less than provided entries"); + if (((!param_buf->num_meta_data) || + param_buf->num_meta_data < ev->num_meta_data_entry) && + ((!param_buf->num_cv_meta_data) || + param_buf->num_cv_meta_data < ev->num_meta_data_entry)) { + wmi_err(" actual num of meta data entries less than provided entries"); return QDF_STATUS_E_INVAL; } - param->num_meta_data_entry = ev->num_meta_data_entry; + param->num_meta_data_entry = param_buf->num_meta_data; + param->num_cv_meta_data_entry = param_buf->num_cv_meta_data; wmi_debug("pdev id %d mod id %d num buf release entry %d", param->pdev_id, param->mod_id, param->num_buf_release_entry); @@ -204,6 +207,41 @@ static QDF_STATUS extract_dbr_buf_metadata_tlv( return QDF_STATUS_SUCCESS; } +static QDF_STATUS extract_dbr_buf_cv_metadata_tlv( + wmi_unified_t wmi_handle, uint8_t *event, + uint8_t idx, struct direct_buf_rx_cv_metadata *param) +{ + WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf; + wmi_dma_buf_release_cv_upload_meta_data *ev; + + param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event; + if (!param_buf) + return QDF_STATUS_E_INVAL; + + ev = ¶m_buf->cv_meta_data[idx]; + + if (!ev) { + wmi_err("CV metadata is NULL"); + return QDF_STATUS_E_FAILURE; + } + + param->is_valid = ev->is_valid; + param->fb_type = ev->fb_type; + param->asnr_len = + WMI_DMA_BUF_RELEASE_CV_UPLOAD_GET_ASNR_LENGTH(ev->asnr_params); + param->asnr_offset = + WMI_DMA_BUF_RELEASE_CV_UPLOAD_GET_ASNR_OFFSET(ev->asnr_params); + param->dsnr_len = + WMI_DMA_BUF_RELEASE_CV_UPLOAD_GET_DSNR_LENGTH(ev->dsnr_params); + param->dsnr_offset = + WMI_DMA_BUF_RELEASE_CV_UPLOAD_GET_DSNR_OFFSET(ev->dsnr_params); + WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_mac_address, + ¶m->peer_mac.bytes[0]); + param->fb_params = ev->fb_params; + + return QDF_STATUS_SUCCESS; +} + void wmi_dbr_attach_tlv(wmi_unified_t wmi_handle) { struct wmi_ops *ops = wmi_handle->ops; @@ -211,6 +249,7 @@ void wmi_dbr_attach_tlv(wmi_unified_t wmi_handle) ops->send_dbr_cfg_cmd = send_dbr_cfg_cmd_tlv; 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_cv_metadata = extract_dbr_buf_cv_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 03d8cc1d01..cbc9ca9eb2 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -21447,6 +21447,10 @@ static void populate_tlv_events_id(WMI_EVT_ID *event_ids) event_ids[wmi_manual_ul_ofdma_trig_feedback_eventid] = WMI_MANUAL_UL_OFDMA_TRIG_FEEDBACK_EVENTID; #endif +#ifdef QCA_STANDALONE_SOUNDING_TRIGGER + event_ids[wmi_vdev_standalone_sound_complete_eventid] = + WMI_VDEV_STANDALONE_SOUND_COMPLETE_EVENTID; +#endif } #ifdef WLAN_FEATURE_LINK_LAYER_STATS @@ -21997,6 +22001,10 @@ static void populate_tlv_service(uint32_t *wmi_service) #endif wmi_service[wmi_service_pre_rx_timeout] = WMI_SERVICE_PRE_RX_TO; +#ifdef QCA_STANDALONE_SOUNDING_TRIGGER + wmi_service[wmi_service_standalone_sound] = + WMI_SERVICE_STANDALONE_SOUND; +#endif } /**