qcacmn: Update enhanced Tx stats from Tx HTT PPDU completion path

Update enhanced Tx stats from Tx HTT PPDU completion path in WKK.
Define and use function pointers for architecture specific
functionality.

Change-Id: I4ba443647dbd81c83e899c0f88c5d9a4cc695e14
CRs-Fixed: 3132255
This commit is contained in:
Harsh Kumar Bijlani
2022-02-17 01:57:14 +05:30
committed by Madan Koyyalamudi
parent e57b5cfe7b
commit c1b9ccd925
7 changed files with 391 additions and 115 deletions

View File

@@ -146,7 +146,8 @@ static inline int dp_ath_rate_out(uint64_t _i)
#define HE_LAST_RIX_PLUS_ONE (HE_160_RATE_TABLE_INDEX + NUM_HE_RIX_FOR_160MHZ)
#ifdef WLAN_FEATURE_11BE
#define NUM_EHT_RIX_PER_BW (NUM_EHT_MCS * NUM_SPATIAL_STREAMS)
#define NUM_EHT_SPATIAL_STREAM 4
#define NUM_EHT_RIX_PER_BW (NUM_EHT_MCS * NUM_EHT_SPATIAL_STREAM)
#define EHT_20_RATE_TABLE_INDEX HE_LAST_RIX_PLUS_ONE
#define EHT_40_RATE_TABLE_INDEX (EHT_20_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)

View File

@@ -115,11 +115,7 @@
#define CDP_DATA_TID_MAX 8
#define CDP_DATA_NON_QOS_TID 16
#ifdef WLAN_FEATURE_11BE
#define CDP_NUM_SA_BW 5
#else
#define CDP_NUM_SA_BW 4
#endif
#define CDP_PERCENT_MACRO 100
#define CDP_NUM_KB_IN_MB 1000
/*

View File

@@ -97,9 +97,9 @@ static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = {
{"HE MCS 11 (1024-QAM 5/6)", MCS_VALID},
{"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
{"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_INVALID},
{"INVALID ", MCS_INVALID},
{"INVALID ", MCS_INVALID},
},
{
{"EHT MCS 0 (BPSK 1/2) ", MCS_VALID},
@@ -138,7 +138,7 @@ static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = {
{"HE MCS 11 (1024-QAM 5/6)", MCS_VALID},
{"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
{"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_INVALID},
}
};
#endif
@@ -161,9 +161,9 @@ dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
{"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
{"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
{"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_INVALID},
{"INVALID ", MCS_INVALID},
{"INVALID ", MCS_INVALID},
},
{
{"HE OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID},
@@ -180,9 +180,9 @@ dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
{"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID},
{"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
{"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_INVALID},
{"INVALID ", MCS_INVALID},
{"INVALID ", MCS_INVALID},
}
};
@@ -203,9 +203,9 @@ dp_mu_be_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
{"EHT MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
{"EHT MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
{"EHT MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
{"EHT MU-MINO MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
{"EHT MU-MIMO MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
{"EHT MU-MIMO MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_INVALID},
},
{
{"EHT OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID},
@@ -224,7 +224,7 @@ dp_mu_be_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
{"EHT OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
{"EHT OFDMA MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
{"EHT OFDMA MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_INVALID},
}
};
#else
@@ -245,7 +245,7 @@ dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
{"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
{"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
{"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_INVALID},
},
{
{"HE OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID},
@@ -262,7 +262,7 @@ dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
{"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID},
{"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
{"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
{"INVALID ", MCS_VALID},
{"INVALID ", MCS_INVALID},
}
};
#endif
@@ -5879,9 +5879,11 @@ void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
if (stats_type == PEER_TX_STATS) {
DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d\n",
peer_stats->tx.bw[0], peer_stats->tx.bw[1],
peer_stats->tx.bw[2], peer_stats->tx.bw[3],
peer_stats->tx.bw[4]);
peer_stats->tx.bw[CMN_BW_20MHZ],
peer_stats->tx.bw[CMN_BW_40MHZ],
peer_stats->tx.bw[CMN_BW_80MHZ],
peer_stats->tx.bw[CMN_BW_160MHZ],
peer_stats->tx.bw[CMN_BW_320MHZ]);
DP_PRINT_STATS("RU Locations RU[26 52 52_26 106 106_26 242 484 484_242 996 996_484 996_484_242 2X996 2X996_484 3X996 3X996_484 4X996]:");
for (i = 0; i < RU_INDEX_MAX; i++)
DP_PRINT_STATS("%s: %d", cdp_ru_string[i].ru_type,
@@ -5892,9 +5894,11 @@ void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
} else {
DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d",
peer_stats->rx.bw[0], peer_stats->rx.bw[1],
peer_stats->rx.bw[2], peer_stats->rx.bw[3],
peer_stats->rx.bw[4]);
peer_stats->rx.bw[CMN_BW_20MHZ],
peer_stats->rx.bw[CMN_BW_40MHZ],
peer_stats->rx.bw[CMN_BW_80MHZ],
peer_stats->rx.bw[CMN_BW_160MHZ],
peer_stats->rx.bw[CMN_BW_320MHZ]);
dp_print_common_ppdu_rates_info(&peer_stats->rx.su_be_ppdu_cnt,
DOT11_BE);
dp_print_mu_be_ppdu_rates_info(&peer_stats->rx.mu_be_ppdu_cnt[0]);
@@ -5912,8 +5916,10 @@ void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats,
{
if (stats_type == PEER_TX_STATS) {
DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
peer_stats->tx.bw[0], peer_stats->tx.bw[1],
peer_stats->tx.bw[2], peer_stats->tx.bw[3]);
peer_stats->tx.bw[CMN_BW_20MHZ],
peer_stats->tx.bw[CMN_BW_40MHZ],
peer_stats->tx.bw[CMN_BW_80MHZ],
peer_stats->tx.bw[CMN_BW_160MHZ]);
DP_PRINT_STATS("RU Locations RU[26 52 106 242 484 996]:");
DP_PRINT_STATS("%s: %d", cdp_ru_string[RU_26_INDEX].ru_type,
peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu);
@@ -5929,8 +5935,10 @@ void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats,
peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu);
} else {
DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
peer_stats->rx.bw[0], peer_stats->rx.bw[1],
peer_stats->rx.bw[2], peer_stats->rx.bw[3]);
peer_stats->rx.bw[CMN_BW_20MHZ],
peer_stats->rx.bw[CMN_BW_40MHZ],
peer_stats->rx.bw[CMN_BW_80MHZ],
peer_stats->rx.bw[CMN_BW_160MHZ]);
}
}

View File

@@ -60,6 +60,64 @@ dp_mon_populate_ppdu_info_1_0(struct hal_rx_ppdu_info *hal_ppdu_info,
{
ppdu->punc_bw = 0;
}
/*
* is_ppdu_txrx_capture_enabled() - API to check both pktlog and debug_sniffer
* modes are enabled or not.
* @dp_pdev: dp pdev handle.
*
* Return: bool
*/
static inline bool is_ppdu_txrx_capture_enabled(struct dp_pdev *pdev)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
if (!mon_pdev->pktlog_ppdu_stats && !mon_pdev->tx_sniffer_enable &&
!mon_pdev->mcopy_mode)
return true;
else
return false;
}
/**
* dp_mon_tx_enable_enhanced_stats_1_0() - Send HTT cmd to FW to enable stats
* @pdev: Datapath pdev handle
*
* Return: none
*/
static void dp_mon_tx_enable_enhanced_stats_1_0(struct dp_pdev *pdev)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) {
dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS,
pdev->pdev_id);
} else if (is_ppdu_txrx_capture_enabled(pdev) &&
mon_pdev->bpr_enable) {
dp_h2t_cfg_stats_msg_send(pdev,
DP_PPDU_STATS_CFG_BPR_ENH,
pdev->pdev_id);
}
}
/**
* dp_mon_tx_disable_enhanced_stats_1_0() - Send HTT cmd to FW to disable stats
* @pdev: Datapath pdev handle
*
* Return: none
*/
static void dp_mon_tx_disable_enhanced_stats_1_0(struct dp_pdev *pdev)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) {
dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id);
} else if (is_ppdu_txrx_capture_enabled(pdev) && mon_pdev->bpr_enable) {
dp_h2t_cfg_stats_msg_send(pdev,
DP_PPDU_STATS_CFG_BPR,
pdev->pdev_id);
}
}
#endif
#ifdef QCA_SUPPORT_FULL_MON
@@ -811,6 +869,74 @@ dp_set_bpr_enable_1_0(struct dp_pdev *pdev, int val)
}
#endif
#if defined(WDI_EVENT_ENABLE) &&\
(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
#ifndef WLAN_TX_PKT_CAPTURE_ENH
/**
* dp_ppdu_desc_notify_1_0 - Notify upper layer for PPDU indication via WDI
*
* @pdev: Datapath pdev handle
* @nbuf: Buffer to be shipped
*
* Return: void
*/
static void dp_ppdu_desc_notify_1_0(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct cdp_tx_completion_ppdu *ppdu_desc = NULL;
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(nbuf);
/**
* Deliver PPDU stats only for valid (acked) data
* frames if sniffer mode is not enabled.
* If sniffer mode is enabled, PPDU stats
* for all frames including mgmt/control
* frames should be delivered to upper layer
*/
if (mon_pdev->tx_sniffer_enable || mon_pdev->mcopy_mode) {
dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC,
pdev->soc,
nbuf, HTT_INVALID_PEER,
WDI_NO_VAL,
pdev->pdev_id);
} else {
if (ppdu_desc->num_mpdu != 0 &&
ppdu_desc->num_users != 0 &&
ppdu_desc->frame_ctrl &
HTT_FRAMECTRL_DATATYPE) {
dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC,
pdev->soc,
nbuf, HTT_INVALID_PEER,
WDI_NO_VAL,
pdev->pdev_id);
} else {
qdf_nbuf_free(nbuf);
}
}
}
#endif
/**
* dp_ppdu_stats_feat_enable_check_1_0 - Check if feature(s) is enabled to
* consume ppdu stats from FW
*
* @pdev: Datapath pdev handle
*
* Return: true if enabled, else return false
*/
static bool dp_ppdu_stats_feat_enable_check_1_0(struct dp_pdev *pdev)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
if (!mon_pdev->enhanced_stats_en && !mon_pdev->tx_sniffer_enable &&
!mon_pdev->mcopy_mode && !mon_pdev->bpr_enable)
return false;
else
return true;
}
#endif
#ifndef QCA_SUPPORT_FULL_MON
/**
* dp_rx_mon_process () - Core brain processing for monitor mode
@@ -906,6 +1032,14 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc)
#if defined(WDI_EVENT_ENABLE) &&\
(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
mon_ops->mon_ppdu_stats_ind_handler = dp_ppdu_stats_ind_handler;
#ifndef WLAN_TX_PKT_CAPTURE_ENH
mon_ops->mon_ppdu_desc_deliver = dp_ppdu_desc_deliver;
mon_ops->mon_ppdu_desc_notify = dp_ppdu_desc_notify_1_0;
#else
mon_ops->mon_ppdu_desc_deliver = dp_ppdu_desc_deliver_1_0;
#endif
mon_ops->mon_ppdu_stats_feat_enable_check =
dp_ppdu_stats_feat_enable_check_1_0;
#endif
#ifdef WLAN_RX_PKT_CAPTURE_ENH
mon_ops->mon_config_enh_rx_capture = dp_config_enh_rx_capture;
@@ -934,6 +1068,10 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc)
dp_mon_filter_setup_enhanced_stats_1_0;
mon_ops->mon_filter_reset_enhanced_stats =
dp_mon_filter_reset_enhanced_stats_1_0;
mon_ops->mon_tx_enable_enhanced_stats =
dp_mon_tx_enable_enhanced_stats_1_0;
mon_ops->mon_tx_disable_enhanced_stats =
dp_mon_tx_disable_enhanced_stats_1_0;
#ifdef WLAN_FEATURE_11BE
mon_ops->mon_tx_stats_update = NULL;
#endif

View File

@@ -382,6 +382,31 @@ QDF_STATUS dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev *pdev,
return QDF_STATUS_SUCCESS;
}
#ifdef QCA_ENHANCED_STATS_SUPPORT
/**
* dp_mon_tx_enable_enhanced_stats_2_0() - Send HTT cmd to FW to enable stats
* @pdev: Datapath pdev handle
*
* Return: none
*/
static void dp_mon_tx_enable_enhanced_stats_2_0(struct dp_pdev *pdev)
{
dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS,
pdev->pdev_id);
}
/**
* dp_mon_tx_disable_enhanced_stats_2_0() - Send HTT cmd to FW to disable stats
* @pdev: Datapath pdev handle
*
* Return: none
*/
static void dp_mon_tx_disable_enhanced_stats_2_0(struct dp_pdev *pdev)
{
dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id);
}
#endif
#if defined(QCA_ENHANCED_STATS_SUPPORT) && defined(WLAN_FEATURE_11BE)
void
dp_mon_tx_stats_update_2_0(struct dp_mon_peer *mon_peer,
@@ -396,37 +421,37 @@ dp_mon_tx_stats_update_2_0(struct dp_mon_peer *mon_peer,
DP_STATS_INCC(mon_peer,
tx.pkt_type[preamble].mcs_count[MAX_MCS - 1],
ppdu->num_msdu,
((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE)));
((mcs >= MAX_MCS_11BE) && (preamble == DOT11_BE)));
DP_STATS_INCC(mon_peer,
tx.pkt_type[preamble].mcs_count[mcs],
ppdu->num_msdu,
((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE)));
((mcs < MAX_MCS_11BE) && (preamble == DOT11_BE)));
DP_STATS_INCC(mon_peer,
tx.su_be_ppdu_cnt.mcs_count[MAX_MCS - 1], 1,
((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE) &&
((mcs >= MAX_MCS_11BE) && (preamble == DOT11_BE) &&
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_SU)));
DP_STATS_INCC(mon_peer,
tx.su_be_ppdu_cnt.mcs_count[mcs], 1,
((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE) &&
((mcs < MAX_MCS_11BE) && (preamble == DOT11_BE) &&
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_SU)));
DP_STATS_INCC(mon_peer,
tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_OFDMA].mcs_count[MAX_MCS - 1],
1, ((mcs >= (MAX_MCS - 1)) &&
1, ((mcs >= MAX_MCS_11BE) &&
(preamble == DOT11_BE) &&
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA)));
DP_STATS_INCC(mon_peer,
tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_OFDMA].mcs_count[mcs],
1, ((mcs < (MAX_MCS - 1)) &&
1, ((mcs < MAX_MCS_11BE) &&
(preamble == DOT11_BE) &&
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA)));
DP_STATS_INCC(mon_peer,
tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_MIMO].mcs_count[MAX_MCS - 1],
1, ((mcs >= (MAX_MCS - 1)) &&
1, ((mcs >= MAX_MCS_11BE) &&
(preamble == DOT11_BE) &&
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO)));
DP_STATS_INCC(mon_peer,
tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_MIMO].mcs_count[mcs],
1, ((mcs < (MAX_MCS - 1)) &&
1, ((mcs < MAX_MCS_11BE) &&
(preamble == DOT11_BE) &&
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO)));
}
@@ -448,6 +473,48 @@ dp_set_bpr_enable_2_0(struct dp_pdev *pdev, int val)
}
#endif /* QCA_SUPPORT_BPR */
#if defined(WDI_EVENT_ENABLE) &&\
(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
/**
* dp_ppdu_desc_notify_2_0 - Notify upper layer for PPDU indication via WDI
*
* @pdev: Datapath pdev handle
* @nbuf: Buffer to be shipped
*
* Return: void
*/
static void dp_ppdu_desc_notify_2_0(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
{
struct cdp_tx_completion_ppdu *ppdu_desc = NULL;
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(nbuf);
if (ppdu_desc->num_mpdu != 0 && ppdu_desc->num_users != 0 &&
ppdu_desc->frame_ctrl & HTT_FRAMECTRL_DATATYPE) {
dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC,
pdev->soc,
nbuf, HTT_INVALID_PEER,
WDI_NO_VAL,
pdev->pdev_id);
} else {
qdf_nbuf_free(nbuf);
}
}
/**
* dp_ppdu_stats_feat_enable_check_2_0 - Check if feature(s) is enabled to
* consume ppdu stats from FW
*
* @pdev: Datapath pdev handle
*
* Return: true if enabled, else return false
*/
static bool dp_ppdu_stats_feat_enable_check_2_0(struct dp_pdev *pdev)
{
return pdev->monitor_pdev->enhanced_stats_en;
}
#endif
static
QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc)
{
@@ -1045,6 +1112,10 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc)
#if defined(WDI_EVENT_ENABLE) &&\
(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
mon_ops->mon_ppdu_stats_ind_handler = dp_ppdu_stats_ind_handler;
mon_ops->mon_ppdu_desc_deliver = dp_ppdu_desc_deliver;
mon_ops->mon_ppdu_desc_notify = dp_ppdu_desc_notify_2_0;
mon_ops->mon_ppdu_stats_feat_enable_check =
dp_ppdu_stats_feat_enable_check_2_0;
#endif
#ifdef WLAN_RX_PKT_CAPTURE_ENH
mon_ops->mon_config_enh_rx_capture = NULL;
@@ -1073,6 +1144,10 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc)
dp_mon_filter_setup_enhanced_stats_2_0;
mon_ops->mon_filter_reset_enhanced_stats =
dp_mon_filter_reset_enhanced_stats_2_0;
mon_ops->mon_tx_enable_enhanced_stats =
dp_mon_tx_enable_enhanced_stats_2_0;
mon_ops->mon_tx_disable_enhanced_stats =
dp_mon_tx_disable_enhanced_stats_2_0;
mon_ops->mon_tx_stats_update = dp_mon_tx_stats_update_2_0;
#endif
#if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)

View File

@@ -1721,25 +1721,23 @@ void dp_neighbour_peers_detach(struct dp_pdev *pdev)
qdf_spinlock_destroy(&mon_pdev->neighbour_peer_mutex);
}
#ifdef QCA_ENHANCED_STATS_SUPPORT
/*
* is_ppdu_txrx_capture_enabled() - API to check both pktlog and debug_sniffer
* modes are enabled or not.
* @dp_pdev: dp pdev handle.
* dp_mon_tx_enable_enhanced_stats() - Enable enhanced Tx stats
* @pdev: Datapath pdev handle
*
* Return: bool
* Return: void
*/
static inline bool is_ppdu_txrx_capture_enabled(struct dp_pdev *pdev)
static void dp_mon_tx_enable_enhanced_stats(struct dp_pdev *pdev)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct dp_soc *soc = pdev->soc;
struct dp_mon_ops *mon_ops = NULL;
if (!mon_pdev->pktlog_ppdu_stats && !mon_pdev->tx_sniffer_enable &&
!mon_pdev->mcopy_mode)
return true;
else
return false;
mon_ops = dp_mon_ops_get(soc);
if (mon_ops && mon_ops->mon_tx_enable_enhanced_stats)
mon_ops->mon_tx_enable_enhanced_stats(pdev);
}
#ifdef QCA_ENHANCED_STATS_SUPPORT
/*
* dp_enable_enhanced_stats()- API to enable enhanced statistcs
* @soc_handle: DP_SOC handle
@@ -1785,19 +1783,27 @@ dp_enable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id)
return QDF_STATUS_E_FAILURE;
}
if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) {
dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS,
pdev->pdev_id);
} else if (is_ppdu_txrx_capture_enabled(pdev) &&
mon_pdev->bpr_enable) {
dp_h2t_cfg_stats_msg_send(pdev,
DP_PPDU_STATS_CFG_BPR_ENH,
pdev->pdev_id);
}
dp_mon_tx_enable_enhanced_stats(pdev);
return QDF_STATUS_SUCCESS;
}
/*
* dp_mon_tx_disable_enhanced_stats() - Disable enhanced Tx stats
* @pdev: Datapath pdev handle
*
* Return: void
*/
static void dp_mon_tx_disable_enhanced_stats(struct dp_pdev *pdev)
{
struct dp_soc *soc = pdev->soc;
struct dp_mon_ops *mon_ops = NULL;
mon_ops = dp_mon_ops_get(soc);
if (mon_ops && mon_ops->mon_tx_disable_enhanced_stats)
mon_ops->mon_tx_disable_enhanced_stats(pdev);
}
/*
* dp_disable_enhanced_stats()- API to disable enhanced statistcs
*
@@ -1828,13 +1834,7 @@ dp_disable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id)
if (wlan_cfg_get_txmon_hw_support(pdev->soc->wlan_cfg_ctx))
return QDF_STATUS_SUCCESS;
if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) {
dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id);
} else if (is_ppdu_txrx_capture_enabled(pdev) && mon_pdev->bpr_enable) {
dp_h2t_cfg_stats_msg_send(pdev,
DP_PPDU_STATS_CFG_BPR,
pdev->pdev_id);
}
dp_mon_tx_disable_enhanced_stats(pdev);
dp_mon_filter_reset_enhanced_stats(pdev);
if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) {
@@ -2712,10 +2712,10 @@ dp_tx_stats_update(struct dp_pdev *pdev, struct dp_peer *peer,
((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC)));
DP_STATS_INCC(mon_peer,
tx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu,
((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX)));
((mcs >= MAX_MCS_11AX) && (preamble == DOT11_AX)));
DP_STATS_INCC(mon_peer,
tx.pkt_type[preamble].mcs_count[mcs], num_msdu,
((mcs < (MAX_MCS - 1)) && (preamble == DOT11_AX)));
((mcs < MAX_MCS_11AX) && (preamble == DOT11_AX)));
DP_STATS_INCC(mon_peer, tx.ampdu_cnt, num_mpdu, ppdu->is_ampdu);
DP_STATS_INCC(mon_peer, tx.non_ampdu_cnt, num_mpdu, !(ppdu->is_ampdu));
DP_STATS_INCC(mon_peer, tx.pream_punct_cnt, 1, ppdu->pream_punct);
@@ -3032,6 +3032,7 @@ dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev,
uint8_t curr_user_index = 0;
struct dp_vdev *vdev;
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
uint8_t bw;
ppdu_desc =
(struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
@@ -3089,8 +3090,12 @@ dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev,
HTT_PPDU_STATS_USER_RATE_TLV_HE_RE_GET(*tag_buf);
ppdu_user_desc->txbf =
HTT_PPDU_STATS_USER_RATE_TLV_TXBF_GET(*tag_buf);
ppdu_user_desc->bw =
HTT_PPDU_STATS_USER_RATE_TLV_BW_GET(*tag_buf) - 2;
bw = HTT_PPDU_STATS_USER_RATE_TLV_BW_GET(*tag_buf);
/* Align bw value as per host data structures */
if (bw == HTT_PPDU_STATS_BANDWIDTH_320MHZ)
ppdu_user_desc->bw = bw - 3;
else
ppdu_user_desc->bw = bw - 2;
ppdu_user_desc->nss = HTT_PPDU_STATS_USER_RATE_TLV_NSS_GET(*tag_buf);
ppdu_desc->usr_nss_sum += ppdu_user_desc->nss;
ppdu_user_desc->mcs = HTT_PPDU_STATS_USER_RATE_TLV_MCS_GET(*tag_buf);
@@ -4035,17 +4040,27 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
}
}
#ifndef WLAN_TX_PKT_CAPTURE_ENH
/**
* dp_ppdu_desc_deliver(): Function to deliver Tx PPDU status descriptor
* to upper layer
* @pdev: DP pdev handle
* @ppdu_info: per PPDU TLV descriptor
#if !defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(QCA_MONITOR_2_0_SUPPORT)
/*
* dp_tx_ppdu_desc_notify() - Notify to upper layer about PPDU via WDI
*
* return: void
* @pdev: Datapath pdev handle
* @nbuf: Buffer to be delivered to upper layer
*
* Return: void
*/
static
static void dp_tx_ppdu_desc_notify(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
{
struct dp_soc *soc = pdev->soc;
struct dp_mon_ops *mon_ops = NULL;
mon_ops = dp_mon_ops_get(soc);
if (mon_ops && mon_ops->mon_ppdu_desc_notify)
mon_ops->mon_ppdu_desc_notify(pdev, nbuf);
else
qdf_nbuf_free(nbuf);
}
void dp_ppdu_desc_deliver(struct dp_pdev *pdev,
struct ppdu_info *ppdu_info)
{
@@ -4118,41 +4133,39 @@ void dp_ppdu_desc_deliver(struct dp_pdev *pdev,
qdf_mem_free(s_ppdu_info);
/**
* Deliver PPDU stats only for valid (acked) data
* frames if sniffer mode is not enabled.
* If sniffer mode is enabled, PPDU stats
* for all frames including mgmt/control
* frames should be delivered to upper layer
*/
if (mon_pdev->tx_sniffer_enable || mon_pdev->mcopy_mode) {
dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC,
pdev->soc,
nbuf, HTT_INVALID_PEER,
WDI_NO_VAL,
pdev->pdev_id);
} else {
if (ppdu_desc->num_mpdu != 0 &&
ppdu_desc->num_users != 0 &&
ppdu_desc->frame_ctrl &
HTT_FRAMECTRL_DATATYPE) {
dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC,
pdev->soc,
nbuf, HTT_INVALID_PEER,
WDI_NO_VAL,
pdev->pdev_id);
} else {
qdf_nbuf_free(nbuf);
}
}
dp_tx_ppdu_desc_notify(pdev, nbuf);
if (matched)
break;
}
}
#endif
/*
* dp_tx_ppdu_desc_deliver() - Deliver PPDU desc to upper layer
*
* @pdev: Datapath pdev handle
* @ppdu_info: per PPDU TLV descriptor
*
* Return: void
*/
static void dp_tx_ppdu_desc_deliver(struct dp_pdev *pdev,
struct ppdu_info *ppdu_info)
{
struct dp_soc *soc = pdev->soc;
struct dp_mon_ops *mon_ops = NULL;
mon_ops = dp_mon_ops_get(soc);
if (mon_ops && mon_ops->mon_ppdu_desc_deliver) {
mon_ops->mon_ppdu_desc_deliver(pdev, ppdu_info);
} else {
qdf_nbuf_free(ppdu_info->nbuf);
ppdu_info->nbuf = NULL;
qdf_mem_free(ppdu_info);
}
}
/**
* dp_get_ppdu_desc(): Function to allocate new PPDU status
* desc for new ppdu id
@@ -4282,7 +4295,7 @@ struct ppdu_info *dp_get_ppdu_desc(struct dp_pdev *pdev, uint32_t ppdu_id,
HTT_STATS_FTYPE_SGEN_MU_BAR))
return ppdu_info;
dp_ppdu_desc_deliver(pdev, ppdu_info);
dp_tx_ppdu_desc_deliver(pdev, ppdu_info);
} else {
return ppdu_info;
}
@@ -4515,6 +4528,27 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
}
#endif /* QCA_ENHANCED_STATS_SUPPORT */
#if defined(WDI_EVENT_ENABLE)
#ifdef QCA_ENHANCED_STATS_SUPPORT
/**
* dp_tx_ppdu_stats_feat_enable_check() - Check if feature(s) is enabled to
* consume stats received from FW via HTT
* @pdev: Datapath pdev handle
*
* Return: void
*/
static bool dp_tx_ppdu_stats_feat_enable_check(struct dp_pdev *pdev)
{
struct dp_soc *soc = pdev->soc;
struct dp_mon_ops *mon_ops = NULL;
mon_ops = dp_mon_ops_get(soc);
if (mon_ops && mon_ops->mon_ppdu_stats_feat_enable_check)
return mon_ops->mon_ppdu_stats_feat_enable_check(pdev);
else
return false;
}
/**
* dp_txrx_ppdu_stats_handler() - Function to process HTT PPDU stats from FW
* @soc: DP SOC handle
@@ -4523,15 +4557,13 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
*
* return:void
*/
#if defined(WDI_EVENT_ENABLE)
#ifdef QCA_ENHANCED_STATS_SUPPORT
static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
uint8_t pdev_id, qdf_nbuf_t htt_t2h_msg)
{
struct dp_pdev *pdev = soc->pdev_list[pdev_id];
struct dp_pdev *pdev;
struct ppdu_info *ppdu_info = NULL;
bool free_buf = true;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct dp_mon_pdev *mon_pdev;
if (pdev_id >= MAX_PDEV_CNT)
return true;
@@ -4540,11 +4572,14 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
if (!pdev)
return true;
mon_pdev = pdev->monitor_pdev;
if (!mon_pdev)
return true;
if (wlan_cfg_get_txmon_hw_support(soc->wlan_cfg_ctx))
return free_buf;
if (!mon_pdev->enhanced_stats_en && !mon_pdev->tx_sniffer_enable &&
!mon_pdev->mcopy_mode && !mon_pdev->bpr_enable)
if (!dp_tx_ppdu_stats_feat_enable_check(pdev))
return free_buf;
qdf_spin_lock_bh(&mon_pdev->ppdu_stats_lock);
@@ -4558,7 +4593,7 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
}
if (ppdu_info)
dp_ppdu_desc_deliver(pdev, ppdu_info);
dp_tx_ppdu_desc_deliver(pdev, ppdu_info);
mon_pdev->mgmtctrl_frm_info.mgmt_buf = NULL;
mon_pdev->mgmtctrl_frm_info.mgmt_buf_len = 0;
@@ -5539,6 +5574,9 @@ void dp_mon_feature_ops_deregister(struct dp_soc *soc)
#if defined(WDI_EVENT_ENABLE) &&\
(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
mon_ops->mon_ppdu_stats_ind_handler = NULL;
mon_ops->mon_ppdu_desc_deliver = NULL;
mon_ops->mon_ppdu_desc_notify = NULL;
mon_ops->mon_ppdu_stats_feat_enable_check = NULL;
#endif
#ifdef WLAN_RX_PKT_CAPTURE_ENH
mon_ops->mon_config_enh_rx_capture = NULL;
@@ -5562,6 +5600,8 @@ void dp_mon_feature_ops_deregister(struct dp_soc *soc)
#endif
#ifdef QCA_ENHANCED_STATS_SUPPORT
mon_ops->mon_filter_setup_enhanced_stats = NULL;
mon_ops->mon_tx_enable_enhanced_stats = NULL;
mon_ops->mon_tx_disable_enhanced_stats = NULL;
#ifdef WLAN_FEATURE_11BE
mon_ops->mon_tx_stats_update = NULL;
#endif

View File

@@ -510,6 +510,18 @@ dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev,
bool dp_ppdu_stats_ind_handler(struct htt_soc *soc,
uint32_t *msg_word,
qdf_nbuf_t htt_t2h_msg);
#if !defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(QCA_MONITOR_2_0_SUPPORT)
/**
* dp_ppdu_desc_deliver(): Function to deliver Tx PPDU status descriptor
* to upper layer
* @pdev: DP pdev handle
* @ppdu_info: per PPDU TLV descriptor
*
* return: void
*/
void dp_ppdu_desc_deliver(struct dp_pdev *pdev, struct ppdu_info *ppdu_info);
#endif
#endif
struct dp_mon_ops {
@@ -595,6 +607,10 @@ struct dp_mon_ops {
bool (*mon_ppdu_stats_ind_handler)(struct htt_soc *soc,
uint32_t *msg_word,
qdf_nbuf_t htt_t2h_msg);
void (*mon_ppdu_desc_deliver)(struct dp_pdev *pdev,
struct ppdu_info *ppdu_info);
void (*mon_ppdu_desc_notify)(struct dp_pdev *pdev, qdf_nbuf_t nbuf);
bool (*mon_ppdu_stats_feat_enable_check)(struct dp_pdev *pdev);
#endif
QDF_STATUS (*mon_htt_ppdu_stats_attach)(struct dp_pdev *pdev);
void (*mon_htt_ppdu_stats_detach)(struct dp_pdev *pdev);
@@ -665,6 +681,8 @@ struct dp_mon_ops {
void (*mon_filter_reset_enhanced_stats)(struct dp_pdev *pdev);
void (*mon_tx_stats_update)(struct dp_mon_peer *mon_peer,
struct cdp_tx_completion_ppdu_user *ppdu);
void (*mon_tx_enable_enhanced_stats)(struct dp_pdev *pdev);
void (*mon_tx_disable_enhanced_stats)(struct dp_pdev *pdev);
#endif
#ifdef QCA_MCOPY_SUPPORT
void (*mon_filter_setup_mcopy_mode)(struct dp_pdev *pdev);