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
这个提交包含在:
@@ -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
|
||||
|
在新工单中引用
屏蔽一个用户