diff --git a/dp/inc/cdp_txrx_ctrl.h b/dp/inc/cdp_txrx_ctrl.h index c9cbc2eb7a..abba0714b0 100644 --- a/dp/inc/cdp_txrx_ctrl.h +++ b/dp/inc/cdp_txrx_ctrl.h @@ -1,5 +1,6 @@ /* * 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 * 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 */ +#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_ */ diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 09dee54703..f73cb37c94 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -862,6 +862,16 @@ struct cdp_ctrl_ops { uint8_t vdev_id, uint32_t *val); #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 { diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index bed3cfccdc..39941636cd 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -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; } +#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 static void dp_rx_update_peer_delay_stats(struct dp_soc *soc, 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_get_uplink_delay = dp_get_uplink_delay, #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 = { diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c index 969035e32f..2173417869 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c @@ -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_buf_src = SW2RXDMA_BUF_SOURCE_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; diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index 388dedd3c2..a5970da8df 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -1001,6 +1001,10 @@ struct dp_mon_pdev { /* indicates if spcl vap is configured */ bool scan_spcl_vap_configured; 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 /* enable spcl vap stats reset on ch change */ 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); } + +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 static inline 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; } -#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 diff --git a/dp/wifi3.0/monitor/dp_mon_filter.c b/dp/wifi3.0/monitor/dp_mon_filter.c index e7f3266d79..743a8b3a98 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.c +++ b/dp/wifi3.0/monitor/dp_mon_filter.c @@ -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", #endif #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,