qcacmn: add RX statistics per lmac for MLO connection

Add RX statistics per lmac for MLO connection.

Change-Id: I72b942732cc362c1613fae637bc5e1154f9e2ec2
CRs-Fixed: 3251609
This commit is contained in:
Jinwei Chen
2022-07-23 04:38:01 -07:00
committed by Madan Koyyalamudi
parent 6c419dc094
commit 64d7493b30
11 changed files with 123 additions and 5 deletions

View File

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

View File

@@ -129,6 +129,22 @@ dp_rx_wds_learn(struct dp_soc *soc,
} }
#endif #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 * dp_rx_process_be() - Brain of the Rx processing functionality
* Called from the bottom half (tasklet/NET_RX_SOFTIRQ) * 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); dp_rx_peer_metadata_peer_id_get_be(soc, peer_mdata);
QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) = QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) =
dp_rx_peer_metadata_vdev_id_get_be(soc, peer_mdata); 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 */ /* to indicate whether this msdu is rx offload */
pkt_capture_offload = pkt_capture_offload =

View File

@@ -189,6 +189,12 @@ dp_rx_peer_metadata_vdev_id_get_be(struct dp_soc *soc, uint32_t peer_metadata)
return metadata->vdev_id; 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 #ifdef WLAN_FEATURE_NEAR_FULL_IRQ
/** /**
* dp_rx_nf_process() - Near Full state handler for RX rings. * dp_rx_nf_process() - Near Full state handler for RX rings.

View File

@@ -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++) \ for (i = 0; i < CDP_MAX_RX_RINGS; i++) \
DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.rcvd_reo[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.unicast.num = \
_srcobj->stats.rx.to_stack.num - \ _srcobj->stats.rx.to_stack.num - \
_srcobj->stats.rx.multicast.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 += \ _tgtobj->rx.rcvd_reo[i].bytes += \
_srcobj->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); \ DP_UPDATE_PROTOCOL_COUNT_STATS(_tgtobj, _srcobj); \
} while (0) } while (0)

View File

@@ -2246,6 +2246,26 @@ void dp_rx_msdu_extd_stats_update(struct dp_soc *soc, qdf_nbuf_t nbuf,
} }
#endif #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. * dp_rx_msdu_stats_update() - update per msdu stats.
* @soc: core txrx main context * @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.amsdu_cnt, 1, !is_not_amsdu);
DP_PEER_PER_PKT_STATS_INCC(txrx_peer, rx.rx_retries, 1, DP_PEER_PER_PKT_STATS_INCC(txrx_peer, rx.rx_retries, 1,
qdf_nbuf_is_rx_retry_flag(nbuf)); qdf_nbuf_is_rx_retry_flag(nbuf));
dp_peer_update_rx_pkt_per_lmac(txrx_peer, nbuf);
tid_stats->msdu_cnt++; tid_stats->msdu_cnt++;
if (qdf_unlikely(qdf_nbuf_is_da_mcbc(nbuf) && if (qdf_unlikely(qdf_nbuf_is_da_mcbc(nbuf) &&
(vdev->rx_decap_type == htt_cmn_pkt_type_ethernet))) { (vdev->rx_decap_type == htt_cmn_pkt_type_ethernet))) {

View File

@@ -6850,6 +6850,11 @@ void dp_print_peer_stats(struct dp_peer *peer,
DP_PRINT_STATS(" Bytes Received = %llu", DP_PRINT_STATS(" Bytes Received = %llu",
peer_stats->rx.rcvd_reo[i].bytes); 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", DP_PRINT_STATS("Unicast Packets Received = %d",
peer_stats->rx.unicast.num); peer_stats->rx.unicast.num);
DP_PRINT_STATS("Unicast Bytes Received = %llu", DP_PRINT_STATS("Unicast Bytes Received = %llu",
@@ -7128,6 +7133,10 @@ void dp_txrx_path_stats(struct dp_soc *soc)
i, pdev->stats.rx.rcvd_reo[i].num, i, pdev->stats.rx.rcvd_reo[i].num,
pdev->stats.rx.rcvd_reo[i].bytes); 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),", DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),",
pdev->stats.rx.intra_bss.pkts.num, pdev->stats.rx.intra_bss.pkts.num,
pdev->stats.rx.intra_bss.pkts.bytes); pdev->stats.rx.intra_bss.pkts.bytes);
@@ -7467,6 +7476,8 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev)
void void
dp_print_pdev_rx_stats(struct dp_pdev *pdev) dp_print_pdev_rx_stats(struct dp_pdev *pdev)
{ {
uint8_t i;
DP_PRINT_STATS("PDEV Rx Stats:\n"); DP_PRINT_STATS("PDEV Rx Stats:\n");
DP_PRINT_STATS("Received From HW (Per Rx Ring):"); DP_PRINT_STATS("Received From HW (Per Rx Ring):");
DP_PRINT_STATS(" Packets = %u %u %u %u", 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[1].bytes,
pdev->stats.rx.rcvd_reo[2].bytes, pdev->stats.rx.rcvd_reo[2].bytes,
pdev->stats.rx.rcvd_reo[3].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("Replenished:");
DP_PRINT_STATS(" Packets = %u", DP_PRINT_STATS(" Packets = %u",
pdev->stats.replenish.pkts.num); pdev->stats.replenish.pkts.num);
@@ -8531,6 +8546,13 @@ void dp_update_pdev_stats(struct dp_pdev *tgtobj,
srcobj->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.unicast.num =
srcobj->rx.to_stack.num - srcobj->rx.to_stack.num -
(srcobj->rx.multicast.num); (srcobj->rx.multicast.num);

View File

@@ -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 * 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 * @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 * @unicast: Total unicast packets
* @multicast: Total multicast packets * @multicast: Total multicast packets
* @bcast: Broadcast Packet Count * @bcast: Broadcast Packet Count
@@ -3760,6 +3761,7 @@ struct dp_peer_extd_tx_stats {
*/ */
struct dp_peer_per_pkt_rx_stats { struct dp_peer_per_pkt_rx_stats {
struct cdp_pkt_info rcvd_reo[CDP_MAX_RX_RINGS]; 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 unicast;
struct cdp_pkt_info multicast; struct cdp_pkt_info multicast;
struct cdp_pkt_info bcast; struct cdp_pkt_info bcast;

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2014-2017,2019-2021 The Linux Foundation. All rights reserved. * 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 * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * 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); 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 * qdf_nbuf_set_rx_ipa_smmu_map() - set ipa smmu mapped flag
* @buf: Network buffer * @buf: Network buffer

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2014-2017,2019-2021 The Linux Foundation. All rights reserved. * 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 * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * 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; 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 */ #endif /* _QDF_NBUF_W_H */

View File

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

View File

@@ -89,6 +89,10 @@
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
reo_dest_ind_or_sw_excpt) 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) \ #define __qdf_nbuf_ipa_owned_get(skb) \
QDF_NBUF_CB_TX_IPA_OWNED(skb) QDF_NBUF_CB_TX_IPA_OWNED(skb)