Переглянути джерело

qcacmn: Update vdev rate stats when user requests for vdev stats

Rate statistics are updated at both peer and vdev level in Tx HTT
and Rx monitor path.

As per peer optimization changes, macro DP_UPDATE_EXTD_STATS is used
for aggregation of extended stats and this macro is used for both peer
and vdev stats query.
With this approach, when user requests for vdev stats, then rate stats
for vdev are updated with the rate values of the last peer present in
peer list of vdev and this results in wrong output.

In order to fix this, add an API to update the rate stats for vdev
separately.

Change-Id: I546a130e84f7fd577b80ace24e1dbb71000c0698
CRs-Fixed: 3132195
Harsh Kumar Bijlani 3 роки тому
батько
коміт
ff71f151fc
3 змінених файлів з 22 додано та 0 видалено
  1. 10 0
      dp/wifi3.0/dp_internal.h
  2. 2 0
      dp/wifi3.0/dp_main.c
  3. 10 0
      dp/wifi3.0/dp_stats.c

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

@@ -1314,6 +1314,16 @@ void dp_update_pdev_stats(struct dp_pdev *tgtobj,
  */
 void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj);
 
+/**
+ * dp_update_vdev_rate_stats() - Update the vdev rate stats
+ * @tgtobj: tgt buffer for vdev stats
+ * @srcobj: srcobj vdev stats
+ *
+ * Return: None
+ */
+void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj,
+			       struct cdp_vdev_stats *srcobj);
+
 /**
  * dp_update_pdev_ingress_stats(): Update the pdev ingress stats
  * @tgtobj: pdev handle

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

@@ -8559,6 +8559,8 @@ void dp_aggregate_vdev_stats(struct dp_vdev *vdev,
 	dp_vdev_iterate_peer(vdev, dp_update_vdev_stats, vdev_stats,
 			     DP_MOD_ID_GENERIC_STATS);
 
+	dp_update_vdev_rate_stats(vdev_stats, &vdev->stats);
+
 #if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE
 	dp_wdi_event_handler(WDI_EVENT_UPDATE_DP_STATS, vdev->pdev->soc,
 			     vdev_stats, vdev->vdev_id,

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

@@ -7725,6 +7725,16 @@ void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj)
 		tgtobj->stats.tx_i.dropped.headroom_insufficient;
 }
 
+void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj,
+			       struct cdp_vdev_stats *srcobj)
+{
+	tgtobj->tx.last_tx_rate = srcobj->tx.last_tx_rate;
+	tgtobj->tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs;
+	tgtobj->tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate;
+	tgtobj->tx.mcast_last_tx_rate_mcs = srcobj->tx.mcast_last_tx_rate_mcs;
+	tgtobj->rx.last_rx_rate = srcobj->rx.last_rx_rate;
+}
+
 void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj,
 				  struct dp_vdev *srcobj)
 {