Jelajahi Sumber

qcacmn: Extract meta data from dbr event

Extract meta data from the dbr wmi event.

CRs-Fixed: 2219818
Change-Id: Ib19588775060e75017e9777206132a0efeec6223
Edayilliam Jayadev 7 tahun lalu
induk
melakukan
3d32949b42

+ 6 - 0
target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h

@@ -43,6 +43,8 @@
 #define direct_buf_rx_exit() \
 		direct_buf_rx_logfl(QDF_TRACE_LEVEL_DEBUG, "exit")
 
+#define DBR_MAX_CHAINS      (8)
+
 struct wlan_objmgr_psoc;
 struct wlan_lmac_if_tx_ops;
 
@@ -50,10 +52,14 @@ struct wlan_lmac_if_tx_ops;
  * struct direct_buf_rx_data - direct buffer rx data
  * @dbr_len: Length of the buffer DMAed
  * @vaddr: Virtual address of the buffer that has DMAed data
+ * @meta_data_valid: Indicates that metadata is valid
+ * @meta_data: Meta data
  */
 struct direct_buf_rx_data {
 	size_t dbr_len;
 	void *vaddr;
+	bool meta_data_valid;
+	struct direct_buf_rx_metadata meta_data;
 };
 
 /**

+ 1 - 0
target_if/direct_buf_rx/src/target_if_direct_buf_rx_api.c

@@ -17,6 +17,7 @@
  */
 
 #include <qdf_status.h>
+#include <wmi_unified_api.h>
 #include <target_if_direct_buf_rx_api.h>
 #include <wlan_objmgr_cmn.h>
 #include <wlan_objmgr_global_obj.h>

+ 15 - 0
target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c

@@ -832,6 +832,13 @@ static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn,
 	dbr_rsp.dbr_entries = qdf_mem_malloc(dbr_rsp.num_buf_release_entry *
 					sizeof(struct direct_buf_rx_entry));
 
+	if (dbr_rsp.num_meta_data_entry > dbr_rsp.num_buf_release_entry) {
+		direct_buf_rx_err("More than expected number of metadata");
+		wlan_objmgr_pdev_release_ref(pdev,
+					     WLAN_DIRECT_BUF_RX_ID);
+		return QDF_STATUS_E_FAILURE;
+	}
+
 	for (i = 0; i < dbr_rsp.num_buf_release_entry; i++) {
 		if (wmi_extract_dbr_buf_release_entry(
 			GET_WMI_HDL_FROM_PSOC(psoc), data_buf, i,
@@ -851,6 +858,14 @@ static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn,
 						     WLAN_DIRECT_BUF_RX_ID);
 			return QDF_STATUS_E_FAILURE;
 		}
+
+		dbr_data.meta_data_valid = false;
+		if (i < dbr_rsp.num_meta_data_entry) {
+			if (wmi_extract_dbr_buf_metadata(
+				GET_WMI_HDL_FROM_PSOC(psoc), data_buf, i,
+				&dbr_data.meta_data) == QDF_STATUS_SUCCESS)
+				dbr_data.meta_data_valid = true;
+		}
 		ret = mod_param->dbr_rsp_handler(pdev, &dbr_data);
 		status = target_if_dbr_replenish_ring(pdev, mod_param,
 						      dbr_data.vaddr, cookie);

+ 16 - 0
wmi/inc/wmi_unified_api.h

@@ -1830,6 +1830,22 @@ QDF_STATUS wmi_extract_dbr_buf_release_entry(
 			void *wmi_hdl,
 			uint8_t *evt_buf, uint8_t idx,
 			struct direct_buf_rx_entry *param);
+
+/**
+ * wmi_extract_dbr_buf_metadata: Extract direct buffer metadata
+ *
+ * @wmi_hdl: WMI handle
+ * @evt_buf: Event buffer
+ * @idx: Index of the module for which capability is received
+ * @param: Pointer to direct buffer metadata
+ *
+ * Return: QDF status of operation
+ */
+QDF_STATUS wmi_extract_dbr_buf_metadata(
+			void *wmi_hdl,
+			uint8_t *evt_buf, uint8_t idx,
+			struct direct_buf_rx_metadata *param);
+
 QDF_STATUS wmi_extract_pdev_utf_event(void *wmi_hdl,
 				      uint8_t *evt_buf,
 				      struct wmi_host_pdev_utf_event *param);

+ 10 - 0
wmi/inc/wmi_unified_param.h

@@ -8160,6 +8160,15 @@ struct wdsentry {
 #define WMI_HOST_DBR_DATA_ADDR_HI_HOST_DATA_SET(dword, val) \
 		WMI_HOST_F_RMW(dword, val, WMI_HOST_DBR_DATA_ADDR_HI_HOST_DATA)
 
+/**
+ * struct direct_buf_rx_metadata: direct buffer metadata
+ *
+ * @noisefloor: noisefloor
+ */
+struct direct_buf_rx_metadata {
+	int32_t noisefloor[WMI_HOST_MAX_NUM_CHAINS];
+};
+
 /**
  * struct direct_buf_rx_entry: direct buffer rx release entry structure
  *
@@ -8185,6 +8194,7 @@ struct direct_buf_rx_rsp {
 	uint32_t pdev_id;
 	uint32_t mod_id;
 	uint32_t num_buf_release_entry;
+	uint32_t num_meta_data_entry;
 	struct direct_buf_rx_entry *dbr_entries;
 };
 

+ 5 - 0
wmi/inc/wmi_unified_priv.h

@@ -1425,6 +1425,11 @@ QDF_STATUS (*extract_dbr_buf_release_entry)(
 			uint8_t *evt_buf, uint8_t idx,
 			struct direct_buf_rx_entry *param);
 
+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_pdev_utf_event)(wmi_unified_t wmi_hdl,
 				     uint8_t *evt_buf,
 				     struct wmi_host_pdev_utf_event *param);

+ 15 - 0
wmi/src/wmi_unified_api.c

@@ -6907,6 +6907,21 @@ QDF_STATUS wmi_extract_dbr_buf_release_entry(
 	return QDF_STATUS_E_FAILURE;
 }
 
+QDF_STATUS wmi_extract_dbr_buf_metadata(
+			void *wmi_hdl,
+			uint8_t *evt_buf, uint8_t idx,
+			struct direct_buf_rx_metadata *param)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl;
+
+	if (wmi_handle->ops->extract_dbr_buf_metadata)
+		return wmi_handle->ops->extract_dbr_buf_metadata(
+				wmi_handle,
+				evt_buf, idx, param);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
 /**
  * wmi_extract_pdev_utf_event() -
  *       extract UTF data from pdev utf event

+ 25 - 0
wmi/src/wmi_unified_tlv.c

@@ -20070,6 +20070,7 @@ static QDF_STATUS extract_dbr_buf_release_fixed_tlv(wmi_unified_t wmi_handle,
 								ev->pdev_id);
 	param->mod_id = ev->mod_id;
 	param->num_buf_release_entry = ev->num_buf_release_entry;
+	param->num_meta_data_entry = ev->num_meta_data_entry;
 	WMI_LOGD("%s:pdev id %d mod id %d num buf release entry %d\n", __func__,
 		 param->pdev_id, param->mod_id, param->num_buf_release_entry);
 
@@ -20101,6 +20102,29 @@ static QDF_STATUS extract_dbr_buf_release_entry_tlv(wmi_unified_t wmi_handle,
 	return QDF_STATUS_SUCCESS;
 }
 
+static QDF_STATUS extract_dbr_buf_metadata_tlv(
+		wmi_unified_t wmi_handle, uint8_t *event,
+		uint8_t idx, struct direct_buf_rx_metadata *param)
+{
+	WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
+	wmi_dma_buf_release_spectral_meta_data *entry;
+
+	param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
+	if (!param_buf)
+		return QDF_STATUS_E_INVAL;
+
+	entry = &param_buf->meta_data[idx];
+
+	if (!entry) {
+		WMI_LOGE("%s: Entry is NULL\n", __func__);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	qdf_mem_copy(param->noisefloor, entry->noise_floor,
+		     sizeof(entry->noise_floor));
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * extract_dcs_interference_type_tlv() - extract dcs interference type
  * from event
@@ -22730,6 +22754,7 @@ struct wmi_ops tlv_ops =  {
 				extract_dbr_ring_cap_service_ready_ext_tlv,
 	.extract_dbr_buf_release_fixed = extract_dbr_buf_release_fixed_tlv,
 	.extract_dbr_buf_release_entry = extract_dbr_buf_release_entry_tlv,
+	.extract_dbr_buf_metadata = extract_dbr_buf_metadata_tlv,
 	.extract_pdev_utf_event = extract_pdev_utf_event_tlv,
 	.wmi_set_htc_tx_tag = wmi_set_htc_tx_tag_tlv,
 	.extract_dcs_interference_type = extract_dcs_interference_type_tlv,