瀏覽代碼

qcacmn: Get deterministic stats from DP mon_peer

Add cdp layer API to get stats and
Copy peer deterministic stats from dp_mon_peer to cdp structure

CRs-Fixed: 3380939
Change-Id: Ic90b9c9f5c7463ad0d5b7c2bb7a371e4d4fef070
aloksing 2 年之前
父節點
當前提交
444c6f16aa

+ 28 - 1
dp/inc/cdp_txrx_host_stats.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-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
@@ -1034,6 +1034,33 @@ static inline QDF_STATUS cdp_get_peer_telemetry_stats(
 	return soc->ops->host_stats_ops->txrx_peer_telemetry_stats(
 					soc, addr, stats);
 }
+
+/**
+ * cdp_get_peer_deter_stats(): function to get peer deterministic stats
+ * @soc: soc handle
+ * @addr: peer address
+ * @stats: pointer to peer telemetry stats
+ *
+ * return: status
+ */
+static inline QDF_STATUS cdp_get_peer_deter_stats(
+				ol_txrx_soc_handle soc,
+				uint8_t *addr,
+				struct cdp_peer_deter_stats *stats)
+{
+	if (!soc || !soc->ops) {
+		dp_cdp_debug("Invalid Instance");
+		QDF_BUG(0);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (!soc->ops->host_stats_ops ||
+	    !soc->ops->host_stats_ops->txrx_peer_deter_stats)
+		return QDF_STATUS_E_FAILURE;
+
+	return soc->ops->host_stats_ops->txrx_peer_deter_stats(
+					soc, addr, stats);
+}
 #endif
 
 /**

+ 5 - 0
dp/inc/cdp_txrx_ops.h

@@ -1244,6 +1244,11 @@ struct cdp_host_stats_ops {
 				struct cdp_soc_t *soc,
 				uint8_t *addr,
 				struct cdp_peer_telemetry_stats *stats);
+	QDF_STATUS
+		(*txrx_peer_deter_stats)(
+				struct cdp_soc_t *soc,
+				uint8_t *addr,
+				struct cdp_peer_deter_stats *stats);
 #endif
 	QDF_STATUS
 		(*txrx_get_peer_extd_rate_link_stats)

+ 12 - 0
dp/inc/cdp_txrx_stats_struct.h

@@ -2947,6 +2947,18 @@ struct cdp_peer_rx_deter {
 	uint64_t avg_rate;
 	uint32_t mode_cnt;
 };
+
+/**
+ * struct cdp_peer_deter_stats- Structure to hold peer deterministic stats
+ * @dl_det: TX DL deterministic stats
+ * @ul_det: TX UL deterministic stats
+ * @rx_det: RX deterministic stats
+ */
+struct cdp_peer_deter_stats {
+	struct cdp_peer_tx_dl_deter dl_det[MSDUQ_INDEX_MAX][TX_MODE_DL_MAX];
+	struct cdp_peer_tx_ul_deter ul_det[TX_MODE_UL_MAX];
+	struct cdp_peer_rx_deter rx_det;
+};
 #endif
 
 /* struct cdp_pdev_stats - pdev stats

+ 19 - 0
dp/wifi3.0/dp_internal.h

@@ -966,6 +966,12 @@ void dp_monitor_peer_telemetry_stats(struct dp_peer *peer,
 				     struct cdp_peer_telemetry_stats *stats)
 {
 }
+
+static inline
+void dp_monitor_peer_deter_stats(struct dp_peer *peer,
+				 struct cdp_peer_telemetry_stats *stats)
+{
+}
 #endif /* WLAN_TELEMETRY_STATS_SUPPORT */
 #endif /* !WIFI_MONITOR_SUPPORT */
 
@@ -4221,6 +4227,19 @@ dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
 QDF_STATUS
 dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
 			    struct cdp_peer_telemetry_stats *stats);
+
+/*
+ * dp_get_peer_deter_stats- API to get peer deterministic stats
+ * @soc_hdl: soc handle
+ * @addr: peer mac
+ * @stats: pointer to peer deterministic stats
+ *
+ * Return: QDF_STATUS_SUCCESS: Success
+ *         QDF_STATUS_E_FAILURE: Error
+ */
+QDF_STATUS
+dp_get_peer_deter_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
+			struct cdp_peer_deter_stats *stats);
 #endif /* WLAN_TELEMETRY_STATS_SUPPORT */
 
 #ifdef CONNECTIVITY_PKTLOG

+ 1 - 0
dp/wifi3.0/dp_main.c

@@ -14202,6 +14202,7 @@ static struct cdp_host_stats_ops dp_ops_host_stats = {
 #ifdef WLAN_TELEMETRY_STATS_SUPPORT
 	.txrx_pdev_telemetry_stats = dp_get_pdev_telemetry_stats,
 	.txrx_peer_telemetry_stats = dp_get_peer_telemetry_stats,
+	.txrx_peer_deter_stats = dp_get_peer_deter_stats,
 #endif
 	.txrx_get_peer_extd_rate_link_stats =
 					dp_get_peer_extd_rate_link_stats,

+ 17 - 0
dp/wifi3.0/dp_stats.c

@@ -9286,4 +9286,21 @@ dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
 
 	return QDF_STATUS_SUCCESS;
 }
+
+QDF_STATUS
+dp_get_peer_deter_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
+			struct cdp_peer_deter_stats *stats)
+{
+	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
+	struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, DP_VDEV_ALL,
+						      DP_MOD_ID_MISC);
+
+	if (!peer)
+		return QDF_STATUS_E_FAILURE;
+
+	dp_monitor_peer_deter_stats(peer, stats);
+	dp_peer_unref_delete(peer, DP_MOD_ID_MISC);
+
+	return QDF_STATUS_SUCCESS;
+}
 #endif

+ 15 - 0
dp/wifi3.0/monitor/dp_mon.h

@@ -4452,6 +4452,21 @@ void dp_monitor_peer_telemetry_stats(struct dp_peer *peer,
 	stats->rx_mpdu_total = mon_peer_stats->rx.rx_mpdus;
 	stats->snr = CDP_SNR_OUT(mon_peer_stats->rx.avg_snr);
 }
+
+static inline
+void dp_monitor_peer_deter_stats(struct dp_peer *peer,
+				 struct cdp_peer_deter_stats *stats)
+{
+	struct dp_mon_peer_stats *mon_peer_stats = NULL;
+	struct dp_mon_peer_deterministic *deter_stats;
+
+	if (qdf_unlikely(!peer->monitor_peer))
+		return;
+
+	mon_peer_stats = &peer->monitor_peer->stats;
+	deter_stats = mon_peer_stats->deter_stats;
+	qdf_mem_copy(stats, deter_stats, sizeof(*stats) * CDP_DATA_TID_MAX);
+}
 #endif
 
 /**