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 } /**