From 902e67deb9530fdd56d8f101cb960d6e618d6686 Mon Sep 17 00:00:00 2001 From: Naga Date: Tue, 21 Dec 2021 12:51:34 +0530 Subject: [PATCH] qcacmn: Fixes for wkk monitor bringup Fixes for initial wkk monitor bringup in emulation. Change-Id: Ic7b05b8822ef68daee7dd614fcac7a7de7b9b3fa CRs-Fixed: 3087563 --- dp/wifi3.0/be/dp_be.c | 31 ++++- dp/wifi3.0/be/dp_be.h | 37 ++---- dp/wifi3.0/dp_types.h | 11 +- dp/wifi3.0/li/dp_li.c | 13 ++ dp/wifi3.0/li/dp_li.h | 28 ++++- dp/wifi3.0/monitor/2.0/dp_mon_2.0.c | 160 +++++++++---------------- dp/wifi3.0/monitor/2.0/dp_mon_2.0.h | 3 +- dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c | 22 +--- dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c | 21 +--- dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h | 12 ++ dp/wifi3.0/monitor/dp_mon.c | 21 +++- dp/wifi3.0/monitor/dp_mon.h | 18 ++- hal/wifi3.0/hal_internal.h | 4 +- wlan_cfg/cfg_dp.h | 2 +- 14 files changed, 205 insertions(+), 178 deletions(-) diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index e2136b9e30..17f74f3dc9 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -76,13 +76,37 @@ qdf_size_t dp_get_context_size_be(enum dp_context_type context_type) return sizeof(struct dp_vdev_be); case DP_CONTEXT_TYPE_PEER: return sizeof(struct dp_peer_be); - case DP_CONTEXT_TYPE_MON_PDEV: - return dp_get_mon_obj_be_size(DP_CONTEXT_TYPE_MON_PDEV); default: return 0; } } +#ifdef QCA_MONITOR_2_0_SUPPORT +qdf_size_t dp_mon_get_context_size_be(enum dp_context_type context_type) +{ + switch (context_type) { + case DP_CONTEXT_TYPE_MON_SOC: + return sizeof(struct dp_mon_soc_be); + case DP_CONTEXT_TYPE_MON_PDEV: + return sizeof(struct dp_mon_pdev_be); + default: + return 0; + } +} +#else +qdf_size_t dp_mon_get_context_size_be(enum dp_context_type context_type) +{ + switch (context_type) { + case DP_CONTEXT_TYPE_MON_SOC: + return sizeof(struct dp_mon_soc); + case DP_CONTEXT_TYPE_MON_PDEV: + return sizeof(struct dp_mon_pdev); + default: + return 0; + } +} +#endif + #ifdef DP_FEATURE_HW_COOKIE_CONVERSION #if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1) /** @@ -1456,6 +1480,9 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) dp_wbm_get_rx_desc_from_hal_desc_be; #endif arch_ops->txrx_get_context_size = dp_get_context_size_be; +#if QCA_MONITOR_2_0_SUPPORT + arch_ops->txrx_get_mon_context_size = dp_mon_get_context_size_be; +#endif arch_ops->dp_rx_desc_cookie_2_va = dp_rx_desc_cookie_2_va_be; diff --git a/dp/wifi3.0/be/dp_be.h b/dp/wifi3.0/be/dp_be.h index c97e927791..014afb2ef7 100644 --- a/dp/wifi3.0/be/dp_be.h +++ b/dp/wifi3.0/be/dp_be.h @@ -293,6 +293,17 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops); */ qdf_size_t dp_get_context_size_be(enum dp_context_type context_type); +#if QCA_MONITOR_2_0_SUPPORT +/** + * dp_mon_get_context_size_be() - get BE specific size for mon pdev/soc + * @arch_ops: arch ops pointer + * + * Return: size in bytes for the context_type + */ +qdf_size_t dp_mon_get_context_size_be(enum dp_context_type context_type); + +#endif + /** * dp_get_be_soc_from_dp_soc() - get dp_soc_be from dp_soc * @soc: dp_soc pointer @@ -683,30 +694,4 @@ QDF_STATUS dp_txrx_set_vdev_param_be(struct dp_soc *soc, enum cdp_vdev_param_type param, cdp_config_param_type val); -/* - * dp_get_mon_obj_be_size: get monitor context size - * @context_type: context type - * - * return: size of context - */ -#ifdef QCA_MONITOR_2_0_SUPPORT -static inline qdf_size_t -dp_get_mon_obj_be_size(enum dp_context_type context_type) -{ - switch (context_type) { - case DP_CONTEXT_TYPE_MON_PDEV: - return sizeof(struct dp_mon_pdev_be); - break; - - default: - return 0; - } -} -#else -static inline qdf_size_t -dp_get_mon_obj_be_size(enum dp_context_type context_type) -{ - return sizeof(struct dp_mon_pdev); -} -#endif #endif diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 3142d18f26..9479afa52a 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -412,6 +412,8 @@ struct dp_rx_nbuf_frag_info { * @DP_RX_REINJECT_RING_HIST_TYPE: Datapath reinject ring history * @DP_RX_REFILL_RING_HIST_TYPE: Datapath rx refill ring history * @DP_TX_HW_DESC_HIST_TYPE: Datapath TX HW descriptor history + * @DP_MON_SOC_TYPE: Datapath monitor soc context + * @DP_MON_PDEV_TYPE: Datapath monitor pdev context */ enum dp_ctxt_type { DP_PDEV_TYPE, @@ -423,6 +425,8 @@ enum dp_ctxt_type { DP_FISA_RX_FT_TYPE, DP_RX_REFILL_RING_HIST_TYPE, DP_TX_HW_DESC_HIST_TYPE, + DP_MON_SOC_TYPE, + DP_MON_PDEV_TYPE, }; /** @@ -1610,6 +1614,8 @@ struct dp_tx_msdu_info_s; * @DP_CONTEXT_TYPE_PDEV: Context type DP PDEV * @DP_CONTEXT_TYPE_VDEV: Context type DP VDEV * @DP_CONTEXT_TYPE_PEER: Context type DP PEER + * @DP_CONTEXT_TYPE_MON_SOC: Context type DP MON SOC + * @DP_CONTEXT_TYPE_MON_PDEV: Context type DP MON PDEV * * Helper enums to be used to retrieve the size of the corresponding * data structure by passing the type. @@ -1618,7 +1624,9 @@ enum dp_context_type { DP_CONTEXT_TYPE_SOC, DP_CONTEXT_TYPE_PDEV, DP_CONTEXT_TYPE_VDEV, - DP_CONTEXT_TYPE_PEER + DP_CONTEXT_TYPE_PEER, + DP_CONTEXT_TYPE_MON_SOC, + DP_CONTEXT_TYPE_MON_PDEV }; /* @@ -1720,6 +1728,7 @@ struct dp_arch_ops { /* Misc Arch Ops */ qdf_size_t (*txrx_get_context_size)(enum dp_context_type); + qdf_size_t (*txrx_get_mon_context_size)(enum dp_context_type); int (*dp_srng_test_and_update_nf_params)(struct dp_soc *soc, struct dp_srng *dp_srng, int *max_reap_limit); diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index 4db3bbb28e..adab758d20 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/dp/wifi3.0/li/dp_li.c @@ -64,6 +64,18 @@ qdf_size_t dp_get_context_size_li(enum dp_context_type context_type) } } +qdf_size_t dp_mon_get_context_size_li(enum dp_context_type context_type) +{ + switch (context_type) { + case DP_CONTEXT_TYPE_MON_PDEV: + return sizeof(struct dp_mon_pdev_li); + case DP_CONTEXT_TYPE_MON_SOC: + return sizeof(struct dp_mon_soc_li); + default: + return 0; + } +} + static QDF_STATUS dp_soc_attach_li(struct dp_soc *soc, struct cdp_soc_attach_params *params) { @@ -403,6 +415,7 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops) arch_ops->dp_rx_desc_pool_deinit = dp_rx_desc_pool_deinit_generic; #endif arch_ops->txrx_get_context_size = dp_get_context_size_li; + arch_ops->txrx_get_mon_context_size = dp_mon_get_context_size_li; arch_ops->txrx_soc_attach = dp_soc_attach_li; arch_ops->txrx_soc_detach = dp_soc_detach_li; arch_ops->txrx_soc_init = dp_soc_init_li; diff --git a/dp/wifi3.0/li/dp_li.h b/dp/wifi3.0/li/dp_li.h index 66ed28add3..f4d6cb91d8 100644 --- a/dp/wifi3.0/li/dp_li.h +++ b/dp/wifi3.0/li/dp_li.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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 @@ -20,6 +20,7 @@ #define __DP_LI_H #include +#include #include #include @@ -58,6 +59,22 @@ struct dp_peer_li { struct dp_peer peer; }; +/** + * struct dp_mon_soc_li - Extended DP mon soc for LI targets + * @mon_soc: dp_mon_soc structure + */ +struct dp_mon_soc_li { + struct dp_mon_soc mon_soc; +}; + +/** + * struct dp_mon_pdev_li - Extended DP mon pdev for LI targets + * @mon_pdev: dp_mon_pdev structure + */ +struct dp_mon_pdev_li { + struct dp_mon_pdev mon_pdev; +}; + /** * dp_get_soc_context_size_LI() - get context size for dp_soc_li * @@ -82,4 +99,13 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops); qdf_size_t dp_get_context_size_li(enum dp_context_type context_type); +/** + * dp_mon_get_context_size_li() - get LI specific size for mon pdev/soc + * @arch_ops: arch ops pointer + * + * Return: size in bytes for the context_type + */ + +qdf_size_t dp_mon_get_context_size_li(enum dp_context_type context_type); + #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 d3a0bcd8fb..8b7fd28699 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 @@ -29,15 +29,6 @@ #include #include -extern QDF_STATUS dp_srng_alloc(struct dp_soc *soc, struct dp_srng *srng, - int ring_type, uint32_t num_entries, - bool cached); -extern void dp_srng_free(struct dp_soc *soc, struct dp_srng *srng); -extern QDF_STATUS dp_srng_init(struct dp_soc *soc, struct dp_srng *srng, - int ring_type, int ring_num, int mac_id); -extern void dp_srng_deinit(struct dp_soc *soc, struct dp_srng *srng, - int ring_type, int ring_num); - #if !defined(DISABLE_MON_CONFIG) /* * dp_mon_add_desc_list_to_free_list() - append unused desc_list back to @@ -120,8 +111,8 @@ void dp_mon_pool_frag_unmap_and_free(struct dp_soc *soc, if (!(mon_desc_pool->array[desc_id].mon_desc.unmapped)) { qdf_mem_unmap_page(soc->osdev, paddr, - QDF_DMA_FROM_DEVICE, - mon_desc_pool->buf_size); + mon_desc_pool->buf_size, + QDF_DMA_FROM_DEVICE); mon_desc_pool->array[desc_id].mon_desc.unmapped = 1; mon_desc_pool->array[desc_id].mon_desc.cookie = desc_id; } @@ -211,7 +202,7 @@ dp_mon_buffers_replenish(struct dp_soc *dp_soc, num_req_buffers = num_entries_avail; } - while (count <= num_req_buffers) { + while (count <= num_req_buffers - 1) { ret = dp_mon_frag_alloc_and_map(dp_soc, &mon_desc, mon_desc_pool); @@ -232,6 +223,8 @@ dp_mon_buffers_replenish(struct dp_soc *dp_soc, (*desc_list)->mon_desc.in_use = 1; (*desc_list)->mon_desc.unmapped = 0; + (*desc_list)->mon_desc.buf_addr = mon_desc.buf_addr; + (*desc_list)->mon_desc.paddr = mon_desc.paddr; hal_mon_buff_addr_info_set(dp_soc->hal_soc, mon_ring_entry, @@ -533,16 +526,17 @@ QDF_STATUS dp_mon_soc_detach_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 (!mon_soc) { + dp_mon_err("DP MON SOC NULL"); + return QDF_STATUS_E_FAILURE; + } + 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); - } + dp_srng_free(soc, &soc->rxdma_mon_buf_ring[0]); + dp_srng_free(soc, &mon_soc->tx_mon_buf_ring); return QDF_STATUS_SUCCESS; } @@ -551,18 +545,20 @@ static QDF_STATUS dp_mon_soc_attach_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 = NULL; + struct dp_mon_soc_be *mon_soc_be = NULL; + struct dp_mon_soc *mon_soc = soc->monitor_soc; int entries; struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx; soc_cfg_ctx = soc->wlan_cfg_ctx; - 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; + mon_soc_be = (struct dp_mon_soc_be *)mon_soc; + if (!mon_soc_be) { + dp_mon_err("DP MON SOC is NULL"); + return QDF_STATUS_E_FAILURE; } - qdf_mem_zero(mon_soc, sizeof(*mon_soc)); - be_soc->monitor_soc_be = mon_soc; + + mon_soc_be->tx_mon_ring_fill_level = DP_MON_RING_FILL_LEVEL_DEFAULT; + mon_soc_be->rx_mon_ring_fill_level = DP_MON_RING_FILL_LEVEL_DEFAULT; entries = wlan_cfg_get_dp_soc_rx_mon_buf_ring_size(soc_cfg_ctx); if (dp_srng_alloc(soc, &soc->rxdma_mon_buf_ring[0], @@ -578,7 +574,19 @@ QDF_STATUS dp_mon_soc_attach_2_0(struct dp_soc *soc) goto fail; } - /* sw desc pool for src ring */ + 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_be->tx_mon_buf_ring, + TX_MONITOR_BUF, 0, 0)) { + dp_mon_err("%pK: " RNG_ERR "tx_mon_buf_ring", soc); + goto fail; + } + + /* allocate sw desc pool */ if (dp_rx_mon_buf_desc_pool_alloc(soc)) { dp_mon_err("%pK: Rx mon desc pool allocation failed", soc); goto fail; @@ -589,7 +597,18 @@ QDF_STATUS dp_mon_soc_attach_2_0(struct dp_soc *soc) goto fail; } - /* monitor buffers for src */ + /* initialize sw desc pool */ + 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; + } + + /* allocate and replenish initial buffers */ if (dp_rx_mon_buffers_alloc(soc)) { dp_mon_err("%pK: Rx mon buffers allocation failed", soc); goto fail; @@ -606,57 +625,6 @@ fail: return QDF_STATUS_E_NOMEM; } -static -QDF_STATUS dp_mon_soc_deinit_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; - - 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; - } - - return QDF_STATUS_SUCCESS; -fail: - dp_mon_soc_deinit_2_0(soc); - return QDF_STATUS_E_FAILURE; -} - static void dp_pdev_mon_rings_deinit_2_0(struct dp_pdev *pdev) { @@ -764,25 +732,19 @@ fail: 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_mon_pdev_be *mon_pdev_be = 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; + mon_pdev_be = be_pdev->monitor_pdev_be; + if (!mon_pdev_be) { + dp_mon_err("DP MON PDEV is NULL"); + return QDF_STATUS_E_FAILURE; } - qdf_mem_zero(mon_pdev, sizeof(*mon_pdev)); - be_pdev->monitor_pdev_be = mon_pdev; return QDF_STATUS_SUCCESS; } @@ -804,8 +766,8 @@ dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, } static uint32_t -dp_tx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx, - uint32_t mac_id, uint32_t quota) +dp_tx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, + uint32_t mac_id, uint32_t quota) { return 0; } @@ -822,18 +784,6 @@ QDF_STATUS dp_mon_soc_detach_2_0(struct dp_soc *soc) return status; } -static inline -QDF_STATUS dp_mon_soc_init_2_0(struct dp_soc *soc) -{ - return status; -} - -static inline -QDF_STATUS dp_mon_soc_deinit_2_0(struct dp_soc *soc) -{ - return status; -} - static inline void dp_pdev_mon_rings_deinit_2_0(struct dp_pdev *pdev) { @@ -906,7 +856,7 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc) mon_ops->mon_pdev_get_filter_non_data = dp_pdev_get_filter_non_data; mon_ops->mon_neighbour_peer_add_ast = NULL; #ifndef DISABLE_MON_CONFIG - mon_ops->mon_tx_process = dp_tx_mon_process; + mon_ops->mon_tx_process = dp_tx_mon_process_2_0; #endif #ifdef WLAN_TX_PKT_CAPTURE_ENH mon_ops->mon_peer_tid_peer_id_update = NULL; @@ -1001,8 +951,6 @@ struct dp_mon_ops monitor_ops_2_0 = { .mon_soc_cfg_init = dp_mon_soc_cfg_init, .mon_soc_attach = dp_mon_soc_attach_2_0, .mon_soc_detach = dp_mon_soc_detach_2_0, - .mon_soc_init = dp_mon_soc_init_2_0, - .mon_soc_deinit = dp_mon_soc_deinit_2_0, .mon_pdev_alloc = dp_mon_pdev_alloc_2_0, .mon_pdev_free = dp_mon_pdev_free_2_0, .mon_pdev_attach = dp_mon_pdev_attach, 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 16ee45eed4..edf33b949a 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 @@ -24,6 +24,7 @@ #include #include #include +#include #define DP_MON_RING_FILL_LEVEL_DEFAULT 2048 #define DP_MON_DATA_BUFFER_SIZE 2048 @@ -92,8 +93,8 @@ struct dp_mon_desc_pool { /** * struct dp_mon_pdev_be - BE specific monitor pdev object - * @filter_be: Monitor Filter pointer * @mon_pdev: monitor pdev structure + * @filter_be: filters sent to fw */ struct dp_mon_pdev_be { struct dp_mon_pdev mon_pdev; 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 e6368ec9ec..ff48fe92ba 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 @@ -77,16 +77,16 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, struct dp_mon_desc_pool *rx_desc_pool; rx_desc_pool = &monitor_soc->rx_desc_mon; - hal_mon_buf_get(soc->hal_soc, - rx_mon_dst_ring_desc, - &hal_mon_rx_desc); + hal_be_get_mon_dest_status(soc->hal_soc, + rx_mon_dst_ring_desc, + &hal_mon_rx_desc); mon_desc = (struct dp_mon_desc *)(uintptr_t)(hal_mon_rx_desc.buf_addr); qdf_assert_always(mon_desc); if (!mon_desc->unmapped) { qdf_mem_unmap_page(soc->osdev, mon_desc->paddr, - QDF_DMA_FROM_DEVICE, - rx_desc_pool->buf_size); + rx_desc_pool->buf_size, + QDF_DMA_FROM_DEVICE); mon_desc->unmapped = 1; } @@ -129,18 +129,8 @@ dp_rx_mon_buf_desc_pool_init(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; - QDF_STATUS status; - status = dp_mon_desc_pool_init(&mon_soc->rx_desc_mon); - if (status != QDF_STATUS_SUCCESS) { - dp_mon_err("Failed to init rx monior descriptor pool"); - mon_soc->rx_mon_ring_fill_level = 0; - } else { - mon_soc->rx_mon_ring_fill_level = - DP_MON_RING_FILL_LEVEL_DEFAULT; - } - - return status; + return dp_mon_desc_pool_init(&mon_soc->rx_desc_mon); } void dp_rx_mon_buf_desc_pool_free(struct dp_soc *soc) 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 c0d877f386..cbbdf659f4 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 @@ -77,16 +77,16 @@ dp_tx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, struct dp_mon_desc_pool *tx_desc_pool; tx_desc_pool = &monitor_soc->tx_desc_mon; - hal_mon_buf_get(soc->hal_soc, - tx_mon_dst_ring_desc, - &hal_mon_tx_desc); + hal_be_get_mon_dest_status(soc->hal_soc, + tx_mon_dst_ring_desc, + &hal_mon_tx_desc); mon_desc = (struct dp_mon_desc *)(uintptr_t)(hal_mon_tx_desc.buf_addr); qdf_assert_always(mon_desc); if (!mon_desc->unmapped) { qdf_mem_unmap_page(soc->osdev, mon_desc->paddr, - QDF_DMA_FROM_DEVICE, - tx_desc_pool->buf_size); + DP_MON_DATA_BUFFER_SIZE, + QDF_DMA_FROM_DEVICE); mon_desc->unmapped = 1; } @@ -129,17 +129,8 @@ dp_tx_mon_buf_desc_pool_init(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; - QDF_STATUS status; - status = dp_mon_desc_pool_init(&mon_soc->tx_desc_mon); - if (status != QDF_STATUS_SUCCESS) { - dp_mon_err("Failed to init tx monior descriptor pool"); - mon_soc->tx_mon_ring_fill_level = 0; - } else { - mon_soc->tx_mon_ring_fill_level = DP_MON_RING_FILL_LEVEL_DEFAULT; - } - - return status; + return dp_mon_desc_pool_init(&mon_soc->tx_desc_mon); } void dp_tx_mon_buf_desc_pool_free(struct dp_soc *soc) 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 7e4f9023b3..0122f56bdb 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 @@ -87,4 +87,16 @@ void dp_tx_mon_process_status_tlv(struct dp_soc *soc, struct hal_mon_desc *mon_ring_desc, qdf_dma_addr_t addr); +/* + * dp_tx_mon_process_2_0() - tx monitor interrupt process + * @soc: dp soc handle + * @int_ctx: interrupt context + * @mac_id: mac id + * @quota: quota to process + * + */ +uint32_t +dp_tx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, + uint32_t mac_id, uint32_t quota); + #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 5be311f8d9..229a4667e3 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -4531,6 +4531,7 @@ QDF_STATUS dp_mon_pdev_attach(struct dp_pdev *pdev) struct dp_soc *soc; struct dp_mon_pdev *mon_pdev; struct dp_mon_ops *mon_ops; + qdf_size_t mon_pdev_context_size; if (!pdev) { dp_mon_err("pdev is NULL"); @@ -4539,12 +4540,14 @@ QDF_STATUS dp_mon_pdev_attach(struct dp_pdev *pdev) soc = pdev->soc; - mon_pdev = (struct dp_mon_pdev *)qdf_mem_malloc(sizeof(*mon_pdev)); + mon_pdev_context_size = soc->arch_ops.txrx_get_mon_context_size(DP_CONTEXT_TYPE_MON_PDEV); + mon_pdev = dp_context_alloc_mem(soc, DP_MON_PDEV_TYPE, mon_pdev_context_size); if (!mon_pdev) { dp_mon_err("%pK: MONITOR pdev allocation failed", pdev); goto fail0; } + pdev->monitor_pdev = mon_pdev; mon_ops = dp_mon_ops_get(pdev->soc); if (!mon_ops) { dp_mon_err("%pK: Invalid monitor ops", pdev); @@ -4619,8 +4622,8 @@ QDF_STATUS dp_mon_pdev_detach(struct dp_pdev *pdev) if (mon_ops->mon_pdev_free) mon_ops->mon_pdev_free(pdev); - pdev->monitor_pdev = NULL; qdf_mem_free(mon_pdev); + pdev->monitor_pdev = NULL; return QDF_STATUS_SUCCESS; } @@ -4696,13 +4699,23 @@ QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev) mon_ops->rx_mon_desc_pool_init(pdev); /* allocate buffers and replenish the monitor RxDMA ring */ - if (mon_ops->rx_mon_buffers_alloc) - mon_ops->rx_mon_buffers_alloc(pdev); + if (mon_ops->rx_mon_buffers_alloc) { + if (mon_ops->rx_mon_buffers_alloc(pdev)) { + dp_mon_err("%pK: rx mon buffers alloc failed", pdev); + goto fail2; + } + } dp_tx_ppdu_stats_attach(pdev); mon_pdev->is_dp_mon_pdev_initialized = true; return QDF_STATUS_SUCCESS; +fail2: + 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); fail1: dp_htt_ppdu_stats_detach(pdev); fail0: diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index d0eb236254..b88cd8ee7e 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -417,8 +417,6 @@ struct dp_mon_ops { QDF_STATUS (*mon_soc_cfg_init)(struct dp_soc *soc); QDF_STATUS (*mon_soc_attach)(struct dp_soc *soc); QDF_STATUS (*mon_soc_detach)(struct dp_soc *soc); - 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); void (*mon_pdev_free)(struct dp_pdev *pdev); QDF_STATUS (*mon_pdev_attach)(struct dp_pdev *pdev); @@ -1895,7 +1893,21 @@ static inline uint32_t dp_tx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx, uint32_t mac_id, uint32_t quota) { - return 0; + struct dp_mon_soc *mon_soc = soc->monitor_soc; + struct dp_mon_ops *monitor_ops; + + if (!mon_soc) { + dp_mon_debug("monitor soc is NULL"); + return 0; + } + + monitor_ops = mon_soc->mon_ops; + if (!monitor_ops || !monitor_ops->mon_tx_process) { + dp_mon_debug("callback not registered"); + return 0; + } + + return monitor_ops->mon_tx_process(soc, int_ctx, mac_id, quota); } static inline diff --git a/hal/wifi3.0/hal_internal.h b/hal/wifi3.0/hal_internal.h index c680f25e04..725c687a58 100644 --- a/hal/wifi3.0/hal_internal.h +++ b/hal/wifi3.0/hal_internal.h @@ -246,7 +246,6 @@ enum hal_srng_ring_id { /* 163-167 unused */ HAL_SRNG_SW2RXMON_BUF0 = 168, /* 169-175 unused */ - HAL_SRNG_SW2TXMON_BUF0 = 176, /* 177-183 unused */ HAL_SRNG_DMAC_CMN_ID_END = 183, /* LMAC rings - The following set will be replicated for each LMAC */ @@ -273,7 +272,8 @@ enum hal_srng_ring_id { HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING, #endif HAL_SRNG_WMAC1_TXMON2SW0, - HAL_SRNG_LMAC1_ID_END = (HAL_SRNG_WMAC1_TXMON2SW0 + 3), + HAL_SRNG_SW2TXMON_BUF0, + HAL_SRNG_LMAC1_ID_END = (HAL_SRNG_SW2TXMON_BUF0 + 2), }; #define HAL_RXDMA_MAX_RING_SIZE 0xFFFF diff --git a/wlan_cfg/cfg_dp.h b/wlan_cfg/cfg_dp.h index df538d7b1a..af310805f6 100644 --- a/wlan_cfg/cfg_dp.h +++ b/wlan_cfg/cfg_dp.h @@ -338,7 +338,7 @@ #define WLAN_CFG_RXDMA_MONITOR_BUF_RING_SIZE_MIN 16 #define WLAN_CFG_RXDMA_MONITOR_BUF_RING_SIZE_MAX 8192 -#define WLAN_CFG_TX_MONITOR_BUF_RING_SIZE 4096 +#define WLAN_CFG_TX_MONITOR_BUF_RING_SIZE 8192 #define WLAN_CFG_TX_MONITOR_BUF_RING_SIZE_MIN 16 #define WLAN_CFG_TX_MONITOR_BUF_RING_SIZE_MAX 8192