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

qcacmn: aggregate vdev stats in to mlo ctxt at vdev detach

aggregate vdev stats in to mlo ctxt at vdev detach

Change-Id: I002e48e4b95a32a0ff58e3e1cc26ea97d94f7a5d
CRs-Fixed: 3572527
Mukul Dhiman 1 рік тому
батько
коміт
0ad05f4a1a

+ 5 - 0
dp/wifi3.0/be/dp_be.c

@@ -3005,6 +3005,11 @@ QDF_STATUS dp_mlo_dev_ctxt_vdev_attach(struct cdp_soc_t *soc_hdl,
 
 	/* ref for holding MLO ctxt in be_vdev */
 	dp_mlo_dev_get_ref(mlo_dev_ctxt, DP_MOD_ID_CHILD);
+	/* Save vdev stats in MLO dev ctx */
+	dp_update_mlo_ctxt_stats(&mlo_dev_ctxt->stats, &vdev->stats);
+
+	/* reset vdev stats to zero */
+	qdf_mem_set(&vdev->stats, sizeof(struct cdp_vdev_stats), 0);
 
 	/* unref for mlo ctxt taken at the start of this function */
 	dp_mlo_dev_ctxt_unref_delete(mlo_dev_ctxt, DP_MOD_ID_MLO_DEV);

+ 16 - 0
dp/wifi3.0/be/dp_be.h

@@ -811,6 +811,22 @@ static inline uintptr_t dp_cc_desc_find(struct dp_soc *soc,
 				spt_va_id * DP_CC_HW_READ_BYTES)));
 }
 
+/**
+ * dp_update_mlo_ctxt_stats() - aggregate stats from mlo ctx
+ * @buf: vdev stats buf
+ * @mlo_ctxt_stats: mlo ctxt stats
+ *
+ * return: void
+ */
+static inline
+void dp_update_mlo_ctxt_stats(void *buf,
+			      struct cdp_vdev_stats *mlo_ctxt_stats)
+{
+	struct cdp_vdev_stats *tgt_vdev_stats = (struct cdp_vdev_stats *)buf;
+
+	DP_UPDATE_VDEV_STATS(tgt_vdev_stats, mlo_ctxt_stats);
+}
+
 #ifdef WLAN_FEATURE_NEAR_FULL_IRQ
 /**
  * enum dp_srng_near_full_levels - SRNG Near FULL levels

+ 3 - 0
dp/wifi3.0/be/mlo/dp_mlo.c

@@ -925,6 +925,9 @@ static QDF_STATUS dp_mlo_get_mld_vdev_stats(struct cdp_soc_t *soc_hdl,
 				      DP_LINK_VDEV_ITER);
 	}
 
+	/* Aggregate vdev stats from MLO ctx for detached MLO Links */
+	dp_update_mlo_ctxt_stats(buf, &vdev_be->mlo_dev_ctxt->stats);
+
 complete:
 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
 	return ret;

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

@@ -2357,6 +2357,13 @@ void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
 		_tgtobj->rx_i.routed_eapol_pkt.bytes += \
 					_srcobj->rx_i.routed_eapol_pkt.bytes; \
 	} while (0)
+
+#define DP_UPDATE_VDEV_STATS(_tgtobj, _srcobj) \
+	do { \
+		DP_UPDATE_INGRESS_STATS(_tgtobj, _srcobj); \
+		DP_UPDATE_VDEV_STATS_FOR_UNMAPPED_PEERS(_tgtobj, _srcobj); \
+	} while (0)
+
 /**
  * dp_peer_find_attach() - Allocates memory for peer objects
  * @soc: SoC handle