qcacmn: Add support for undecoded frame error stats
Display phyrx aborted undecoded frame count and the aborted reason statistics as part of pdev rx mon stats. Change-Id: Ia86074e62af3179855734b47801715abd1899fe1 CRs-Fixed: 3123540
This commit is contained in:

committed by
Madan Koyyalamudi

szülő
7908fb906c
commit
70f4513196
@@ -214,6 +214,80 @@ enum {
|
|||||||
CDP_MON_PPDU_END,
|
CDP_MON_PPDU_END,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef QCA_UNDECODED_METADATA_SUPPORT
|
||||||
|
/**
|
||||||
|
* enum cdp_mon_phyrx_abort_reason_code: Phy err code to store the reason
|
||||||
|
* why PHY generated an abort request.
|
||||||
|
*/
|
||||||
|
enum cdp_mon_phyrx_abort_reason_code {
|
||||||
|
CDP_PHYRX_ERR_PHY_OFF = 0,
|
||||||
|
CDP_PHYRX_ERR_SYNTH_OFF,
|
||||||
|
CDP_PHYRX_ERR_OFDMA_TIMING,
|
||||||
|
CDP_PHYRX_ERR_OFDMA_SIGNAL_PARITY,
|
||||||
|
CDP_PHYRX_ERR_OFDMA_RATE_ILLEGAL,
|
||||||
|
CDP_PHYRX_ERR_OFDMA_LENGTH_ILLEGAL,
|
||||||
|
CDP_PHYRX_ERR_OFDMA_RESTART,
|
||||||
|
CDP_PHYRX_ERR_OFDMA_SERVICE,
|
||||||
|
CDP_PHYRX_ERR_PPDU_OFDMA_POWER_DROP,
|
||||||
|
CDP_PHYRX_ERR_CCK_BLOKKER,
|
||||||
|
CDP_PHYRX_ERR_CCK_TIMING = 10,
|
||||||
|
CDP_PHYRX_ERR_CCK_HEADER_CRC,
|
||||||
|
CDP_PHYRX_ERR_CCK_RATE_ILLEGAL,
|
||||||
|
CDP_PHYRX_ERR_CCK_LENGTH_ILLEGAL,
|
||||||
|
CDP_PHYRX_ERR_CCK_RESTART,
|
||||||
|
CDP_PHYRX_ERR_CCK_SERVICE,
|
||||||
|
CDP_PHYRX_ERR_CCK_POWER_DROP,
|
||||||
|
CDP_PHYRX_ERR_HT_CRC_ERR,
|
||||||
|
CDP_PHYRX_ERR_HT_LENGTH_ILLEGAL,
|
||||||
|
CDP_PHYRX_ERR_HT_RATE_ILLEGAL,
|
||||||
|
CDP_PHYRX_ERR_HT_ZLF = 20,
|
||||||
|
CDP_PHYRX_ERR_FALSE_RADAR_EXT,
|
||||||
|
CDP_PHYRX_ERR_GREEN_FIELD,
|
||||||
|
CDP_PHYRX_ERR_BW_GT_DYN_BW,
|
||||||
|
CDP_PHYRX_ERR_HT_LSIG_RATE_MISMATCH,
|
||||||
|
CDP_PHYRX_ERR_VHT_CRC_ERROR,
|
||||||
|
CDP_PHYRX_ERR_VHT_SIGA_UNSUPPORTED,
|
||||||
|
CDP_PHYRX_ERR_VHT_LSIG_LEN_INVALID,
|
||||||
|
CDP_PHYRX_ERR_VHT_NDP_OR_ZLF,
|
||||||
|
CDP_PHYRX_ERR_VHT_NSYM_LT_ZERO,
|
||||||
|
CDP_PHYRX_ERR_VHT_RX_EXTRA_SYMBOL_MISMATCH = 30,
|
||||||
|
CDP_PHYRX_ERR_VHT_RX_SKIP_GROUP_ID0,
|
||||||
|
CDP_PHYRX_ERR_VHT_RX_SKIP_GROUP_ID1TO62,
|
||||||
|
CDP_PHYRX_ERR_VHT_RX_SKIP_GROUP_ID63,
|
||||||
|
CDP_PHYRX_ERR_OFDM_LDPC_DECODER_DISABLED,
|
||||||
|
CDP_PHYRX_ERR_DEFER_NAP,
|
||||||
|
CDP_PHYRX_ERR_FDOMAIN_TIMEOUT,
|
||||||
|
CDP_PHYRX_ERR_LSIG_REL_CHECK,
|
||||||
|
CDP_PHYRX_ERR_BT_COLLISION,
|
||||||
|
CDP_PHYRX_ERR_UNSUPPORTED_MU_FEEDBACK,
|
||||||
|
CDP_PHYRX_ERR_PPDU_TX_INTERRUPT_RX = 40,
|
||||||
|
CDP_PHYRX_ERR_UNSUPPORTED_CBF,
|
||||||
|
CDP_PHYRX_ERR_OTHER,
|
||||||
|
CDP_PHYRX_ERR_HE_SIGA_UNSUPPORTED,
|
||||||
|
CDP_PHYRX_ERR_HE_SIGA_CRC_ERROR,
|
||||||
|
CDP_PHYRX_ERR_HE_SIGB_UNSUPPORTED,
|
||||||
|
CDP_PHYRX_ERR_HE_SIGB_CRC_ERROR,
|
||||||
|
CDP_PHYRX_ERR_HE_MU_MODE_UNSUPPORTED,
|
||||||
|
CDP_PHYRX_ERR_HE_NDP_OR_ZLF,
|
||||||
|
CDP_PHYRX_ERR_HE_NSYM_LT_ZERO,
|
||||||
|
CDP_PHYRX_ERR_HE_RU_PARAMS_UNSUPPORTED = 50,
|
||||||
|
CDP_PHYRX_ERR_HE_NUM_USERS_UNSUPPORTED,
|
||||||
|
CDP_PHYRX_ERR_HE_SOUNDING_PARAMS_UNSUPPORTED,
|
||||||
|
CDP_PHYRX_ERR_HE_EXT_SU_UNSUPPORTED,
|
||||||
|
CDP_PHYRX_ERR_HE_TRIG_UNSUPPORTED,
|
||||||
|
CDP_PHYRX_ERR_HE_LSIG_LEN_INVALID = 55,
|
||||||
|
CDP_PHYRX_ERR_HE_LSIG_RATE_MISMATCH,
|
||||||
|
CDP_PHYRX_ERR_OFDMA_SIGNAL_RELIABILITY,
|
||||||
|
CDP_PHYRX_ERR_HT_NSYM_LT_ZERO,
|
||||||
|
CDP_PHYRX_ERR_VHT_LSIG_RATE_MISMATCH,
|
||||||
|
CDP_PHYRX_ERR_VHT_PAID_GID_MISMATCH = 60,
|
||||||
|
CDP_PHYRX_ERR_VHT_UNSUPPORTED_BW,
|
||||||
|
CDP_PHYRX_ERR_VHT_GI_DISAM_MISMATCH,
|
||||||
|
CDP_PHYRX_ERR_RX_WDG_TIMEOUT = 63,
|
||||||
|
CDP_PHYRX_ERR_MAX
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MAX_PPDU_ID_HIST 128
|
#define MAX_PPDU_ID_HIST 128
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -242,6 +316,8 @@ enum {
|
|||||||
* @dest_ppdu_drop: Number of ppdu dropped from monitor destination ring
|
* @dest_ppdu_drop: Number of ppdu dropped from monitor destination ring
|
||||||
* @mon_link_desc_invalid: msdu link desc invalid count
|
* @mon_link_desc_invalid: msdu link desc invalid count
|
||||||
* @mon_rx_desc_invalid: rx_desc invalid count
|
* @mon_rx_desc_invalid: rx_desc invalid count
|
||||||
|
* @rx_undecoded_count: Received undecoded frame count
|
||||||
|
* @rx_undecoded_error: Rx undecoded errors
|
||||||
*/
|
*/
|
||||||
struct cdp_pdev_mon_stats {
|
struct cdp_pdev_mon_stats {
|
||||||
#ifndef REMOVE_MON_DBG_STATS
|
#ifndef REMOVE_MON_DBG_STATS
|
||||||
@@ -273,5 +349,9 @@ struct cdp_pdev_mon_stats {
|
|||||||
uint32_t mon_link_desc_invalid;
|
uint32_t mon_link_desc_invalid;
|
||||||
uint32_t mon_rx_desc_invalid;
|
uint32_t mon_rx_desc_invalid;
|
||||||
uint32_t mon_nbuf_sanity_err;
|
uint32_t mon_nbuf_sanity_err;
|
||||||
|
#ifdef QCA_UNDECODED_METADATA_SUPPORT
|
||||||
|
uint32_t rx_undecoded_count;
|
||||||
|
uint32_t rx_undecoded_error[CDP_PHYRX_ERR_MAX];
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@@ -42,6 +42,11 @@
|
|||||||
#include "dp_rx_mon_feature.h"
|
#include "dp_rx_mon_feature.h"
|
||||||
#endif /* WLAN_RX_PKT_CAPTURE_ENH */
|
#endif /* WLAN_RX_PKT_CAPTURE_ENH */
|
||||||
|
|
||||||
|
#ifdef QCA_UNDECODED_METADATA_SUPPORT
|
||||||
|
#define MAX_STRING_LEN_PER_FIELD 6
|
||||||
|
#define DP_UNDECODED_ERR_LENGTH (MAX_STRING_LEN_PER_FIELD * CDP_PHYRX_ERR_MAX)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef QCA_MCOPY_SUPPORT
|
#ifdef QCA_MCOPY_SUPPORT
|
||||||
static inline void
|
static inline void
|
||||||
dp_pdev_disable_mcopy_code(struct dp_pdev *pdev)
|
dp_pdev_disable_mcopy_code(struct dp_pdev *pdev)
|
||||||
@@ -767,6 +772,40 @@ QDF_STATUS dp_pdev_get_rx_mon_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef QCA_UNDECODED_METADATA_SUPPORT
|
||||||
|
/**
|
||||||
|
* dp_pdev_get_undecoded_capture_stats() - Get undecoded metadata captured
|
||||||
|
* monitor pdev stats
|
||||||
|
* @mon_pdev: Monitor PDEV handle
|
||||||
|
* @rx_mon_stats: Monitor pdev status/destination ring stats
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
dp_pdev_get_undecoded_capture_stats(struct dp_mon_pdev *mon_pdev,
|
||||||
|
struct cdp_pdev_mon_stats *rx_mon_stats)
|
||||||
|
{
|
||||||
|
char undecoded_error[DP_UNDECODED_ERR_LENGTH];
|
||||||
|
uint8_t index = 0, i;
|
||||||
|
|
||||||
|
DP_PRINT_STATS("Rx Undecoded Frame count:%d",
|
||||||
|
rx_mon_stats->rx_undecoded_count);
|
||||||
|
index = 0;
|
||||||
|
for (i = 0; i < (CDP_PHYRX_ERR_MAX); i++) {
|
||||||
|
index += qdf_snprint(&undecoded_error[index],
|
||||||
|
DP_UNDECODED_ERR_LENGTH - index,
|
||||||
|
" %d", rx_mon_stats->rx_undecoded_error[i]);
|
||||||
|
}
|
||||||
|
DP_PRINT_STATS("Undecoded Error (0-63):%s", undecoded_error);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void
|
||||||
|
dp_pdev_get_undecoded_capture_stats(struct dp_mon_pdev *mon_pdev,
|
||||||
|
struct cdp_pdev_mon_stats *rx_mon_stats)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
|
dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
|
||||||
{
|
{
|
||||||
@@ -848,6 +887,8 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
|
|||||||
qdf_mem_free(dest_ring_ppdu_ids);
|
qdf_mem_free(dest_ring_ppdu_ids);
|
||||||
DP_PRINT_STATS("mon_rx_dest_stuck = %d",
|
DP_PRINT_STATS("mon_rx_dest_stuck = %d",
|
||||||
rx_mon_stats->mon_rx_dest_stuck);
|
rx_mon_stats->mon_rx_dest_stuck);
|
||||||
|
|
||||||
|
dp_pdev_get_undecoded_capture_stats(mon_pdev, rx_mon_stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef QCA_SUPPORT_BPR
|
#ifdef QCA_SUPPORT_BPR
|
||||||
|
@@ -1222,6 +1222,8 @@ dp_rx_handle_ppdu_undecoded_metadata(struct dp_soc *soc, struct dp_pdev *pdev,
|
|||||||
{
|
{
|
||||||
qdf_nbuf_t ppdu_nbuf;
|
qdf_nbuf_t ppdu_nbuf;
|
||||||
struct cdp_rx_indication_ppdu *cdp_rx_ppdu;
|
struct cdp_rx_indication_ppdu *cdp_rx_ppdu;
|
||||||
|
uint8_t abort_reason = 0;
|
||||||
|
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||||
|
|
||||||
/* Return if RX_ABORT not set */
|
/* Return if RX_ABORT not set */
|
||||||
if (ppdu_info->rx_status.phyrx_abort == 0)
|
if (ppdu_info->rx_status.phyrx_abort == 0)
|
||||||
@@ -1240,8 +1242,17 @@ dp_rx_handle_ppdu_undecoded_metadata(struct dp_soc *soc, struct dp_pdev *pdev,
|
|||||||
ppdu_info, cdp_rx_ppdu);
|
ppdu_info, cdp_rx_ppdu);
|
||||||
|
|
||||||
if (!qdf_nbuf_put_tail(ppdu_nbuf,
|
if (!qdf_nbuf_put_tail(ppdu_nbuf,
|
||||||
sizeof(struct cdp_rx_indication_ppdu)))
|
sizeof(struct cdp_rx_indication_ppdu))) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mon_pdev->rx_mon_stats.rx_undecoded_count++;
|
||||||
|
abort_reason = cdp_rx_ppdu->phyrx_abort_reason;
|
||||||
|
if (abort_reason < CDP_PHYRX_ERR_MAX) {
|
||||||
|
mon_pdev->rx_mon_stats.rx_undecoded_error[abort_reason] += 1;
|
||||||
|
} else {
|
||||||
|
mon_pdev->rx_mon_stats.rx_undecoded_error[CDP_PHYRX_ERR_OTHER] += 1;
|
||||||
|
}
|
||||||
|
|
||||||
dp_wdi_event_handler(WDI_EVENT_RX_PPDU_DESC_UNDECODED_METADATA,
|
dp_wdi_event_handler(WDI_EVENT_RX_PPDU_DESC_UNDECODED_METADATA,
|
||||||
soc, ppdu_nbuf, HTT_INVALID_PEER,
|
soc, ppdu_nbuf, HTT_INVALID_PEER,
|
||||||
|
Reference in New Issue
Block a user