From 7f485d5e89baa389855de280bd3f83befbf6efec Mon Sep 17 00:00:00 2001 From: Nandha Kishore Easwaran Date: Thu, 26 May 2022 17:26:05 +0530 Subject: [PATCH] qcacmn: Split tx and rx buffer add function Split tx and rx monitor buffer add function so that they can be indivudually called when lite monitor mode is enabled. Change-Id: I9996d0261f1912237bd6fa45058d410698b9fa28 CRs-Fixed: 3206170 --- dp/wifi3.0/dp_main.c | 3 +- dp/wifi3.0/monitor/1.0/dp_mon_1.0.c | 3 +- dp/wifi3.0/monitor/2.0/dp_mon_2.0.c | 101 +++++++++++++++++++++------- dp/wifi3.0/monitor/2.0/dp_mon_2.0.h | 16 +++++ dp/wifi3.0/monitor/dp_mon.h | 14 ++-- 5 files changed, 102 insertions(+), 35 deletions(-) diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index dcc935ea67..4464652207 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -6586,8 +6586,7 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc, if (wlan_op_mode_monitor == vdev->opmode) { if (dp_monitor_vdev_attach(vdev) == QDF_STATUS_SUCCESS) { dp_monitor_pdev_set_mon_vdev(vdev); - dp_monitor_vdev_set_monitor_mode_buf_rings(pdev); - return QDF_STATUS_SUCCESS; + return dp_monitor_vdev_set_monitor_mode_buf_rings(pdev); } return QDF_STATUS_E_FAILURE; } 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 c63fbd6a82..66f75bcfc6 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 @@ -353,7 +353,7 @@ QDF_STATUS dp_mon_rings_alloc_1_0(struct dp_pdev *pdev) #endif #ifdef QCA_MONITOR_PKT_SUPPORT -void dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) +QDF_STATUS dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) { uint32_t mac_id; uint32_t mac_for_pdev; @@ -392,6 +392,7 @@ void dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) } } } + return QDF_STATUS_SUCCESS; } #endif 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 dd5ee4dcbb..bdf48ce883 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 @@ -398,10 +398,9 @@ QDF_STATUS dp_mon_desc_pool_alloc(uint32_t pool_size, return QDF_STATUS_SUCCESS; } -static -void dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev *pdev) +QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_rx_2_0(struct dp_pdev *pdev) { - int tx_mon_max_entries, rx_mon_max_entries; + int rx_mon_max_entries; struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx; struct dp_soc *soc = pdev->soc; struct dp_mon_soc *mon_soc = soc->monitor_soc; @@ -410,54 +409,106 @@ void dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev *pdev) if (!mon_soc_be) { dp_mon_err("DP MON SOC is NULL"); - return; + return QDF_STATUS_E_FAILURE; } soc_cfg_ctx = soc->wlan_cfg_ctx; rx_mon_max_entries = wlan_cfg_get_dp_soc_rx_mon_buf_ring_size(soc_cfg_ctx); - tx_mon_max_entries = wlan_cfg_get_dp_soc_tx_mon_buf_ring_size(soc_cfg_ctx); hal_set_low_threshold(soc->rxdma_mon_buf_ring[0].hal_srng, rx_mon_max_entries >> 2); status = htt_srng_setup(soc->htt_handle, 0, soc->rxdma_mon_buf_ring[0].hal_srng, RXDMA_MONITOR_BUF); + if (status != QDF_STATUS_SUCCESS) { - dp_err("Failed to send htt srng setup message for Rx mon buf ring"); - return; + dp_mon_err("Failed to send htt srng setup message for Rx mon buf ring"); + return status; } + if (mon_soc_be->rx_mon_ring_fill_level < rx_mon_max_entries) { + status = dp_rx_mon_buffers_alloc(soc, + (rx_mon_max_entries - + mon_soc_be->rx_mon_ring_fill_level)); + if (status != QDF_STATUS_SUCCESS) { + dp_mon_err("%pK: Rx mon buffers allocation failed", soc); + return status; + } + mon_soc_be->rx_mon_ring_fill_level += + (rx_mon_max_entries - + mon_soc_be->rx_mon_ring_fill_level); + } + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_tx_2_0(struct dp_pdev *pdev) +{ + int tx_mon_max_entries; + struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx; + struct dp_soc *soc = pdev->soc; + struct dp_mon_soc *mon_soc = soc->monitor_soc; + struct dp_mon_soc_be *mon_soc_be = + dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); + QDF_STATUS status; + + if (!mon_soc_be) { + dp_mon_err("DP MON SOC is NULL"); + return QDF_STATUS_E_FAILURE; + } + + soc_cfg_ctx = soc->wlan_cfg_ctx; + tx_mon_max_entries = + wlan_cfg_get_dp_soc_tx_mon_buf_ring_size(soc_cfg_ctx); + hal_set_low_threshold(mon_soc_be->tx_mon_buf_ring.hal_srng, tx_mon_max_entries >> 2); status = htt_srng_setup(soc->htt_handle, 0, mon_soc_be->tx_mon_buf_ring.hal_srng, TX_MONITOR_BUF); + if (status != QDF_STATUS_SUCCESS) { - dp_err("Failed to send htt srng setup message for Tx mon buf ring"); - return; - } - - if (mon_soc_be->rx_mon_ring_fill_level < rx_mon_max_entries) { - if (dp_rx_mon_buffers_alloc(soc, - (rx_mon_max_entries - mon_soc_be->rx_mon_ring_fill_level))) { - dp_mon_err("%pK: Rx mon buffers allocation failed", soc); - return; - } - - mon_soc_be->rx_mon_ring_fill_level += - (rx_mon_max_entries - mon_soc_be->rx_mon_ring_fill_level); + dp_mon_err("Failed to send htt srng setup message for Tx mon buf ring"); + return status; } if (mon_soc_be->tx_mon_ring_fill_level < tx_mon_max_entries) { - if (dp_tx_mon_buffers_alloc(soc, - (tx_mon_max_entries - mon_soc_be->tx_mon_ring_fill_level))) { + status = dp_tx_mon_buffers_alloc(soc, + (tx_mon_max_entries - + mon_soc_be->tx_mon_ring_fill_level)); + if (status != QDF_STATUS_SUCCESS) { dp_mon_err("%pK: Tx mon buffers allocation failed", soc); - return; + return status; } - mon_soc_be->tx_mon_ring_fill_level += - (tx_mon_max_entries - mon_soc_be->tx_mon_ring_fill_level); + (tx_mon_max_entries - + mon_soc_be->tx_mon_ring_fill_level); } + + return QDF_STATUS_SUCCESS; +} + +static +QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev *pdev) +{ + int status; + struct dp_soc *soc = pdev->soc; + + status = dp_vdev_set_monitor_mode_buf_rings_rx_2_0(pdev); + if (status != QDF_STATUS_SUCCESS) { + dp_mon_err("%pK: Rx monitor extra buffer allocation failed", + soc); + return status; + } + + status = dp_vdev_set_monitor_mode_buf_rings_tx_2_0(pdev); + if (status != QDF_STATUS_SUCCESS) { + dp_mon_err("%pK: Tx monitor extra buffer allocation failed", + soc); + return status; + } + + return QDF_STATUS_SUCCESS; } static diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h index b8ba9a2308..1b57efa890 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h @@ -297,6 +297,22 @@ void dp_mon_filter_show_filter_be(enum dp_mon_filter_mode mode, void dp_mon_filter_show_tx_filter_be(enum dp_mon_filter_mode mode, struct dp_mon_filter_be *filter); +/** + * dp_vdev_set_monitor_mode_buf_rings_tx_2_0() - Add buffers to tx ring + * @pdev: Pointer to dp_pdev object + * + * Return: QDF_STATUS + */ +QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_tx_2_0(struct dp_pdev *pdev); + +/** + * dp_vdev_set_monitor_mode_buf_rings_rx_2_0() - Add buffers to rx ring + * @pdev: Pointer to dp_pdev object + * + * Return: QDF_STATUS + */ +QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_rx_2_0(struct dp_pdev *pdev); + #ifdef QCA_ENHANCED_STATS_SUPPORT /** * dp_mon_get_puncture_type() - Get puncture type diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index f1cfd859ab..2d6769b300 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -471,9 +471,9 @@ void dp_pktlogmod_exit(struct dp_pdev *handle) * * @pdev: DP pdev object * - * Return: void + * Return: QDF_STATUS */ -void dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev); +QDF_STATUS dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev); /** * dp_vdev_set_monitor_mode_rings () - set monitor mode rings @@ -489,7 +489,7 @@ QDF_STATUS dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev, uint8_t delayed_replenish); #else -static inline void +static inline QDF_STATUS dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) { } @@ -652,7 +652,7 @@ struct dp_mon_ops { #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG) void (*mon_pktlogmod_exit)(struct dp_pdev *pdev); #endif - void (*mon_vdev_set_monitor_mode_buf_rings)(struct dp_pdev *pdev); + QDF_STATUS (*mon_vdev_set_monitor_mode_buf_rings)(struct dp_pdev *pdev); QDF_STATUS (*mon_vdev_set_monitor_mode_rings)(struct dp_pdev *pdev, uint8_t delayed_replenish); void (*mon_neighbour_peers_detach)(struct dp_pdev *pdev); @@ -3218,20 +3218,20 @@ static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev) {} #endif static inline -void dp_monitor_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) +QDF_STATUS dp_monitor_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) { struct dp_mon_ops *monitor_ops; struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; if (!mon_soc) { dp_mon_debug("monitor soc is NULL"); - return; + return QDF_STATUS_E_FAILURE; } monitor_ops = mon_soc->mon_ops; if (!monitor_ops || !monitor_ops->mon_vdev_set_monitor_mode_buf_rings) { dp_mon_debug("callback not registered"); - return; + return QDF_STATUS_E_FAILURE; } return monitor_ops->mon_vdev_set_monitor_mode_buf_rings(pdev);