qcacmn: Add support to configure phy error mask
The monitor status ring is configured for filtering in undecoded phy error packets. Each phy error can be controlled using a specific error mask configuration. Added below cfg80211tool command to configure phy error mask for filtering undecoded phy error packets. cfg80211tool wifix set_phyrx_error_mask mask_0to31 mask_32to63 cfg80211tool wifix get_phyrx_error_mask Change-Id: I5e4f6a49458cc534d6d1d0f7f2a7424f3cc747b4
Dieser Commit ist enthalten in:

committet von
Madan Koyyalamudi

Ursprung
e85fbce095
Commit
3498dbc3a6
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -1428,4 +1429,53 @@ static inline QDF_STATUS cdp_get_uplink_delay(ol_txrx_soc_handle soc,
|
|||||||
}
|
}
|
||||||
#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */
|
#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */
|
||||||
|
|
||||||
|
#ifdef QCA_UNDECODED_METADATA_SUPPORT
|
||||||
|
/**
|
||||||
|
* cdp_txrx_set_pdev_phyrx_error_mask() - set phyrx error mask
|
||||||
|
* @soc: opaque soc handle
|
||||||
|
* @pdev_id: id of data path pdev handle
|
||||||
|
* @mask1: mask to configure 0 to 31 phy error
|
||||||
|
* @mask2: mask to configure 32 to 63 phy error
|
||||||
|
*
|
||||||
|
* Return: status: 0 - Success, non-zero: Failure
|
||||||
|
*/
|
||||||
|
static inline
|
||||||
|
QDF_STATUS cdp_txrx_set_pdev_phyrx_error_mask(ol_txrx_soc_handle soc,
|
||||||
|
uint8_t pdev_id, uint32_t mask,
|
||||||
|
uint32_t mask_cont)
|
||||||
|
{
|
||||||
|
if (!soc || !soc->ops) {
|
||||||
|
dp_cdp_debug("Invalid Instance:");
|
||||||
|
QDF_BUG(0);
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!soc->ops->ctrl_ops ||
|
||||||
|
!soc->ops->ctrl_ops->txrx_set_pdev_phyrx_error_mask)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
return soc->ops->ctrl_ops->txrx_set_pdev_phyrx_error_mask
|
||||||
|
(soc, pdev_id, mask, mask_cont);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
QDF_STATUS cdp_txrx_get_pdev_phyrx_error_mask(ol_txrx_soc_handle soc,
|
||||||
|
uint8_t pdev_id, uint32_t *mask,
|
||||||
|
uint32_t *mask_cont)
|
||||||
|
{
|
||||||
|
if (!soc || !soc->ops) {
|
||||||
|
dp_cdp_debug("Invalid Instance:");
|
||||||
|
QDF_BUG(0);
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!soc->ops->ctrl_ops ||
|
||||||
|
!soc->ops->ctrl_ops->txrx_get_pdev_phyrx_error_mask)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
return soc->ops->ctrl_ops->txrx_get_pdev_phyrx_error_mask
|
||||||
|
(soc, pdev_id, mask, mask_cont);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _CDP_TXRX_CTRL_H_ */
|
#endif /* _CDP_TXRX_CTRL_H_ */
|
||||||
|
@@ -862,6 +862,16 @@ struct cdp_ctrl_ops {
|
|||||||
uint8_t vdev_id,
|
uint8_t vdev_id,
|
||||||
uint32_t *val);
|
uint32_t *val);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef QCA_UNDECODED_METADATA_SUPPORT
|
||||||
|
QDF_STATUS (*txrx_set_pdev_phyrx_error_mask)(struct cdp_soc_t *soc,
|
||||||
|
uint8_t pdev_id,
|
||||||
|
uint32_t mask,
|
||||||
|
uint32_t mask_cont);
|
||||||
|
QDF_STATUS (*txrx_get_pdev_phyrx_error_mask)(struct cdp_soc_t *soc,
|
||||||
|
uint8_t pdev_id,
|
||||||
|
uint32_t *mask,
|
||||||
|
uint32_t *mask_cont);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cdp_me_ops {
|
struct cdp_me_ops {
|
||||||
|
@@ -9630,6 +9630,40 @@ static QDF_STATUS dp_set_pdev_param(struct cdp_soc_t *cdp_soc, uint8_t pdev_id,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef QCA_UNDECODED_METADATA_SUPPORT
|
||||||
|
static
|
||||||
|
QDF_STATUS dp_set_pdev_phyrx_error_mask(struct cdp_soc_t *cdp_soc,
|
||||||
|
uint8_t pdev_id, uint32_t mask,
|
||||||
|
uint32_t mask_cont)
|
||||||
|
{
|
||||||
|
struct dp_pdev *pdev =
|
||||||
|
dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)cdp_soc,
|
||||||
|
pdev_id);
|
||||||
|
|
||||||
|
if (!pdev)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
return dp_monitor_config_undecoded_metadata_phyrx_error_mask(pdev,
|
||||||
|
mask, mask_cont);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
QDF_STATUS dp_get_pdev_phyrx_error_mask(struct cdp_soc_t *cdp_soc,
|
||||||
|
uint8_t pdev_id, uint32_t *mask,
|
||||||
|
uint32_t *mask_cont)
|
||||||
|
{
|
||||||
|
struct dp_pdev *pdev =
|
||||||
|
dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)cdp_soc,
|
||||||
|
pdev_id);
|
||||||
|
|
||||||
|
if (!pdev)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
return dp_monitor_get_undecoded_metadata_phyrx_error_mask(pdev,
|
||||||
|
mask, mask_cont);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef QCA_PEER_EXT_STATS
|
#ifdef QCA_PEER_EXT_STATS
|
||||||
static void dp_rx_update_peer_delay_stats(struct dp_soc *soc,
|
static void dp_rx_update_peer_delay_stats(struct dp_soc *soc,
|
||||||
qdf_nbuf_t nbuf)
|
qdf_nbuf_t nbuf)
|
||||||
@@ -12165,6 +12199,10 @@ static struct cdp_ctrl_ops dp_ops_ctrl = {
|
|||||||
.txrx_set_tsf_ul_delay_report = dp_set_tsf_ul_delay_report,
|
.txrx_set_tsf_ul_delay_report = dp_set_tsf_ul_delay_report,
|
||||||
.txrx_get_uplink_delay = dp_get_uplink_delay,
|
.txrx_get_uplink_delay = dp_get_uplink_delay,
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef QCA_UNDECODED_METADATA_SUPPORT
|
||||||
|
.txrx_set_pdev_phyrx_error_mask = dp_set_pdev_phyrx_error_mask,
|
||||||
|
.txrx_get_pdev_phyrx_error_mask = dp_get_pdev_phyrx_error_mask,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct cdp_me_ops dp_ops_me = {
|
static struct cdp_me_ops dp_ops_me = {
|
||||||
|
@@ -209,6 +209,8 @@ void dp_mon_filter_setup_undecoded_metadata_capture_1_0(struct dp_pdev *pdev)
|
|||||||
filter.tlv_filter.fp_phy_err = 1;
|
filter.tlv_filter.fp_phy_err = 1;
|
||||||
filter.tlv_filter.fp_phy_err_buf_src = SW2RXDMA_BUF_SOURCE_RING;
|
filter.tlv_filter.fp_phy_err_buf_src = SW2RXDMA_BUF_SOURCE_RING;
|
||||||
filter.tlv_filter.fp_phy_err_buf_dest = RXDMA2SW_RING;
|
filter.tlv_filter.fp_phy_err_buf_dest = RXDMA2SW_RING;
|
||||||
|
filter.tlv_filter.phy_err_mask = mon_pdev->phyrx_error_mask;
|
||||||
|
filter.tlv_filter.phy_err_mask_cont = mon_pdev->phyrx_error_mask_cont;
|
||||||
|
|
||||||
filter.tlv_filter.phy_err_filter_valid = 1;
|
filter.tlv_filter.phy_err_filter_valid = 1;
|
||||||
|
|
||||||
|
@@ -1001,6 +1001,10 @@ struct dp_mon_pdev {
|
|||||||
/* indicates if spcl vap is configured */
|
/* indicates if spcl vap is configured */
|
||||||
bool scan_spcl_vap_configured;
|
bool scan_spcl_vap_configured;
|
||||||
bool undecoded_metadata_capture;
|
bool undecoded_metadata_capture;
|
||||||
|
#ifdef QCA_UNDECODED_METADATA_SUPPORT
|
||||||
|
uint32_t phyrx_error_mask;
|
||||||
|
uint32_t phyrx_error_mask_cont;
|
||||||
|
#endif
|
||||||
#ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS
|
#ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS
|
||||||
/* enable spcl vap stats reset on ch change */
|
/* enable spcl vap stats reset on ch change */
|
||||||
bool reset_scan_spcl_vap_stats_enable;
|
bool reset_scan_spcl_vap_stats_enable;
|
||||||
@@ -2035,6 +2039,53 @@ QDF_STATUS dp_monitor_config_undecoded_metadata_capture(struct dp_pdev *pdev,
|
|||||||
|
|
||||||
return monitor_ops->mon_config_undecoded_metadata_capture(pdev, val);
|
return monitor_ops->mon_config_undecoded_metadata_capture(pdev, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline QDF_STATUS
|
||||||
|
dp_monitor_config_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev,
|
||||||
|
int mask, int mask_cont)
|
||||||
|
{
|
||||||
|
struct dp_mon_ops *monitor_ops;
|
||||||
|
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||||
|
struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
|
||||||
|
|
||||||
|
if (!mon_soc)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
if (!mon_pdev)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
monitor_ops = mon_soc->mon_ops;
|
||||||
|
if (!monitor_ops ||
|
||||||
|
!monitor_ops->mon_config_undecoded_metadata_capture) {
|
||||||
|
dp_mon_debug("callback not registered");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mon_pdev->undecoded_metadata_capture) {
|
||||||
|
qdf_info("mask:0x%x mask_cont:0x%x", mask, mask_cont);
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
mon_pdev->phyrx_error_mask = mask;
|
||||||
|
mon_pdev->phyrx_error_mask_cont = mask_cont;
|
||||||
|
|
||||||
|
return monitor_ops->mon_config_undecoded_metadata_capture(pdev, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline QDF_STATUS
|
||||||
|
dp_monitor_get_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev,
|
||||||
|
int *mask, int *mask_cont)
|
||||||
|
{
|
||||||
|
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||||
|
|
||||||
|
if (!mon_pdev)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
*mask = mon_pdev->phyrx_error_mask;
|
||||||
|
*mask_cont = mon_pdev->phyrx_error_mask_cont;
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
static inline
|
static inline
|
||||||
QDF_STATUS dp_monitor_config_undecoded_metadata_capture(struct dp_pdev *pdev,
|
QDF_STATUS dp_monitor_config_undecoded_metadata_capture(struct dp_pdev *pdev,
|
||||||
@@ -2042,7 +2093,21 @@ QDF_STATUS dp_monitor_config_undecoded_metadata_capture(struct dp_pdev *pdev,
|
|||||||
{
|
{
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
static inline QDF_STATUS
|
||||||
|
dp_monitor_config_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev,
|
||||||
|
int mask1, int mask2)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline QDF_STATUS
|
||||||
|
dp_monitor_get_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev,
|
||||||
|
int *mask, int *mask_cont)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif /* QCA_UNDECODED_METADATA_SUPPORT */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dp_monitor_htt_srng_setup() - Setup htt srng
|
* dp_monitor_htt_srng_setup() - Setup htt srng
|
||||||
|
@@ -49,6 +49,9 @@ int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = {
|
|||||||
"DP MON FILTER PKT LOG HYBRID MODE",
|
"DP MON FILTER PKT LOG HYBRID MODE",
|
||||||
#endif
|
#endif
|
||||||
#endif /* WDI_EVENT_ENABLE */
|
#endif /* WDI_EVENT_ENABLE */
|
||||||
|
#ifdef QCA_UNDECODED_METADATA_SUPPORT
|
||||||
|
"DP MON FILTER RX UNDECODED METADATA CAPTURE MODE",
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev,
|
void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev,
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren