ソースを参照

qcacmn: add RX statistics per lmac for MLO connection

Add RX statistics per lmac for MLO connection.

Change-Id: I72b942732cc362c1613fae637bc5e1154f9e2ec2
CRs-Fixed: 3251609
Jinwei Chen 2 年 前
コミット
64d7493b30

+ 4 - 0
dp/inc/cdp_txrx_stats_struct.h

@@ -120,6 +120,8 @@
 #define CDP_DMA_CODE_MAX 14 /* max rxdma error */
 #define CDP_REO_CODE_MAX 15 /* max reo error */
 
+#define CDP_MAX_LMACS 2 /* max lmacs */
+
 /*
  * Max of TxRx context
  */
@@ -1518,6 +1520,7 @@ struct cdp_tx_stats {
 /* struct cdp_rx_stats - rx Level Stats
  * @to_stack: Total packets sent up the stack
  * @rcvd_reo[CDP_MAX_RX_RINGS]:  Packets received on the reo ring
+ * @rx_lmac[CDP_MAX_LMACS]: Packets received on which lmac
  * @unicast: Total unicast packets
  * @multicast: Total multicast packets
  * @bcast:  Broadcast Packet Count
@@ -1605,6 +1608,7 @@ struct cdp_tx_stats {
 struct cdp_rx_stats {
 	struct cdp_pkt_info to_stack;
 	struct cdp_pkt_info rcvd_reo[CDP_MAX_RX_RINGS];
+	struct cdp_pkt_info rx_lmac[CDP_MAX_LMACS];
 	struct cdp_pkt_info unicast;
 	struct cdp_pkt_info multicast;
 	struct cdp_pkt_info bcast;

+ 17 - 0
dp/wifi3.0/be/dp_be_rx.c

@@ -129,6 +129,22 @@ dp_rx_wds_learn(struct dp_soc *soc,
 }
 #endif
 
+#if defined(DP_PKT_STATS_PER_LMAC) && defined(WLAN_FEATURE_11BE_MLO)
+static inline void
+dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata)
+{
+	uint8_t lmac_id;
+
+	lmac_id = dp_rx_peer_metadata_lmac_id_get_be(peer_mdata);
+	qdf_nbuf_set_lmac_id(nbuf, lmac_id);
+}
+#else
+static inline void
+dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata)
+{
+}
+#endif
+
 /**
  * dp_rx_process_be() - Brain of the Rx processing functionality
  *		     Called from the bottom half (tasklet/NET_RX_SOFTIRQ)
@@ -390,6 +406,7 @@ more_data:
 			dp_rx_peer_metadata_peer_id_get_be(soc, peer_mdata);
 		QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) =
 			dp_rx_peer_metadata_vdev_id_get_be(soc, peer_mdata);
+		dp_rx_set_msdu_lmac_id(rx_desc->nbuf, peer_mdata);
 
 		/* to indicate whether this msdu is rx offload */
 		pkt_capture_offload =

+ 6 - 0
dp/wifi3.0/be/dp_be_rx.h

@@ -189,6 +189,12 @@ dp_rx_peer_metadata_vdev_id_get_be(struct dp_soc *soc, uint32_t peer_metadata)
 	return metadata->vdev_id;
 }
 
+static inline uint8_t
+dp_rx_peer_metadata_lmac_id_get_be(uint32_t peer_metadata)
+{
+	return HTT_RX_PEER_META_DATA_V1_LMAC_ID_GET(peer_metadata);
+}
+
 #ifdef WLAN_FEATURE_NEAR_FULL_IRQ
 /**
  * dp_rx_nf_process() - Near Full state handler for RX rings.

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

@@ -1556,6 +1556,9 @@ void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
 		for (i = 0; i <  CDP_MAX_RX_RINGS; i++)	\
 			DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.rcvd_reo[i]); \
 									\
+		for (i = 0; i <  CDP_MAX_LMACS; i++) \
+			DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.rx_lmac[i]); \
+									\
 		_srcobj->stats.rx.unicast.num = \
 			_srcobj->stats.rx.to_stack.num - \
 					_srcobj->stats.rx.multicast.num; \
@@ -1740,6 +1743,12 @@ void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
 			_tgtobj->rx.rcvd_reo[i].bytes += \
 					_srcobj->rx.rcvd_reo[i].bytes; \
 		} \
+		for (i = 0; i < CDP_MAX_LMACS; i++) { \
+			_tgtobj->rx.rx_lmac[i].num += \
+					_srcobj->rx.rx_lmac[i].num; \
+			_tgtobj->rx.rx_lmac[i].bytes += \
+					_srcobj->rx.rx_lmac[i].bytes; \
+		} \
 		DP_UPDATE_PROTOCOL_COUNT_STATS(_tgtobj, _srcobj); \
 	} while (0)
 

+ 21 - 0
dp/wifi3.0/dp_rx.c

@@ -2246,6 +2246,26 @@ void dp_rx_msdu_extd_stats_update(struct dp_soc *soc, qdf_nbuf_t nbuf,
 }
 #endif
 
+#if defined(DP_PKT_STATS_PER_LMAC) && defined(WLAN_FEATURE_11BE_MLO)
+static inline void
+dp_peer_update_rx_pkt_per_lmac(struct dp_txrx_peer *txrx_peer,
+			       qdf_nbuf_t nbuf)
+{
+	uint8_t lmac_id = qdf_nbuf_get_lmac_id(nbuf);
+
+	/* only count stats per lmac for MLO connection*/
+	DP_PEER_PER_PKT_STATS_INCC_PKT(txrx_peer, rx.rx_lmac[lmac_id], 1,
+				       QDF_NBUF_CB_RX_PKT_LEN(nbuf),
+				       txrx_peer->mld_peer);
+}
+#else
+static inline void
+dp_peer_update_rx_pkt_per_lmac(struct dp_txrx_peer *txrx_peer,
+			       qdf_nbuf_t nbuf)
+{
+}
+#endif
+
 /**
  * dp_rx_msdu_stats_update() - update per msdu stats.
  * @soc: core txrx main context
@@ -2280,6 +2300,7 @@ void dp_rx_msdu_stats_update(struct dp_soc *soc, qdf_nbuf_t nbuf,
 	DP_PEER_PER_PKT_STATS_INCC(txrx_peer, rx.amsdu_cnt, 1, !is_not_amsdu);
 	DP_PEER_PER_PKT_STATS_INCC(txrx_peer, rx.rx_retries, 1,
 				   qdf_nbuf_is_rx_retry_flag(nbuf));
+	dp_peer_update_rx_pkt_per_lmac(txrx_peer, nbuf);
 	tid_stats->msdu_cnt++;
 	if (qdf_unlikely(qdf_nbuf_is_da_mcbc(nbuf) &&
 			 (vdev->rx_decap_type == htt_cmn_pkt_type_ethernet))) {

+ 24 - 2
dp/wifi3.0/dp_stats.c

@@ -6850,6 +6850,11 @@ void dp_print_peer_stats(struct dp_peer *peer,
 		DP_PRINT_STATS("	Bytes Received = %llu",
 			       peer_stats->rx.rcvd_reo[i].bytes);
 	}
+	for (i = 0; i < CDP_MAX_LMACS; i++)
+		DP_PRINT_STATS("Packets Received on lmac[%d] = %d ( %llu ),",
+			       i, peer_stats->rx.rx_lmac[i].num,
+			       peer_stats->rx.rx_lmac[i].bytes);
+
 	DP_PRINT_STATS("Unicast Packets Received = %d",
 		       peer_stats->rx.unicast.num);
 	DP_PRINT_STATS("Unicast Bytes Received = %llu",
@@ -7120,7 +7125,7 @@ void dp_txrx_path_stats(struct dp_soc *soc)
 		DP_PRINT_STATS("delivered %u msdus ( %llu bytes),",
 			       pdev->stats.rx.to_stack.num,
 			       pdev->stats.rx.to_stack.bytes);
-		for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
+		for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
 			if (!pdev->stats.rx.rcvd_reo[i].num)
 				continue;
 			DP_PRINT_STATS(
@@ -7128,6 +7133,10 @@ void dp_txrx_path_stats(struct dp_soc *soc)
 				       i, pdev->stats.rx.rcvd_reo[i].num,
 				       pdev->stats.rx.rcvd_reo[i].bytes);
 		}
+		for (i = 0; i < CDP_MAX_LMACS; i++)
+			DP_PRINT_STATS("received on lmac[%d] %u msdus (%llu bytes),",
+				       i, pdev->stats.rx.rx_lmac[i].num,
+				       pdev->stats.rx.rx_lmac[i].bytes);
 		DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),",
 			       pdev->stats.rx.intra_bss.pkts.num,
 			       pdev->stats.rx.intra_bss.pkts.bytes);
@@ -7467,6 +7476,8 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev)
 void
 dp_print_pdev_rx_stats(struct dp_pdev *pdev)
 {
+	uint8_t i;
+
 	DP_PRINT_STATS("PDEV Rx Stats:\n");
 	DP_PRINT_STATS("Received From HW (Per Rx Ring):");
 	DP_PRINT_STATS("	Packets = %u %u %u %u",
@@ -7479,6 +7490,10 @@ dp_print_pdev_rx_stats(struct dp_pdev *pdev)
 		       pdev->stats.rx.rcvd_reo[1].bytes,
 		       pdev->stats.rx.rcvd_reo[2].bytes,
 		       pdev->stats.rx.rcvd_reo[3].bytes);
+	for (i = 0; i < CDP_MAX_LMACS; i++)
+		DP_PRINT_STATS("Packets Received on lmac[%d] = %d (%llu)",
+			       i, pdev->stats.rx.rx_lmac[i].num,
+			       pdev->stats.rx.rx_lmac[i].bytes);
 	DP_PRINT_STATS("Replenished:");
 	DP_PRINT_STATS("	Packets = %u",
 		       pdev->stats.replenish.pkts.num);
@@ -8524,13 +8539,20 @@ void dp_update_pdev_stats(struct dp_pdev *tgtobj,
 	tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num;
 	tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes;
 
-	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
+	for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
 		tgtobj->stats.rx.rcvd_reo[i].num +=
 			srcobj->rx.rcvd_reo[i].num;
 		tgtobj->stats.rx.rcvd_reo[i].bytes +=
 			srcobj->rx.rcvd_reo[i].bytes;
 	}
 
+	for (i = 0; i < CDP_MAX_LMACS; i++) {
+		tgtobj->stats.rx.rx_lmac[i].num +=
+			srcobj->rx.rx_lmac[i].num;
+		tgtobj->stats.rx.rx_lmac[i].bytes +=
+			srcobj->rx.rx_lmac[i].bytes;
+	}
+
 	srcobj->rx.unicast.num =
 		srcobj->rx.to_stack.num -
 				(srcobj->rx.multicast.num);

+ 2 - 0
dp/wifi3.0/dp_types.h

@@ -3732,6 +3732,7 @@ struct dp_peer_extd_tx_stats {
 /**
  * struct dp_peer_per_pkt_rx_stats - Peer Rx stats updated in per pkt Rx path
  * @rcvd_reo[CDP_MAX_RX_RINGS]: Packets received on the reo ring
+ * @rx_lmac[CDP_MAX_LMACS]: Packets received on each lmac
  * @unicast: Total unicast packets
  * @multicast: Total multicast packets
  * @bcast:  Broadcast Packet Count
@@ -3760,6 +3761,7 @@ struct dp_peer_extd_tx_stats {
  */
 struct dp_peer_per_pkt_rx_stats {
 	struct cdp_pkt_info rcvd_reo[CDP_MAX_RX_RINGS];
+	struct cdp_pkt_info rx_lmac[CDP_MAX_LMACS];
 	struct cdp_pkt_info unicast;
 	struct cdp_pkt_info multicast;
 	struct cdp_pkt_info bcast;

+ 24 - 1
qdf/inc/i_qdf_nbuf_api_m.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2014-2017,2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 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
@@ -131,6 +131,29 @@ static inline uint8_t qdf_nbuf_is_exc_frame(qdf_nbuf_t buf)
 	return QDF_NBUF_CB_RX_PACKET_EXC_FRAME(buf);
 }
 
+/**
+ * qdf_nbuf_set_lmac_id() - set lmac ID
+ * @buf: Network buffer
+ * @value: lmac ID value
+ *
+ * Return: none
+ */
+static inline void qdf_nbuf_set_lmac_id(qdf_nbuf_t buf, uint8_t value)
+{
+	QDF_NBUF_CB_RX_PACKET_LMAC_ID(buf) = value;
+}
+
+/**
+ * qdf_nbuf_get_lmac_id() - get lmac ID of RX packet
+ * @buf: Network buffer
+ *
+ * Return: lmac ID value
+ */
+static inline uint8_t qdf_nbuf_get_lmac_id(qdf_nbuf_t buf)
+{
+	return QDF_NBUF_CB_RX_PACKET_LMAC_ID(buf);
+}
+
 /**
  * qdf_nbuf_set_rx_ipa_smmu_map() - set ipa smmu mapped flag
  * @buf: Network buffer

+ 10 - 1
qdf/inc/i_qdf_nbuf_api_w.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2014-2017,2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 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
@@ -210,4 +210,13 @@ static inline uint8_t qdf_nbuf_tx_notify_comp_get(qdf_nbuf_t buf)
 	return 0;
 }
 
+static inline void qdf_nbuf_set_lmac_id(qdf_nbuf_t buf, uint8_t value)
+{
+}
+
+static inline uint8_t qdf_nbuf_get_lmac_id(qdf_nbuf_t buf)
+{
+	return 0;
+}
+
 #endif /* _QDF_NBUF_W_H */

+ 2 - 1
qdf/linux/src/i_qdf_nbuf.h

@@ -136,6 +136,7 @@ typedef union {
  * @rx.dev.priv_cb_m.ipa_smmu_map: do IPA smmu map
  * @rx.dev.priv_cb_m.reo_dest_ind_or_sw_excpt: reo destination indication or
 					     sw execption bit from ring desc
+ * @rx.dev.priv_cb_m.lmac_id: lmac id for RX packet
  * @rx.dev.priv_cb_m.tcp_seq_num: TCP sequence number
  * @rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number
  * @rx.dev.priv_cb_m.lro_ctx: LRO context
@@ -259,7 +260,7 @@ struct qdf_nbuf_cb {
 						 exc_frm:1,
 						 ipa_smmu_map:1,
 						 reo_dest_ind_or_sw_excpt:5,
-						 reserved:2,
+						 lmac_id:2,
 						 reserved1:16;
 					uint32_t tcp_seq_num;
 					uint32_t tcp_ack_num;

+ 4 - 0
qdf/linux/src/i_qdf_nbuf_m.h

@@ -89,6 +89,10 @@
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
 	reo_dest_ind_or_sw_excpt)
 
+#define  QDF_NBUF_CB_RX_PACKET_LMAC_ID(skb) \
+	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
+	lmac_id)
+
 #define __qdf_nbuf_ipa_owned_get(skb) \
 	QDF_NBUF_CB_TX_IPA_OWNED(skb)