Forráskód Böngészése

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
Basamma Yakkanahalli 2 éve
szülő
commit
031d51614e

+ 2 - 0
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,

+ 4 - 2
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,

+ 4 - 2
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,

+ 10 - 2
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
 

+ 24 - 1
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);

+ 15 - 0
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_ */

+ 27 - 1
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
  *

+ 6 - 0
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

+ 14 - 0
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);

+ 14 - 0
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;
+}

+ 44 - 5
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 = &param_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,
+				   &param->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;

+ 8 - 0
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
 }
 
 /**