From 13554f0cdc1a079e5546134f9a0ad936e42ef3b4 Mon Sep 17 00:00:00 2001 From: Srinivas Girigowda Date: Thu, 15 Dec 2022 17:16:34 -0800 Subject: [PATCH] qcacmn: Add support for local packet capture stop Add support for local packet capture stop. Change-Id: Ib12574f5b418ea009ec35ef85e170bc8c592c86f CRs-Fixed: 3415812 --- dp/inc/cdp_txrx_mon.h | 30 ++++++++++++++ dp/inc/cdp_txrx_ops.h | 4 ++ dp/wifi3.0/monitor/1.0/dp_mon_1.0.c | 1 + dp/wifi3.0/monitor/2.0/dp_mon_2.0.c | 1 + dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c | 5 +++ dp/wifi3.0/monitor/dp_mon.h | 1 + dp/wifi3.0/monitor/dp_mon_filter.c | 46 ++++++++++++++++++++++ dp/wifi3.0/monitor/dp_mon_filter.h | 16 ++++++++ 8 files changed, 104 insertions(+) diff --git a/dp/inc/cdp_txrx_mon.h b/dp/inc/cdp_txrx_mon.h index 4bcd8f88f0..eeb9cac358 100644 --- a/dp/inc/cdp_txrx_mon.h +++ b/dp/inc/cdp_txrx_mon.h @@ -332,6 +332,30 @@ QDF_STATUS cdp_start_local_pkt_capture(ol_txrx_soc_handle soc, return soc->ops->mon_ops->start_local_pkt_capture(soc, pdev_id, filter); } +/** + * cdp_stop_local_pkt_capture() - stop local pkt capture + * @soc: opaque soc handle + * @pdev_id: pdev_id + * + * Return: QDF_STATUS_SUCCESS if success + * QDF_STATUS_E_FAILURE if error + */ +static inline +QDF_STATUS cdp_stop_local_pkt_capture(ol_txrx_soc_handle soc, uint8_t pdev_id) +{ + if (!soc || !soc->ops) { + dp_cdp_debug("Invalid Instance"); + QDF_BUG(0); + return QDF_STATUS_E_FAILURE; + } + + if (!soc->ops->mon_ops || + !soc->ops->mon_ops->stop_local_pkt_capture) + return QDF_STATUS_E_FAILURE; + + return soc->ops->mon_ops->stop_local_pkt_capture(soc, pdev_id); +} + #else static inline QDF_STATUS cdp_start_local_pkt_capture(ol_txrx_soc_handle soc, @@ -341,6 +365,12 @@ QDF_STATUS cdp_start_local_pkt_capture(ol_txrx_soc_handle soc, return QDF_STATUS_E_NOSUPPORT; } +static inline +QDF_STATUS cdp_stop_local_pkt_capture(ol_txrx_soc_handle soc, uint8_t pdev_id) +{ + return QDF_STATUS_E_NOSUPPORT; +} + #endif /* WLAN_FEATURE_LOCAL_PKT_CAPTURE */ #endif diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index d887cc31c7..519c2fc919 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -994,6 +994,7 @@ struct cdp_me_ops { * @txrx_cfr_filter: Handler to configure host rx monitor status ring * @txrx_update_mon_mac_filter: Handler to configure mon mac filter * @start_local_pkt_capture: start local packet capture + * @stop_local_pkt_capture: stop local packet capture */ struct cdp_mon_ops { @@ -1106,6 +1107,9 @@ struct cdp_mon_ops { QDF_STATUS (*start_local_pkt_capture) (struct cdp_soc_t *soc, uint8_t pdev_id, struct cdp_monitor_filter *filter); + + QDF_STATUS (*stop_local_pkt_capture)(struct cdp_soc_t *soc, + uint8_t pdev_id); #endif }; diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c index 797449a5f5..12276094b2 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c @@ -1471,6 +1471,7 @@ struct cdp_mon_ops dp_ops_mon_1_0 = { dp_mon_pdev_params_rssi_dbm_conv, #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE .start_local_pkt_capture = dp_mon_start_local_pkt_capture, + .stop_local_pkt_capture = dp_mon_stop_local_pkt_capture, #endif /* WLAN_FEATURE_LOCAL_PKT_CAPTURE */ }; diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c index 66a7911042..081094f168 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c @@ -1455,6 +1455,7 @@ struct cdp_mon_ops dp_ops_mon_2_0 = { .txrx_update_mon_mac_filter = NULL, #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE .start_local_pkt_capture = NULL, + .stop_local_pkt_capture = NULL, #endif /* WLAN_FEATURE_LOCAL_PKT_CAPTURE */ }; diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c index de0d4a84da..786232e58c 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c @@ -3469,8 +3469,13 @@ void dp_mon_filter_reset_local_pkt_capture_tx(struct dp_pdev *pdev) enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_TXMON_DEST; struct dp_mon_pdev_be *mon_pdev_be = NULL; + struct dp_pdev_tx_monitor_be *tx_mon_be; mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); + + tx_mon_be = &mon_pdev_be->tx_monitor_be; + tx_mon_be->mode = TX_MON_BE_DISABLE; + mon_pdev_be->tx_mon_mode = 0; filter.tx_valid = true; mon_pdev_be->filter_be[mode][srng_type] = filter; } diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index 170f5824d1..ad19ed1e21 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -874,6 +874,7 @@ struct dp_mon_ops { struct htt_rx_ring_tlv_filter *tlv_filter); #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE QDF_STATUS (*start_local_pkt_capture)(struct dp_pdev *pdev); + QDF_STATUS (*stop_local_pkt_capture)(struct dp_pdev *pdev); #endif /* WLAN_FEATURE_LOCAL_PKT_CAPTURE */ }; diff --git a/dp/wifi3.0/monitor/dp_mon_filter.c b/dp/wifi3.0/monitor/dp_mon_filter.c index 2ef65c3c54..6bb782415f 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.c +++ b/dp/wifi3.0/monitor/dp_mon_filter.c @@ -1010,4 +1010,50 @@ QDF_STATUS dp_mon_start_local_pkt_capture(struct cdp_soc_t *cdp_soc, return status; } +QDF_STATUS dp_mon_stop_local_pkt_capture(struct cdp_soc_t *cdp_soc, + uint8_t pdev_id) +{ + bool local_pkt_capture_running; + struct dp_soc *soc = cdp_soc_t_to_dp_soc(cdp_soc); + struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); + struct dp_mon_pdev *mon_pdev; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + if (!pdev) { + dp_mon_filter_err("pdev Context is null"); + return QDF_STATUS_E_INVAL; + } + + mon_pdev = pdev->monitor_pdev; + local_pkt_capture_running = + dp_mon_get_local_pkt_capture_running(cdp_soc, pdev_id); + if (!local_pkt_capture_running) { + dp_mon_filter_err("Local pkt capture is not running"); + return QDF_STATUS_SUCCESS; + } + + qdf_spin_lock_bh(&mon_pdev->mon_lock); + dp_mon_reset_local_pkt_capture_rx_filter(pdev); + status = dp_mon_filter_update(pdev); + if (QDF_IS_STATUS_ERROR(status)) { + dp_mon_filter_err("local pkt capture set rx filter failed"); + qdf_spin_unlock_bh(&mon_pdev->mon_lock); + return status; + } + qdf_spin_unlock_bh(&mon_pdev->mon_lock); + + mon_pdev->mon_filter_mode = 0; + mon_pdev->fp_mgmt_filter = 0; + mon_pdev->fp_ctrl_filter = 0; + mon_pdev->fp_data_filter = 0; + + qdf_spin_lock_bh(&mon_pdev->mon_lock); + dp_mon_filter_reset_tx_mon_mode(pdev); + dp_tx_mon_filter_update(pdev); + qdf_spin_unlock_bh(&mon_pdev->mon_lock); + dp_mon_filter_debug("local pkt capture stopped"); + + return QDF_STATUS_SUCCESS; +} + #endif /* WLAN_FEATURE_LOCAL_PKT_CAPTURE */ diff --git a/dp/wifi3.0/monitor/dp_mon_filter.h b/dp/wifi3.0/monitor/dp_mon_filter.h index f38b5c1d98..7d95401fb6 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.h +++ b/dp/wifi3.0/monitor/dp_mon_filter.h @@ -574,6 +574,14 @@ dp_rx_mon_hdr_length_set(uint32_t *msg_word, QDF_STATUS dp_mon_start_local_pkt_capture(struct cdp_soc_t *cdp_soc, uint8_t pdev_id, struct cdp_monitor_filter *filter); + +/** + * dp_mon_stop_local_pkt_capture() - stop local packet capture + * @cdp_soc: cdp soc + * @pdev_id: pdev id + */ +QDF_STATUS dp_mon_stop_local_pkt_capture(struct cdp_soc_t *cdp_soc, + uint8_t pdev_id); #else static inline QDF_STATUS dp_mon_start_local_pkt_capture(struct cdp_soc_t *cdp_soc, @@ -582,5 +590,13 @@ QDF_STATUS dp_mon_start_local_pkt_capture(struct cdp_soc_t *cdp_soc, { return QDF_STATUS_E_NOSUPPORT; } + +static inline +QDF_STATUS dp_mon_stop_local_pkt_capture(struct cdp_soc_t *cdp_soc, + uint8_t pdev_id) +{ + return QDF_STATUS_E_NOSUPPORT; +} + #endif /* WLAN_FEATURE_LOCAL_PKT_CAPTURE */ #endif /* #ifndef _DP_MON_FILTER_H_ */