From 84c4158c87235fc24a1fe0f158c3f5f0b3ebc50c Mon Sep 17 00:00:00 2001 From: Naga Date: Mon, 4 Oct 2021 23:57:04 +0530 Subject: [PATCH] qcacmn: Add support for BE Monitor soc attach - Change to allocate BE specific monitor soc - Allocate, initialize soc and pdev level monitor rings - HTT srng setup for source ring - Dummy APIs to allocate, initialize sw desc pool Change-Id: Icf90994e7bd76017cf3c83ae00449d839967321d CRs-Fixed: 2991298 --- dp/wifi3.0/monitor/2.0/dp_mon_2.0.c | 191 ++++++++++++++++++++++--- dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c | 46 +++++- dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h | 51 +++++++ dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c | 32 ++++- dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h | 51 +++++++ dp/wifi3.0/monitor/dp_mon.c | 26 ++-- dp/wifi3.0/monitor/dp_mon.h | 2 +- 7 files changed, 364 insertions(+), 35 deletions(-) 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 dcadfbd5d9..9c50a2e935 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 @@ -78,7 +78,28 @@ QDF_STATUS dp_mon_htt_srng_setup_2_0(struct dp_soc *soc, int mac_id, int mac_for_pdev) { - return QDF_STATUS_SUCCESS; + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be; + QDF_STATUS status; + + status = htt_srng_setup(soc->htt_handle, mac_for_pdev, + soc->rxdma_mon_dst_ring[mac_id].hal_srng, + RXDMA_MONITOR_DST); + + if (status != QDF_STATUS_SUCCESS) { + dp_mon_err("Failed to send htt srng setup message for Rxdma dst ring"); + return status; + } + + status = htt_srng_setup(soc->htt_handle, mac_for_pdev, + mon_soc->tx_mon_dst_ring[mac_id].hal_srng, + TX_MONITOR_DST); + + if (status != QDF_STATUS_SUCCESS) { + dp_mon_err("Failed to send htt srng message for Tx mon dst ring"); + return status; + } + return status; } static uint32_t @@ -95,28 +116,139 @@ dp_tx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx, return 0; } -static -QDF_STATUS dp_mon_soc_attach_2_0(struct dp_soc *soc) -{ - return status; -} - static QDF_STATUS dp_mon_soc_detach_2_0(struct dp_soc *soc) { - return status; + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be; + + dp_tx_mon_buffers_free(soc); + dp_rx_mon_buffers_free(soc); + dp_tx_mon_buf_desc_pool_free(soc); + dp_rx_mon_buf_desc_pool_free(soc); + + if (mon_soc) { + dp_srng_free(soc, &soc->rxdma_mon_buf_ring[0]); + dp_srng_free(soc, &mon_soc->tx_mon_buf_ring); + qdf_mem_free(be_soc->monitor_soc_be); + } + + return QDF_STATUS_SUCCESS; } static -QDF_STATUS dp_mon_soc_init_2_0(struct dp_soc *soc) +QDF_STATUS dp_mon_soc_attach_2_0(struct dp_soc *soc) { - return status; + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + struct dp_mon_soc_be *mon_soc = NULL; + int entries = 8192; + + mon_soc = (struct dp_mon_soc_be *)qdf_mem_malloc(sizeof(*mon_soc)); + if (!mon_soc) { + dp_mon_err("%pK: mem allocation failed", soc); + return QDF_STATUS_E_NOMEM; + } + qdf_mem_zero(mon_soc, sizeof(*mon_soc)); + be_soc->monitor_soc_be = mon_soc; + + if (dp_srng_alloc(soc, &soc->rxdma_mon_buf_ring[0], + RXDMA_MONITOR_BUF, entries, 0)) { + dp_mon_err("%pK: " RNG_ERR "rx_mon_buf_ring", soc); + goto fail; + } + + if (dp_srng_alloc(soc, &mon_soc->tx_mon_buf_ring, + TX_MONITOR_BUF, entries, 0)) { + dp_mon_err("%pK: " RNG_ERR "tx_mon_buf_ring", soc); + goto fail; + } + + /* sw desc pool for src ring */ + if (dp_rx_mon_buf_desc_pool_alloc(soc)) { + dp_mon_err("%pK: Rx mon desc pool allocation failed", soc); + goto fail; + } + + if (dp_tx_mon_buf_desc_pool_alloc(soc)) { + dp_mon_err("%pK: Tx mon desc pool allocation failed", soc); + goto fail; + } + + /* monitor buffers for src */ + if (dp_rx_mon_buffers_alloc(soc)) { + dp_mon_err("%pK: Rx mon buffers allocation failed", soc); + goto fail; + } + + if (dp_tx_mon_buffers_alloc(soc)) { + dp_mon_err("%pK: Tx mon buffers allocation failed", soc); + goto fail; + } + + return QDF_STATUS_SUCCESS; +fail: + dp_mon_soc_detach_2_0(soc); + return QDF_STATUS_E_NOMEM; } static QDF_STATUS dp_mon_soc_deinit_2_0(struct dp_soc *soc) { - return status; + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be; + + dp_tx_mon_buf_desc_pool_deinit(soc); + dp_rx_mon_buf_desc_pool_deinit(soc); + + dp_srng_deinit(soc, &soc->rxdma_mon_buf_ring[0], + RXDMA_MONITOR_BUF, 0); + + dp_srng_deinit(soc, &mon_soc->tx_mon_buf_ring, + TX_MONITOR_BUF, 0); + + return QDF_STATUS_SUCCESS; +} + +static +QDF_STATUS dp_mon_soc_init_2_0(struct dp_soc *soc) +{ + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be; + + if (dp_srng_init(soc, &soc->rxdma_mon_buf_ring[0], + RXDMA_MONITOR_BUF, 0, 0)) { + dp_mon_err("%pK: " RNG_ERR "rx_mon_buf_ring", soc); + goto fail; + } + + if (dp_srng_init(soc, &mon_soc->tx_mon_buf_ring, + TX_MONITOR_BUF, 0, 0)) { + dp_mon_err("%pK: " RNG_ERR "tx_mon_buf_ring", soc); + goto fail; + } + + if (dp_tx_mon_buf_desc_pool_init(soc)) { + dp_mon_err("%pK: " RNG_ERR "tx mon desc pool init", soc); + goto fail; + } + + if (dp_rx_mon_buf_desc_pool_init(soc)) { + dp_mon_err("%pK: " RNG_ERR "rx mon desc pool init", soc); + goto fail; + } + + htt_srng_setup(soc->htt_handle, 0, + soc->rxdma_mon_buf_ring[0].hal_srng, + RXDMA_MONITOR_BUF); + + htt_srng_setup(soc->htt_handle, 0, + mon_soc->tx_mon_buf_ring.hal_srng, + TX_MONITOR_BUF); + + return QDF_STATUS_SUCCESS; +fail: + dp_mon_soc_deinit_2_0(soc); + return QDF_STATUS_E_FAILURE; } static @@ -141,6 +273,31 @@ QDF_STATUS dp_pdev_mon_rings_alloc(struct dp_soc *soc, struct dp_pdev *pdev) return QDF_STATUS_SUCCESS; } +static +void dp_mon_pdev_free_2_0(struct dp_pdev *pdev) +{ + struct dp_pdev_be *be_pdev = dp_get_be_pdev_from_dp_pdev(pdev); + + qdf_mem_free(be_pdev->monitor_pdev_be); + be_pdev->monitor_pdev_be = NULL; +} + +static +QDF_STATUS dp_mon_pdev_alloc_2_0(struct dp_pdev *pdev) +{ + struct dp_mon_pdev_be *mon_pdev = NULL; + struct dp_pdev_be *be_pdev = dp_get_be_pdev_from_dp_pdev(pdev); + + mon_pdev = (struct dp_mon_pdev_be *)qdf_mem_malloc(sizeof(*mon_pdev)); + if (!mon_pdev) { + dp_mon_err("%pK: mem allocation failed", pdev); + return QDF_STATUS_E_NOMEM; + } + qdf_mem_zero(mon_pdev, sizeof(*mon_pdev)); + be_pdev->monitor_pdev_be = mon_pdev; + + return QDF_STATUS_SUCCESS; +} #else static inline QDF_STATUS dp_mon_htt_srng_setup_2_0(struct dp_soc *soc, @@ -210,18 +367,18 @@ QDF_STATUS dp_pdev_mon_rings_alloc(struct dp_soc *soc, struct dp_pdev *pdev) { return QDF_STATUS_SUCCESS; } -#endif static inline -void dp_mon_pdev_free(struct dp_pdev *pdev) +void dp_mon_pdev_free_2_0(struct dp_pdev *pdev) { } static inline -QDF_STATUS dp_mon_pdev_alloc(struct dp_pdev *pdev) +QDF_STATUS dp_mon_pdev_alloc_2_0(struct dp_pdev *pdev) { return QDF_STATUS_SUCCESS; } +#endif struct dp_mon_ops monitor_ops_2_0 = { .mon_soc_cfg_init = dp_mon_soc_cfg_init, @@ -266,7 +423,7 @@ struct dp_mon_ops monitor_ops_2_0 = { #endif #if defined(WDI_EVENT_ENABLE) &&\ (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) - .mon_ppdu_stats_ind_handler = dp_ppdu_stats_ind_handler, + .mon_ppdu_stats_ind_handler = NULL, #endif .mon_htt_ppdu_stats_attach = dp_htt_ppdu_stats_attach, .mon_htt_ppdu_stats_detach = dp_htt_ppdu_stats_detach, @@ -276,7 +433,7 @@ struct dp_mon_ops monitor_ops_2_0 = { .mon_config_enh_tx_capture = dp_config_enh_tx_capture, #endif #ifdef WLAN_RX_PKT_CAPTURE_ENH - .mon_config_enh_rx_capture = dp_config_enh_rx_capture, + .mon_config_enh_rx_capture = NULL, #endif #ifdef QCA_SUPPORT_BPR .mon_set_bpr_enable = dp_set_bpr_enable_2_0, @@ -384,5 +541,5 @@ struct dp_mon_ops *dp_mon_ops_get_2_0(void) struct cdp_mon_ops *dp_mon_cdp_ops_get_2_0(void) { - return &monitor_ops_2_0; + return &dp_ops_mon_2_0; } diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c index aafecc196b..2fe56ba606 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c @@ -14,14 +14,56 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include +#include "dp_rx.h" +#include "dp_peer.h" +#include +#include +#include +#include +#include +#include +#include + +#include "htt_ppdu_stats.h" +#include "dp_cal_client_api.h" +#if defined(DP_CON_MON) +#ifndef REMOVE_PKT_LOG +#include +#include +#endif +#endif +#ifdef FEATURE_PERPKT_INFO +#include "dp_ratetable.h" +#endif + void -dp_rx_mon_buffers_free(struct dp_pdev *pdev) +dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *soc) +{ +} + +void +dp_rx_mon_buf_desc_pool_init(struct dp_soc *soc) +{ +} + +void dp_rx_mon_buf_desc_pool_free(struct dp_soc *soc) { } QDF_STATUS -dp_rx_mon_buffers_alloc(struct dp_pdev *pdev) +dp_rx_mon_buf_desc_pool_alloc(struct dp_soc *soc) { return QDF_STATUS_SUCCESS; } +void +dp_rx_mon_buffers_free(struct dp_soc *soc) +{ +} + +QDF_STATUS +dp_rx_mon_buffers_alloc(struct dp_soc *soc) +{ + return QDF_STATUS_SUCCESS; +} diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h index 9a368e2da3..f4bd2b8b63 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h @@ -17,4 +17,55 @@ #ifndef _DP_RX_MON_2_0_H_ #define _DP_RX_MON_2_0_H_ +/* + * dp_rx_mon_buffers_alloc() - allocate rx monitor buffers + * @soc: DP soc handle + * + * Return: QDF_STATUS_SUCCESS: Success + * QDF_STATUS_E_FAILURE: Error + */ +QDF_STATUS +dp_rx_mon_buffers_alloc(struct dp_soc *soc); + +/* + * dp_rx_mon_buffers_free() - free rx monitor buffers + * @soc: dp soc handle + * + */ +void +dp_rx_mon_buffers_free(struct dp_soc *soc); + +/* + * dp_rx_mon_desc_pool_deinit() - deinit rx monitor descriptor pool + * @soc: dp soc handle + * + */ +void +dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *soc); + +/* + * dp_rx_mon_desc_pool_deinit() - deinit rx monitor descriptor pool + * @soc: dp soc handle + * + */ +void +dp_rx_mon_buf_desc_pool_init(struct dp_soc *soc); + +/* + * dp_rx_mon_buf_desc_pool_free() - free rx monitor descriptor pool + * @soc: dp soc handle + * + */ +void dp_rx_mon_buf_desc_pool_free(struct dp_soc *soc); + +/* + * dp_rx_mon_buf_desc_pool_alloc() - allocate rx monitor descriptor pool + * @soc: DP soc handle + * + * Return: QDF_STATUS_SUCCESS: Success + * QDF_STATUS_E_FAILURE: Error + */ +QDF_STATUS +dp_rx_mon_buf_desc_pool_alloc(struct dp_soc *soc); + #endif /* _DP_RX_MON_2_0_H_ */ diff --git a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c index f1c1e7b55f..409c4b6010 100644 --- a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c @@ -14,14 +14,42 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include +#include "dp_rx.h" +#include "dp_peer.h" +#include +#include +#include +#include +#include + void -dp_tx_mon_buffers_free(struct dp_pdev *pdev) +dp_tx_mon_buf_desc_pool_deinit(struct dp_soc *soc) +{ +} + +void +dp_tx_mon_buf_desc_pool_init(struct dp_soc *soc) +{ +} + +void dp_tx_mon_buf_desc_pool_free(struct dp_soc *soc) { } QDF_STATUS -dp_tx_mon_buffers_alloc(struct dp_pdev *pdev) +dp_tx_mon_buf_desc_pool_alloc(struct dp_soc *soc) { return QDF_STATUS_SUCCESS; } +void +dp_tx_mon_buffers_free(struct dp_soc *soc) +{ +} + +QDF_STATUS +dp_tx_mon_buffers_alloc(struct dp_soc *soc) +{ + return QDF_STATUS_SUCCESS; +} diff --git a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h index b124444f97..48ecd0db1b 100644 --- a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h @@ -17,4 +17,55 @@ #ifndef _DP_TX_MON_2_0_H_ #define _DP_TX_MON_2_0_H_ +/* + * dp_tx_mon_buffers_alloc() - allocate tx monitor buffers + * @soc: DP soc handle + * + * Return: QDF_STATUS_SUCCESS: Success + * QDF_STATUS_E_FAILURE: Error + */ +QDF_STATUS +dp_tx_mon_buffers_alloc(struct dp_soc *soc); + +/* + * dp_tx_mon_buffers_free() - free tx monitor buffers + * @soc: dp soc handle + * + */ +void +dp_tx_mon_buffers_free(struct dp_soc *soc); + +/* + * dp_tx_mon_desc_pool_deinit() - deinit tx monitor descriptor pool + * @soc: dp soc handle + * + */ +void +dp_tx_mon_buf_desc_pool_deinit(struct dp_soc *soc); + +/* + * dp_tx_mon_desc_pool_deinit() - deinit tx monitor descriptor pool + * @soc: dp soc handle + * + */ +void +dp_tx_mon_buf_desc_pool_init(struct dp_soc *soc); + +/* + * dp_tx_mon_buf_desc_pool_free() - free tx monitor descriptor pool + * @soc: dp soc handle + * + */ +void dp_tx_mon_buf_desc_pool_free(struct dp_soc *soc); + +/* + * dp_tx_mon_buf_desc_pool_alloc() - allocate tx monitor descriptor pool + * @soc: DP soc handle + * + * Return: QDF_STATUS_SUCCESS: Success + * QDF_STATUS_E_FAILURE: Error + */ +QDF_STATUS +dp_tx_mon_buf_desc_pool_alloc(struct dp_soc *soc); + #endif /* _DP_TX_MON_2_0_H_ */ diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index bd7a1d18ab..26afccadc4 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -2081,7 +2081,7 @@ QDF_STATUS dp_mon_pdev_attach(struct dp_pdev *pdev) } if (mon_ops->mon_pdev_alloc) { - if (mon_ops->mon_rings_alloc(soc, pdev)) { + if (mon_ops->mon_pdev_alloc(pdev)) { dp_mon_err("%pK: MONITOR pdev alloc failed", pdev); goto fail1; } @@ -2095,8 +2095,8 @@ QDF_STATUS dp_mon_pdev_attach(struct dp_pdev *pdev) } /* Rx monitor mode specific init */ - if (mon_ops->rx_pdev_mon_desc_pool_alloc) { - if (mon_ops->rx_pdev_mon_desc_pool_alloc(pdev)) { + if (mon_ops->rx_mon_desc_pool_alloc) { + if (mon_ops->rx_mon_desc_pool_alloc(pdev)) { dp_mon_err("%pK: dp_rx_pdev_mon_attach failed", pdev); goto fail3; } @@ -2134,8 +2134,8 @@ QDF_STATUS dp_mon_pdev_detach(struct dp_pdev *pdev) return QDF_STATUS_E_FAILURE; } - if (mon_ops->rx_pdev_mon_desc_pool_free) - mon_ops->rx_pdev_mon_desc_pool_free(pdev); + if (mon_ops->rx_mon_desc_pool_free) + mon_ops->rx_mon_desc_pool_free(pdev); if (mon_ops->mon_rings_free) mon_ops->mon_rings_free(pdev); if (mon_ops->mon_pdev_free) @@ -2214,12 +2214,12 @@ QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev) } /* initialize sw monitor rx descriptors */ - if (mon_ops->rx_pdev_mon_desc_pool_init) - mon_ops->rx_pdev_mon_desc_pool_init(pdev); + if (mon_ops->rx_mon_desc_pool_init) + mon_ops->rx_mon_desc_pool_init(pdev); /* allocate buffers and replenish the monitor RxDMA ring */ - if (mon_ops->rx_pdev_mon_buffers_alloc) - mon_ops->rx_pdev_mon_buffers_alloc(pdev); + if (mon_ops->rx_mon_buffers_alloc) + mon_ops->rx_mon_buffers_alloc(pdev); dp_tx_ppdu_stats_attach(pdev); mon_pdev->is_dp_mon_pdev_initialized = true; @@ -2250,10 +2250,10 @@ QDF_STATUS dp_mon_pdev_deinit(struct dp_pdev *pdev) dp_tx_ppdu_stats_detach(pdev); - if (mon_ops->rx_pdev_mon_buffers_free) - mon_ops->rx_pdev_mon_buffers_free(pdev); - if (mon_ops->rx_pdev_mon_desc_pool_deinit) - mon_ops->rx_pdev_mon_desc_pool_deinit(pdev); + if (mon_ops->rx_mon_buffers_free) + mon_ops->rx_mon_buffers_free(pdev); + if (mon_ops->rx_mon_desc_pool_deinit) + mon_ops->rx_mon_desc_pool_deinit(pdev); if (mon_ops->mon_rings_deinit) mon_ops->mon_rings_deinit(pdev); dp_cal_client_detach(&mon_pdev->cal_client_ctx); diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index fd5de01f6e..6cac460915 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -346,7 +346,7 @@ struct dp_mon_ops { QDF_STATUS (*mon_soc_init)(struct dp_soc *soc); QDF_STATUS (*mon_soc_deinit)(struct dp_soc *soc); QDF_STATUS (*mon_pdev_alloc)(struct dp_pdev *pdev); - QDF_STATUS (*mon_pdev_free)(struct dp_pdev *pdev); + void (*mon_pdev_free)(struct dp_pdev *pdev); QDF_STATUS (*mon_pdev_attach)(struct dp_pdev *pdev); QDF_STATUS (*mon_pdev_detach)(struct dp_pdev *pdev); QDF_STATUS (*mon_pdev_init)(struct dp_pdev *pdev);