Procházet zdrojové kódy

qcacmn: Accumulate tx and rx airtime consumption stats separately

Accumulate tx and rx airtime consumption stats separately.

Change-Id: I1196ec83d94f73ee35a77a935d5820783e239154
CRs-Fixed: 3388165
Himanshu Batra před 2 roky
rodič
revize
87cf6b8b07

+ 30 - 0
dp/inc/cdp_txrx_mon.h

@@ -274,4 +274,34 @@ cdp_set_params_rssi_dbm_conversion(ol_txrx_soc_handle soc,
 							    (soc, params);
 }
 #endif
+
+#ifdef WLAN_TELEMETRY_STATS_SUPPORT
+/*
+ * cdp_update_pdev_mon_telemetry_airtime_stats() - update telemetry airtime
+ * stats in monitor pdev
+ *
+ *@soc: dp soc handle
+ *@pdev_id: pdev id
+ *
+ * This API is used to update telemetry airtime stats in monitor pdev
+ *
+ * Return: Success if stats are updated, else failure
+ */
+static inline QDF_STATUS
+cdp_update_pdev_mon_telemetry_airtime_stats(ol_txrx_soc_handle soc,
+					    uint8_t pdev_id)
+{
+	if (!soc || !soc->ops) {
+		dp_cdp_debug("Invalid Instance");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (!soc->ops->mon_ops ||
+	    !soc->ops->mon_ops->txrx_update_pdev_mon_telemetry_airtime_stats)
+		return QDF_STATUS_E_FAILURE;
+
+	return soc->ops->mon_ops->txrx_update_pdev_mon_telemetry_airtime_stats(
+						soc, pdev_id);
+}
+#endif
 #endif

+ 9 - 0
dp/inc/cdp_txrx_ops.h

@@ -972,6 +972,8 @@ struct cdp_me_ops {
  * @config_full_mon_mode: configure full monitor mode
  * @txrx_enable_mon_reap_timer: Enable/Disable reap timer of monitor status ring
  * @txrx_get_lite_mon_legacy_feature_enabled: returns the legacy filter enabled
+ * @txrx_update_pdev_mon_telemetry_airtime_stats: update telemetry airtime
+ * stats in monitor pdev
  */
 struct cdp_mon_ops {
 
@@ -1047,6 +1049,13 @@ struct cdp_mon_ops {
 	QDF_STATUS (*txrx_set_mon_pdev_params_rssi_dbm_conv)
 		(struct cdp_soc_t *soc,
 		 struct cdp_rssi_db2dbm_param_dp *params);
+
+#ifdef WLAN_TELEMETRY_STATS_SUPPORT
+	/*To update telemetry airtime stats in monitor pdev */
+	QDF_STATUS (*txrx_update_pdev_mon_telemetry_airtime_stats)
+		(struct cdp_soc_t *soc,
+		 uint8_t pdev_id);
+#endif
 };
 
 struct cdp_host_stats_ops {

+ 4 - 2
dp/inc/cdp_txrx_stats_struct.h

@@ -2841,7 +2841,8 @@ struct cdp_pdev_telemetry_stats {
  * @tx_mpdu_total: Total tx mpdus
  * @rx_mpdu_retried: Rx mpdus retried
  * @rx_mpdu_total: Total rx mpdus
- * @airtime_consumption: airtime consumption of that peer
+ * @tx_airtime_consumption: tx airtime consumption of that peer
+ * @rx_airtime_consumption: rx airtime consumption of that peer
  * @snr: peer average snr
  */
 struct cdp_peer_telemetry_stats {
@@ -2849,7 +2850,8 @@ struct cdp_peer_telemetry_stats {
 	uint32_t tx_mpdu_total;
 	uint32_t rx_mpdu_retried;
 	uint32_t rx_mpdu_total;
-	uint8_t airtime_consumption[WME_AC_MAX];
+	uint16_t tx_airtime_consumption[WME_AC_MAX];
+	uint16_t rx_airtime_consumption[WME_AC_MAX];
 	uint8_t snr;
 };
 #endif

+ 4 - 0
dp/wifi3.0/monitor/2.0/dp_mon_2.0.c

@@ -1565,6 +1565,10 @@ struct cdp_mon_ops dp_ops_mon_2_0 = {
 #endif
 	.txrx_set_mon_pdev_params_rssi_dbm_conv =
 				dp_mon_pdev_params_rssi_dbm_conv,
+#ifdef WLAN_TELEMETRY_STATS_SUPPORT
+	.txrx_update_pdev_mon_telemetry_airtime_stats =
+			dp_pdev_update_telemetry_airtime_stats,
+#endif
 };
 
 #ifdef QCA_MONITOR_OPS_PER_SOC_SUPPORT

+ 40 - 22
dp/wifi3.0/monitor/dp_mon.c

@@ -2276,7 +2276,7 @@ QDF_STATUS dp_rx_populate_cbf_hdr(struct dp_soc *soc,
 #ifdef ATH_SUPPORT_EXT_STAT
 #ifdef WLAN_TELEMETRY_STATS_SUPPORT
 /**
- * dp_pdev_clear_link_airtime_stats() - clear pdev airtime stats for given peer
+ * dp_pdev_clear_link_airtime_stats() - clear airtime stats for given pdev
  * @pdev: DP PDEV handle
  */
 static inline
@@ -2290,15 +2290,20 @@ void dp_pdev_clear_link_airtime_stats(struct dp_pdev *pdev)
 
 /**
  * dp_peer_update_telemetry_stats() - update peer telemetry stats
+ * @soc: Datapath soc
  * @peer: Datapath peer
+ * @arg: argument to callback function
  */
 static inline
-void dp_peer_update_telemetry_stats(struct dp_peer *peer)
+void dp_peer_update_telemetry_stats(struct dp_soc *soc,
+				    struct dp_peer *peer,
+				    void *arg)
 {
 	struct dp_pdev *pdev;
 	struct dp_vdev *vdev;
 	struct dp_mon_peer *mon_peer = NULL;
 	uint8_t ac;
+	uint64_t current_time = qdf_get_log_timestamp();
 
 	vdev = peer->vdev;
 	if (!vdev)
@@ -2311,8 +2316,13 @@ void dp_peer_update_telemetry_stats(struct dp_peer *peer)
 	mon_peer = peer->monitor_peer;
 	if (qdf_likely(mon_peer)) {
 		for (ac = 0; ac < WME_AC_MAX; ac++) {
-			mon_peer->stats.airtime_consumption[ac].avg_consumption_per_sec =
-					mon_peer->stats.airtime_consumption[ac].consumption;
+			mon_peer->stats.airtime_stats.tx_airtime_consumption[ac].avg_consumption_per_sec =
+				(uint8_t)qdf_do_div((uint64_t)(mon_peer->stats.airtime_stats.tx_airtime_consumption[ac].consumption * 100),
+						    (uint32_t)(current_time - mon_peer->stats.airtime_stats.last_update_time));
+			mon_peer->stats.airtime_stats.rx_airtime_consumption[ac].avg_consumption_per_sec =
+				(uint8_t)qdf_do_div((uint64_t)(mon_peer->stats.airtime_stats.rx_airtime_consumption[ac].consumption * 100),
+						    (uint32_t)(current_time - mon_peer->stats.airtime_stats.last_update_time));
+			mon_peer->stats.airtime_stats.last_update_time = current_time;
 			/* Store each peer airtime consumption in pdev
 			 * link_airtime to calculate pdev's total airtime
 			 * consumption
@@ -2320,19 +2330,35 @@ void dp_peer_update_telemetry_stats(struct dp_peer *peer)
 			DP_STATS_INC(
 				pdev,
 				telemetry_stats.link_airtime[ac],
-				mon_peer->stats.airtime_consumption[ac].consumption);
-			mon_peer->stats.airtime_consumption[ac].consumption = 0;
+				mon_peer->stats.airtime_stats.tx_airtime_consumption[ac].consumption);
+			DP_STATS_INC(
+				pdev,
+				telemetry_stats.link_airtime[ac],
+				mon_peer->stats.airtime_stats.rx_airtime_consumption[ac].consumption);
+			mon_peer->stats.airtime_stats.tx_airtime_consumption[ac].consumption = 0;
+			mon_peer->stats.airtime_stats.rx_airtime_consumption[ac].consumption = 0;
 		}
 	}
 }
-#else
-static inline
-void dp_pdev_clear_link_airtime_stats(struct dp_pdev *pdev)
-{ }
 
-static inline
-void dp_peer_update_telemetry_stats(struct dp_peer *peer)
-{ }
+QDF_STATUS dp_pdev_update_telemetry_airtime_stats(struct cdp_soc_t *soc,
+						  uint8_t pdev_id)
+{
+	struct dp_pdev *pdev =
+		dp_get_pdev_from_soc_pdev_id_wifi3(cdp_soc_t_to_dp_soc(soc),
+						   pdev_id);
+	if (!pdev)
+		return QDF_STATUS_E_FAILURE;
+
+	/* Clear current airtime stats as the below API will increment the stats
+	 * for all peers on top of current value
+	 */
+	dp_pdev_clear_link_airtime_stats(pdev);
+	dp_pdev_iterate_peer(pdev, dp_peer_update_telemetry_stats, NULL,
+			     DP_MOD_ID_CDP);
+
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 
 /**
@@ -2351,8 +2377,6 @@ dp_peer_cal_clients_stats_update(struct dp_soc *soc,
 	struct dp_peer *tgt_peer = NULL;
 	struct dp_txrx_peer *txrx_peer = NULL;
 
-	dp_peer_update_telemetry_stats(peer);
-
 	if (!dp_peer_is_primary_link_peer(peer))
 		return;
 
@@ -2381,8 +2405,6 @@ dp_peer_cal_clients_stats_update(struct dp_soc *soc,
 	struct dp_peer *tgt_peer = NULL;
 	struct dp_txrx_peer *txrx_peer = NULL;
 
-	dp_peer_update_telemetry_stats(peer);
-
 	if (!dp_peer_is_primary_link_peer(peer))
 		return;
 
@@ -2410,10 +2432,6 @@ static void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl)
 {
 	struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl;
 
-	/* Clear current airtime stats as the below API will increment the stats
-	 * for all peers on top of current value
-	 */
-	dp_pdev_clear_link_airtime_stats(pdev);
 	dp_pdev_iterate_peer(pdev, dp_peer_cal_clients_stats_update, NULL,
 			     DP_MOD_ID_CDP);
 }
@@ -4368,7 +4386,7 @@ void dp_ppdu_desc_user_airtime_consumption_update(
 		return;
 
 	ac = TID_TO_WME_AC(user->tid);
-	DP_STATS_INC(mon_peer, airtime_consumption[ac].consumption,
+	DP_STATS_INC(mon_peer, airtime_stats.tx_airtime_consumption[ac].consumption,
 		     user->phy_tx_time_us);
 }
 #else

+ 36 - 9
dp/wifi3.0/monitor/dp_mon.h

@@ -897,7 +897,19 @@ struct dp_mon_soc {
 #ifdef WLAN_TELEMETRY_STATS_SUPPORT
 struct dp_mon_peer_airtime_consumption {
 	uint32_t consumption;
-	uint32_t avg_consumption_per_sec;
+	uint16_t avg_consumption_per_sec;
+};
+
+/**
+ * struct dp_mon_peer_airtime_stats - Monitor peer airtime stats
+ * @tx_airtime_consumption: tx artime consumption of peer
+ * @rx_airtime_consumption: rx airtime consumption of peer
+ * @last_update_time: Time when last avergae of airtime is done
+ */
+struct dp_mon_peer_airtime_stats {
+	struct dp_mon_peer_airtime_consumption tx_airtime_consumption[WME_AC_MAX];
+	struct dp_mon_peer_airtime_consumption rx_airtime_consumption[WME_AC_MAX];
+	uint64_t last_update_time;
 };
 #endif
 
@@ -905,14 +917,14 @@ struct dp_mon_peer_airtime_consumption {
  * struct dp_mon_peer_stats - Monitor peer stats
  * @tx: tx stats
  * @rx: rx stats
- * @airtime_consumption: airtime consumption per access category
+ * @airtime_stats: mon peer airtime stats
  */
 struct dp_mon_peer_stats {
 #ifdef QCA_ENHANCED_STATS_SUPPORT
 	dp_mon_peer_tx_stats tx;
 	dp_mon_peer_rx_stats rx;
 #ifdef WLAN_TELEMETRY_STATS_SUPPORT
-	struct dp_mon_peer_airtime_consumption airtime_consumption[WME_AC_MAX];
+	struct dp_mon_peer_airtime_stats airtime_stats;
 #endif
 #endif
 };
@@ -4415,12 +4427,10 @@ void dp_monitor_peer_telemetry_stats(struct dp_peer *peer,
 
 	mon_peer_stats = &peer->monitor_peer->stats;
 	for (ac = 0; ac < WME_AC_MAX; ac++) {
-		/* consumption is in micro seconds, convert it to seconds and
-		 * then calculate %age per sec
-		 */
-		stats->airtime_consumption[ac] =
-			((mon_peer_stats->airtime_consumption[ac].avg_consumption_per_sec * 100) /
-			(1000000));
+		stats->tx_airtime_consumption[ac] =
+			mon_peer_stats->airtime_stats.tx_airtime_consumption[ac].avg_consumption_per_sec;
+		stats->rx_airtime_consumption[ac] =
+			mon_peer_stats->airtime_stats.rx_airtime_consumption[ac].avg_consumption_per_sec;
 	}
 	stats->tx_mpdu_retried = mon_peer_stats->tx.retries;
 	stats->tx_mpdu_total = mon_peer_stats->tx.tx_mpdus_tried;
@@ -4500,4 +4510,21 @@ dp_mon_rx_print_advanced_stats(struct dp_soc *soc,
 	}
 	return monitor_ops->mon_rx_print_advanced_stats(soc, pdev);
 }
+
+#ifdef WLAN_TELEMETRY_STATS_SUPPORT
+/*
+ * dp_update_pdev_mon_telemetry_airtime_stats() - update telemetry airtime
+ * stats in monitor pdev
+ *
+ *@soc: dp soc handle
+ *@pdev_id: pdev id
+ *
+ * This API is used to update telemetry airtime stats in monitor pdev
+ *
+ * Return: Success if stats are updated, else failure
+ */
+
+QDF_STATUS dp_pdev_update_telemetry_airtime_stats(struct cdp_soc_t *soc,
+						  uint8_t pdev_id);
+#endif
 #endif /* _DP_MON_H_ */

+ 1 - 1
dp/wifi3.0/monitor/dp_rx_mon.c

@@ -840,7 +840,7 @@ dp_ppdu_desc_user_rx_time_update(struct dp_pdev *pdev,
 		return;
 
 	ac = TID_TO_WME_AC(user->tid);
-	DP_STATS_INC(mon_peer, airtime_consumption[ac].consumption,
+	DP_STATS_INC(mon_peer, airtime_stats.rx_airtime_consumption[ac].consumption,
 		     user->rx_time_us);
 }
 #else