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:

committed by
Madan Koyyalamudi

parent
e57b5cfe7b
commit
c1b9ccd925
@@ -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)
|
#define HE_LAST_RIX_PLUS_ONE (HE_160_RATE_TABLE_INDEX + NUM_HE_RIX_FOR_160MHZ)
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_11BE
|
#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_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)
|
#define EHT_40_RATE_TABLE_INDEX (EHT_20_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
|
||||||
|
@@ -115,11 +115,7 @@
|
|||||||
#define CDP_DATA_TID_MAX 8
|
#define CDP_DATA_TID_MAX 8
|
||||||
#define CDP_DATA_NON_QOS_TID 16
|
#define CDP_DATA_NON_QOS_TID 16
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_11BE
|
|
||||||
#define CDP_NUM_SA_BW 5
|
|
||||||
#else
|
|
||||||
#define CDP_NUM_SA_BW 4
|
#define CDP_NUM_SA_BW 4
|
||||||
#endif
|
|
||||||
#define CDP_PERCENT_MACRO 100
|
#define CDP_PERCENT_MACRO 100
|
||||||
#define CDP_NUM_KB_IN_MB 1000
|
#define CDP_NUM_KB_IN_MB 1000
|
||||||
/*
|
/*
|
||||||
|
@@ -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 11 (1024-QAM 5/6)", MCS_VALID},
|
||||||
{"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
{"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
||||||
{"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
|
{"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"INVALID ", MCS_INVALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"INVALID ", MCS_INVALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"INVALID ", MCS_INVALID},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{"EHT MCS 0 (BPSK 1/2) ", MCS_VALID},
|
{"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 11 (1024-QAM 5/6)", MCS_VALID},
|
||||||
{"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
{"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
||||||
{"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
|
{"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"INVALID ", MCS_INVALID},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
#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 11 (1024-QAM 5/6)", MCS_VALID},
|
||||||
{"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
{"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
||||||
{"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
|
{"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"INVALID ", MCS_INVALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"INVALID ", MCS_INVALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"INVALID ", MCS_INVALID},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{"HE OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID},
|
{"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 11 (1024-QAM 5/6)", MCS_VALID},
|
||||||
{"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
{"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
||||||
{"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
|
{"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"INVALID ", MCS_INVALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"INVALID ", MCS_INVALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"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 11 (1024-QAM 5/6)", MCS_VALID},
|
||||||
{"EHT MU-MIMO MCS 12 (4096-QAM 3/4)", 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-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},
|
{"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},
|
{"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 13 (4096-QAM 5/6)", MCS_VALID},
|
||||||
{"EHT OFDMA MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
|
{"EHT OFDMA MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
|
||||||
{"EHT OFDMA MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
|
{"EHT OFDMA MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"INVALID ", MCS_INVALID},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#else
|
#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 11 (1024-QAM 5/6)", MCS_VALID},
|
||||||
{"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
{"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
||||||
{"HE MU-MIMO MCS 13 (4096-QAM 5/6)", 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},
|
{"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 11 (1024-QAM 5/6)", MCS_VALID},
|
||||||
{"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
{"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
|
||||||
{"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
|
{"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
|
||||||
{"INVALID ", MCS_VALID},
|
{"INVALID ", MCS_INVALID},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@@ -5879,9 +5879,11 @@ void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
|
|||||||
|
|
||||||
if (stats_type == PEER_TX_STATS) {
|
if (stats_type == PEER_TX_STATS) {
|
||||||
DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d\n",
|
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[CMN_BW_20MHZ],
|
||||||
peer_stats->tx.bw[2], peer_stats->tx.bw[3],
|
peer_stats->tx.bw[CMN_BW_40MHZ],
|
||||||
peer_stats->tx.bw[4]);
|
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]:");
|
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++)
|
for (i = 0; i < RU_INDEX_MAX; i++)
|
||||||
DP_PRINT_STATS("%s: %d", cdp_ru_string[i].ru_type,
|
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 {
|
} else {
|
||||||
DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d",
|
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[CMN_BW_20MHZ],
|
||||||
peer_stats->rx.bw[2], peer_stats->rx.bw[3],
|
peer_stats->rx.bw[CMN_BW_40MHZ],
|
||||||
peer_stats->rx.bw[4]);
|
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,
|
dp_print_common_ppdu_rates_info(&peer_stats->rx.su_be_ppdu_cnt,
|
||||||
DOT11_BE);
|
DOT11_BE);
|
||||||
dp_print_mu_be_ppdu_rates_info(&peer_stats->rx.mu_be_ppdu_cnt[0]);
|
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) {
|
if (stats_type == PEER_TX_STATS) {
|
||||||
DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
|
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[CMN_BW_20MHZ],
|
||||||
peer_stats->tx.bw[2], peer_stats->tx.bw[3]);
|
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("RU Locations RU[26 52 106 242 484 996]:");
|
||||||
DP_PRINT_STATS("%s: %d", cdp_ru_string[RU_26_INDEX].ru_type,
|
DP_PRINT_STATS("%s: %d", cdp_ru_string[RU_26_INDEX].ru_type,
|
||||||
peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu);
|
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);
|
peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu);
|
||||||
} else {
|
} else {
|
||||||
DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
|
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[CMN_BW_20MHZ],
|
||||||
peer_stats->rx.bw[2], peer_stats->rx.bw[3]);
|
peer_stats->rx.bw[CMN_BW_40MHZ],
|
||||||
|
peer_stats->rx.bw[CMN_BW_80MHZ],
|
||||||
|
peer_stats->rx.bw[CMN_BW_160MHZ]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -60,6 +60,64 @@ dp_mon_populate_ppdu_info_1_0(struct hal_rx_ppdu_info *hal_ppdu_info,
|
|||||||
{
|
{
|
||||||
ppdu->punc_bw = 0;
|
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
|
#endif
|
||||||
|
|
||||||
#ifdef QCA_SUPPORT_FULL_MON
|
#ifdef QCA_SUPPORT_FULL_MON
|
||||||
@@ -811,6 +869,74 @@ dp_set_bpr_enable_1_0(struct dp_pdev *pdev, int val)
|
|||||||
}
|
}
|
||||||
#endif
|
#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
|
#ifndef QCA_SUPPORT_FULL_MON
|
||||||
/**
|
/**
|
||||||
* dp_rx_mon_process () - Core brain processing for monitor mode
|
* 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) &&\
|
#if defined(WDI_EVENT_ENABLE) &&\
|
||||||
(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
|
(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_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
|
#endif
|
||||||
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
||||||
mon_ops->mon_config_enh_rx_capture = dp_config_enh_rx_capture;
|
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;
|
dp_mon_filter_setup_enhanced_stats_1_0;
|
||||||
mon_ops->mon_filter_reset_enhanced_stats =
|
mon_ops->mon_filter_reset_enhanced_stats =
|
||||||
dp_mon_filter_reset_enhanced_stats_1_0;
|
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
|
#ifdef WLAN_FEATURE_11BE
|
||||||
mon_ops->mon_tx_stats_update = NULL;
|
mon_ops->mon_tx_stats_update = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
@@ -382,6 +382,31 @@ QDF_STATUS dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev *pdev,
|
|||||||
return QDF_STATUS_SUCCESS;
|
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)
|
#if defined(QCA_ENHANCED_STATS_SUPPORT) && defined(WLAN_FEATURE_11BE)
|
||||||
void
|
void
|
||||||
dp_mon_tx_stats_update_2_0(struct dp_mon_peer *mon_peer,
|
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,
|
DP_STATS_INCC(mon_peer,
|
||||||
tx.pkt_type[preamble].mcs_count[MAX_MCS - 1],
|
tx.pkt_type[preamble].mcs_count[MAX_MCS - 1],
|
||||||
ppdu->num_msdu,
|
ppdu->num_msdu,
|
||||||
((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE)));
|
((mcs >= MAX_MCS_11BE) && (preamble == DOT11_BE)));
|
||||||
DP_STATS_INCC(mon_peer,
|
DP_STATS_INCC(mon_peer,
|
||||||
tx.pkt_type[preamble].mcs_count[mcs],
|
tx.pkt_type[preamble].mcs_count[mcs],
|
||||||
ppdu->num_msdu,
|
ppdu->num_msdu,
|
||||||
((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE)));
|
((mcs < MAX_MCS_11BE) && (preamble == DOT11_BE)));
|
||||||
DP_STATS_INCC(mon_peer,
|
DP_STATS_INCC(mon_peer,
|
||||||
tx.su_be_ppdu_cnt.mcs_count[MAX_MCS - 1], 1,
|
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)));
|
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_SU)));
|
||||||
DP_STATS_INCC(mon_peer,
|
DP_STATS_INCC(mon_peer,
|
||||||
tx.su_be_ppdu_cnt.mcs_count[mcs], 1,
|
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)));
|
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_SU)));
|
||||||
DP_STATS_INCC(mon_peer,
|
DP_STATS_INCC(mon_peer,
|
||||||
tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_OFDMA].mcs_count[MAX_MCS - 1],
|
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) &&
|
(preamble == DOT11_BE) &&
|
||||||
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA)));
|
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA)));
|
||||||
DP_STATS_INCC(mon_peer,
|
DP_STATS_INCC(mon_peer,
|
||||||
tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_OFDMA].mcs_count[mcs],
|
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) &&
|
(preamble == DOT11_BE) &&
|
||||||
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA)));
|
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA)));
|
||||||
DP_STATS_INCC(mon_peer,
|
DP_STATS_INCC(mon_peer,
|
||||||
tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_MIMO].mcs_count[MAX_MCS - 1],
|
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) &&
|
(preamble == DOT11_BE) &&
|
||||||
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO)));
|
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO)));
|
||||||
DP_STATS_INCC(mon_peer,
|
DP_STATS_INCC(mon_peer,
|
||||||
tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_MIMO].mcs_count[mcs],
|
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) &&
|
(preamble == DOT11_BE) &&
|
||||||
(ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO)));
|
(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 */
|
#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
|
static
|
||||||
QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc)
|
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) &&\
|
#if defined(WDI_EVENT_ENABLE) &&\
|
||||||
(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
|
(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_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
|
#endif
|
||||||
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
||||||
mon_ops->mon_config_enh_rx_capture = NULL;
|
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;
|
dp_mon_filter_setup_enhanced_stats_2_0;
|
||||||
mon_ops->mon_filter_reset_enhanced_stats =
|
mon_ops->mon_filter_reset_enhanced_stats =
|
||||||
dp_mon_filter_reset_enhanced_stats_2_0;
|
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;
|
mon_ops->mon_tx_stats_update = dp_mon_tx_stats_update_2_0;
|
||||||
#endif
|
#endif
|
||||||
#if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
|
#if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
|
||||||
|
@@ -1721,25 +1721,23 @@ void dp_neighbour_peers_detach(struct dp_pdev *pdev)
|
|||||||
qdf_spinlock_destroy(&mon_pdev->neighbour_peer_mutex);
|
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
|
* dp_mon_tx_enable_enhanced_stats() - Enable enhanced Tx stats
|
||||||
* modes are enabled or not.
|
* @pdev: Datapath pdev handle
|
||||||
* @dp_pdev: dp 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_ops = dp_mon_ops_get(soc);
|
||||||
!mon_pdev->mcopy_mode)
|
if (mon_ops && mon_ops->mon_tx_enable_enhanced_stats)
|
||||||
return true;
|
mon_ops->mon_tx_enable_enhanced_stats(pdev);
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef QCA_ENHANCED_STATS_SUPPORT
|
|
||||||
/*
|
/*
|
||||||
* dp_enable_enhanced_stats()- API to enable enhanced statistcs
|
* dp_enable_enhanced_stats()- API to enable enhanced statistcs
|
||||||
* @soc_handle: DP_SOC handle
|
* @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;
|
return QDF_STATUS_E_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) {
|
dp_mon_tx_enable_enhanced_stats(pdev);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
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
|
* 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))
|
if (wlan_cfg_get_txmon_hw_support(pdev->soc->wlan_cfg_ctx))
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) {
|
dp_mon_tx_disable_enhanced_stats(pdev);
|
||||||
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_filter_reset_enhanced_stats(pdev);
|
dp_mon_filter_reset_enhanced_stats(pdev);
|
||||||
if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) {
|
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)));
|
((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC)));
|
||||||
DP_STATS_INCC(mon_peer,
|
DP_STATS_INCC(mon_peer,
|
||||||
tx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu,
|
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,
|
DP_STATS_INCC(mon_peer,
|
||||||
tx.pkt_type[preamble].mcs_count[mcs], num_msdu,
|
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.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.non_ampdu_cnt, num_mpdu, !(ppdu->is_ampdu));
|
||||||
DP_STATS_INCC(mon_peer, tx.pream_punct_cnt, 1, ppdu->pream_punct);
|
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;
|
uint8_t curr_user_index = 0;
|
||||||
struct dp_vdev *vdev;
|
struct dp_vdev *vdev;
|
||||||
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
|
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
|
||||||
|
uint8_t bw;
|
||||||
|
|
||||||
ppdu_desc =
|
ppdu_desc =
|
||||||
(struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
|
(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);
|
HTT_PPDU_STATS_USER_RATE_TLV_HE_RE_GET(*tag_buf);
|
||||||
ppdu_user_desc->txbf =
|
ppdu_user_desc->txbf =
|
||||||
HTT_PPDU_STATS_USER_RATE_TLV_TXBF_GET(*tag_buf);
|
HTT_PPDU_STATS_USER_RATE_TLV_TXBF_GET(*tag_buf);
|
||||||
ppdu_user_desc->bw =
|
bw = HTT_PPDU_STATS_USER_RATE_TLV_BW_GET(*tag_buf);
|
||||||
HTT_PPDU_STATS_USER_RATE_TLV_BW_GET(*tag_buf) - 2;
|
/* 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_user_desc->nss = HTT_PPDU_STATS_USER_RATE_TLV_NSS_GET(*tag_buf);
|
||||||
ppdu_desc->usr_nss_sum += ppdu_user_desc->nss;
|
ppdu_desc->usr_nss_sum += ppdu_user_desc->nss;
|
||||||
ppdu_user_desc->mcs = HTT_PPDU_STATS_USER_RATE_TLV_MCS_GET(*tag_buf);
|
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
|
#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
|
||||||
* 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
|
* @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,
|
void dp_ppdu_desc_deliver(struct dp_pdev *pdev,
|
||||||
struct ppdu_info *ppdu_info)
|
struct ppdu_info *ppdu_info)
|
||||||
{
|
{
|
||||||
@@ -4118,41 +4133,39 @@ void dp_ppdu_desc_deliver(struct dp_pdev *pdev,
|
|||||||
|
|
||||||
qdf_mem_free(s_ppdu_info);
|
qdf_mem_free(s_ppdu_info);
|
||||||
|
|
||||||
/**
|
dp_tx_ppdu_desc_notify(pdev, 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (matched)
|
if (matched)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#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
|
* dp_get_ppdu_desc(): Function to allocate new PPDU status
|
||||||
* desc for new ppdu id
|
* 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))
|
HTT_STATS_FTYPE_SGEN_MU_BAR))
|
||||||
return ppdu_info;
|
return ppdu_info;
|
||||||
|
|
||||||
dp_ppdu_desc_deliver(pdev, ppdu_info);
|
dp_tx_ppdu_desc_deliver(pdev, ppdu_info);
|
||||||
} else {
|
} else {
|
||||||
return ppdu_info;
|
return ppdu_info;
|
||||||
}
|
}
|
||||||
@@ -4515,6 +4528,27 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
|
|||||||
}
|
}
|
||||||
#endif /* QCA_ENHANCED_STATS_SUPPORT */
|
#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
|
* dp_txrx_ppdu_stats_handler() - Function to process HTT PPDU stats from FW
|
||||||
* @soc: DP SOC handle
|
* @soc: DP SOC handle
|
||||||
@@ -4523,15 +4557,13 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
|
|||||||
*
|
*
|
||||||
* return:void
|
* return:void
|
||||||
*/
|
*/
|
||||||
#if defined(WDI_EVENT_ENABLE)
|
|
||||||
#ifdef QCA_ENHANCED_STATS_SUPPORT
|
|
||||||
static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
|
static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
|
||||||
uint8_t pdev_id, qdf_nbuf_t htt_t2h_msg)
|
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;
|
struct ppdu_info *ppdu_info = NULL;
|
||||||
bool free_buf = true;
|
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)
|
if (pdev_id >= MAX_PDEV_CNT)
|
||||||
return true;
|
return true;
|
||||||
@@ -4540,11 +4572,14 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
|
|||||||
if (!pdev)
|
if (!pdev)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
mon_pdev = pdev->monitor_pdev;
|
||||||
|
if (!mon_pdev)
|
||||||
|
return true;
|
||||||
|
|
||||||
if (wlan_cfg_get_txmon_hw_support(soc->wlan_cfg_ctx))
|
if (wlan_cfg_get_txmon_hw_support(soc->wlan_cfg_ctx))
|
||||||
return free_buf;
|
return free_buf;
|
||||||
|
|
||||||
if (!mon_pdev->enhanced_stats_en && !mon_pdev->tx_sniffer_enable &&
|
if (!dp_tx_ppdu_stats_feat_enable_check(pdev))
|
||||||
!mon_pdev->mcopy_mode && !mon_pdev->bpr_enable)
|
|
||||||
return free_buf;
|
return free_buf;
|
||||||
|
|
||||||
qdf_spin_lock_bh(&mon_pdev->ppdu_stats_lock);
|
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)
|
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 = NULL;
|
||||||
mon_pdev->mgmtctrl_frm_info.mgmt_buf_len = 0;
|
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) &&\
|
#if defined(WDI_EVENT_ENABLE) &&\
|
||||||
(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
|
(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
|
||||||
mon_ops->mon_ppdu_stats_ind_handler = NULL;
|
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
|
#endif
|
||||||
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
||||||
mon_ops->mon_config_enh_rx_capture = NULL;
|
mon_ops->mon_config_enh_rx_capture = NULL;
|
||||||
@@ -5562,6 +5600,8 @@ void dp_mon_feature_ops_deregister(struct dp_soc *soc)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef QCA_ENHANCED_STATS_SUPPORT
|
#ifdef QCA_ENHANCED_STATS_SUPPORT
|
||||||
mon_ops->mon_filter_setup_enhanced_stats = NULL;
|
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
|
#ifdef WLAN_FEATURE_11BE
|
||||||
mon_ops->mon_tx_stats_update = NULL;
|
mon_ops->mon_tx_stats_update = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
@@ -510,6 +510,18 @@ dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev,
|
|||||||
bool dp_ppdu_stats_ind_handler(struct htt_soc *soc,
|
bool dp_ppdu_stats_ind_handler(struct htt_soc *soc,
|
||||||
uint32_t *msg_word,
|
uint32_t *msg_word,
|
||||||
qdf_nbuf_t htt_t2h_msg);
|
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
|
#endif
|
||||||
|
|
||||||
struct dp_mon_ops {
|
struct dp_mon_ops {
|
||||||
@@ -595,6 +607,10 @@ struct dp_mon_ops {
|
|||||||
bool (*mon_ppdu_stats_ind_handler)(struct htt_soc *soc,
|
bool (*mon_ppdu_stats_ind_handler)(struct htt_soc *soc,
|
||||||
uint32_t *msg_word,
|
uint32_t *msg_word,
|
||||||
qdf_nbuf_t htt_t2h_msg);
|
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
|
#endif
|
||||||
QDF_STATUS (*mon_htt_ppdu_stats_attach)(struct dp_pdev *pdev);
|
QDF_STATUS (*mon_htt_ppdu_stats_attach)(struct dp_pdev *pdev);
|
||||||
void (*mon_htt_ppdu_stats_detach)(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_filter_reset_enhanced_stats)(struct dp_pdev *pdev);
|
||||||
void (*mon_tx_stats_update)(struct dp_mon_peer *mon_peer,
|
void (*mon_tx_stats_update)(struct dp_mon_peer *mon_peer,
|
||||||
struct cdp_tx_completion_ppdu_user *ppdu);
|
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
|
#endif
|
||||||
#ifdef QCA_MCOPY_SUPPORT
|
#ifdef QCA_MCOPY_SUPPORT
|
||||||
void (*mon_filter_setup_mcopy_mode)(struct dp_pdev *pdev);
|
void (*mon_filter_setup_mcopy_mode)(struct dp_pdev *pdev);
|
||||||
|
Reference in New Issue
Block a user