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_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;

View File

@@ -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 =

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;
}
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.

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++) \
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)

View File

@@ -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))) {

View File

@@ -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);

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
* @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;

View File

@@ -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

View File

@@ -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 */

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.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;

View File

@@ -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)