qcacmn: Add control frame stats accounting support

Add control frame stats accounting support.
Accumulate both per peer BAR and NDPA counts in Tx and Rx per PPDU stats
path. Accumulate per peer RTS success and failure count only in per PPDU
Tx stats path.

Change-Id: I78fb3546cd831559e208a7330feb2eb67b9a28de
CRs-Fixed: 3313435
这个提交包含在:
Subrat Mishra
2022-10-14 16:37:57 +05:30
提交者 Madan Koyyalamudi
父节点 abbf1c968a
当前提交 92fc6fa7c1
修改 12 个文件,包含 210 行新增0 行删除

查看文件

@@ -566,6 +566,8 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
dp_rx_mon_update_scan_spcl_vap_stats(pdev,
ppdu_info);
dp_rx_mon_update_user_ctrl_frame_stats(pdev, ppdu_info);
/*
* if chan_num is not fetched correctly from ppdu RX TLV,
* get it from pdev saved.

查看文件

@@ -1644,6 +1644,8 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
else if (dp_cfr_rcc_mode_status(pdev) && ppdu_info)
dp_rx_handle_cfr(soc, pdev, ppdu_info);
dp_rx_mon_update_user_ctrl_frame_stats(pdev, ppdu_info);
status = dp_rx_mon_add_ppdu_info_to_wq(pdev, ppdu_info);
if (status != QDF_STATUS_SUCCESS) {
if (ppdu_info)

查看文件

@@ -3471,6 +3471,11 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv(
HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_SUCCESS_GET(*tag_buf);
ppdu_desc->rts_failure =
HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_GET(*tag_buf);
ppdu_user_desc->mprot_type = ppdu_desc->mprot_type;
ppdu_user_desc->rts_success = ppdu_desc->rts_success;
ppdu_user_desc->rts_failure = ppdu_desc->rts_failure;
ppdu_user_desc->pream_punct =
HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_GET(*tag_buf);
@@ -4112,6 +4117,7 @@ void dp_ppdu_desc_user_airtime_consumption_update(
struct cdp_tx_completion_ppdu_user *user)
{ }
#endif
#if defined(WLAN_ATF_ENABLE) || defined(WLAN_TELEMETRY_STATS_SUPPORT)
static void
dp_ppdu_desc_user_phy_tx_time_update(struct dp_pdev *pdev,
@@ -4164,6 +4170,46 @@ dp_ppdu_desc_user_phy_tx_time_update(struct dp_pdev *pdev,
}
#endif
#ifdef WLAN_SUPPORT_CTRL_FRAME_STATS
static void
dp_tx_ctrl_stats_update(struct dp_pdev *pdev, struct dp_peer *peer,
struct cdp_tx_completion_ppdu_user *user)
{
struct dp_mon_peer *mon_peer = NULL;
uint16_t fc = 0;
if (!pdev || !peer || !user)
return;
mon_peer = peer->monitor_peer;
if (qdf_unlikely(!mon_peer))
return;
if (user->mprot_type) {
DP_STATS_INCC(mon_peer,
tx.rts_success, 1, user->rts_success);
DP_STATS_INCC(mon_peer,
tx.rts_failure, 1, user->rts_failure);
}
fc = user->frame_ctrl;
if ((qdf_cpu_to_le16(fc) & QDF_IEEE80211_FC0_TYPE_MASK) ==
QDF_IEEE80211_FC0_TYPE_CTL) {
if ((qdf_cpu_to_le16(fc) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
QDF_IEEE80211_FC0_SUBTYPE_VHT_NDP_AN)
DP_STATS_INC(mon_peer, tx.ndpa_cnt, 1);
if ((qdf_cpu_to_le16(fc) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
QDF_IEEE80211_FC0_SUBTYPE_BAR)
DP_STATS_INC(mon_peer, tx.bar_cnt, 1);
}
}
#else
static void
dp_tx_ctrl_stats_update(struct dp_pdev *pdev, struct dp_peer *peer,
struct cdp_tx_completion_ppdu_user *user)
{
}
#endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */
/**
* dp_ppdu_desc_user_stats_update(): Function to update TX user stats
* @pdev: DP pdev handle
@@ -4226,6 +4272,9 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
dp_ppdu_desc_user_phy_tx_time_update(pdev, peer, ppdu_desc,
&ppdu_desc->user[i]);
dp_tx_ctrl_stats_update(pdev, peer, &ppdu_desc->user[i]);
/*
* different frame like DATA, BAR or CTRL has different
* tlv bitmap expected. Apart from ACK_BA_STATUS TLV, we

查看文件

@@ -2036,3 +2036,42 @@ dp_mon_rx_stats_update_rssi_dbm_params(struct dp_mon_pdev *mon_pdev,
ppdu_info->rx_status.rssi_dbm_conv_support =
mon_pdev->rssi_dbm_conv_support;
}
#ifdef WLAN_SUPPORT_CTRL_FRAME_STATS
void dp_rx_mon_update_user_ctrl_frame_stats(struct dp_pdev *pdev,
struct hal_rx_ppdu_info *ppdu_info)
{
struct dp_peer *peer;
struct dp_mon_peer *mon_peer;
struct dp_soc *soc = pdev->soc;
uint16_t fc, sw_peer_id;
uint8_t i;
if (qdf_unlikely(!ppdu_info))
return;
fc = ppdu_info->nac_info.frame_control;
if (qdf_likely((qdf_cpu_to_le16(fc) & QDF_IEEE80211_FC0_TYPE_MASK) !=
QDF_IEEE80211_FC0_TYPE_CTL))
return;
for (i = 0; i < ppdu_info->com_info.num_users; i++) {
sw_peer_id = ppdu_info->rx_user_status[i].sw_peer_id;
peer = dp_peer_get_ref_by_id(soc, sw_peer_id,
DP_MOD_ID_RX_PPDU_STATS);
if (qdf_unlikely(!peer))
continue;
mon_peer = peer->monitor_peer;
if (qdf_unlikely(!mon_peer)) {
dp_peer_unref_delete(peer, DP_MOD_ID_RX_PPDU_STATS);
continue;
}
DP_STATS_INCC(mon_peer, rx.ndpa_cnt, 1,
ppdu_info->ctrl_frm_info[i].ndpa);
DP_STATS_INCC(mon_peer, rx.bar_cnt, 1,
ppdu_info->ctrl_frm_info[i].bar);
dp_peer_unref_delete(peer, DP_MOD_ID_RX_PPDU_STATS);
}
}
#endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */

查看文件

@@ -366,6 +366,25 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
}
#endif /* QCA_ENHANCED_STATS_SUPPORT */
#ifdef WLAN_SUPPORT_CTRL_FRAME_STATS
/**
* dp_rx_mon_update_user_ctrl_frame_stats() - Function to update Rx control
* frame stats per user.
* @pdev: DP Pdev Pointer
* @ppdu_info: HAL Rx PPDU info Pointer
*
* Return: None
*/
void dp_rx_mon_update_user_ctrl_frame_stats(struct dp_pdev *pdev,
struct hal_rx_ppdu_info *ppdu_info);
#else
static inline void
dp_rx_mon_update_user_ctrl_frame_stats(struct dp_pdev *pdev,
struct hal_rx_ppdu_info *ppdu_info)
{
}
#endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */
#ifdef QCA_UNDECODED_METADATA_SUPPORT
/**
* dp_rx_handle_ppdu_undecoded_metadata() - Allocate and deliver ppdu info