qcacmn: Add support for BE monitor buf processing

Add support for BE monitor buffer processing

Change-Id: I2b7563e7a2c4d7e091ed093774b4f24047791708
CRs-Fixed: 3010502
This commit is contained in:
Naga
2021-08-10 12:13:43 +05:30
committed by Madan Koyyalamudi
parent 69bd3e218f
commit 5475a38feb
6 changed files with 262 additions and 15 deletions

View File

@@ -14,15 +14,105 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <dp_types.h>
#include "dp_rx.h"
#include "dp_peer.h"
#include <dp_htt.h>
#include <dp_mon_filter.h>
#include <dp_mon.h>
#include <dp_rx_mon.h>
#include <dp_rx_mon_2.0.h>
#include "hal_be_hw_headers.h"
#include "dp_types.h"
#include "hal_be_rx.h"
#include "hal_api.h"
#include "qdf_trace.h"
#include "hal_be_api_mon.h"
#include "dp_internal.h"
#include "qdf_mem.h" /* qdf_mem_malloc,free */
#include "dp_mon.h"
#include <dp_mon_2.0.h>
#include <dp_rx_mon_2.0.h>
#include <dp_be.h>
#include <hal_be_api_mon.h>
static inline uint32_t
dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
uint32_t mac_id, uint32_t quota)
{
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
void *rx_mon_dst_ring_desc;
hal_soc_handle_t hal_soc;
void *mon_dst_srng;
struct dp_mon_pdev *mon_pdev;
struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
struct dp_mon_soc_be *monitor_soc = be_soc->monitor_soc_be;
uint32_t work_done = 0;
if (!pdev) {
dp_mon_err("%pK: pdev is null for mac_id = %d", soc, mac_id);
return work_done;
}
mon_pdev = pdev->monitor_pdev;
mon_dst_srng = soc->rxdma_mon_dst_ring[mac_id].hal_srng;
if (!mon_dst_srng || !hal_srng_initialized(mon_dst_srng)) {
dp_mon_err("%pK: : HAL Monitor Destination Ring Init Failed -- %pK",
soc, mon_dst_srng);
return work_done;
}
hal_soc = soc->hal_soc;
qdf_assert((hal_soc && pdev));
qdf_spin_lock_bh(&mon_pdev->mon_lock);
if (qdf_unlikely(dp_srng_access_start(int_ctx, soc, mon_dst_srng))) {
dp_mon_err("%s %d : HAL Mon Dest Ring access Failed -- %pK",
__func__, __LINE__, mon_dst_srng);
qdf_spin_unlock_bh(&mon_pdev->mon_lock);
return work_done;
}
while (qdf_likely((rx_mon_dst_ring_desc =
(void *)hal_srng_dst_get_next(hal_soc, mon_dst_srng))
&& quota--)) {
struct hal_mon_desc hal_mon_rx_desc;
struct dp_mon_desc *mon_desc;
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);
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);
mon_desc->unmapped = 1;
}
dp_rx_mon_process_status_tlv(soc, pdev,
&hal_mon_rx_desc,
mon_desc->paddr);
qdf_frag_free(mon_desc->buf_addr);
work_done++;
}
dp_srng_access_end(int_ctx, soc, mon_dst_srng);
qdf_spin_unlock_bh(&mon_pdev->mon_lock);
dp_mon_info("mac_id: %d, work_done:%d", mac_id, work_done);
return work_done;
}
uint32_t
dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
uint32_t mac_id, uint32_t quota)
{
uint32_t work_done;
work_done = dp_rx_mon_srng_process_2_0(soc, int_ctx, mac_id, quota);
return work_done;
}
void
dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *soc)

View File

@@ -17,6 +17,9 @@
#ifndef _DP_RX_MON_2_0_H_
#define _DP_RX_MON_2_0_H_
#include <qdf_nbuf_frag.h>
#include <hal_be_api_mon.h>
/*
* dp_rx_mon_buffers_alloc() - allocate rx monitor buffers
* @soc: DP soc handle
@@ -70,4 +73,17 @@ void dp_rx_mon_buf_desc_pool_free(struct dp_soc *soc);
QDF_STATUS
dp_rx_mon_buf_desc_pool_alloc(struct dp_soc *soc);
/*
* dp_rx_mon_process_status_tlv() - process status tlv
* @soc: dp soc handle
* @pdev: dp pdev handle
* @mon_ring_desc: HAL monitor ring descriptor
* @frag_addr: frag address
*
*/
void dp_rx_mon_process_status_tlv(struct dp_soc *soc,
struct dp_pdev *pdev,
struct hal_mon_desc *mon_ring_desc,
qdf_dma_addr_t addr);
#endif /* _DP_RX_MON_2_0_H_ */

View File

@@ -13,3 +13,20 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "dp_types.h"
#include "qdf_nbuf.h"
#include "dp_internal.h"
#include "qdf_mem.h" /* qdf_mem_malloc,free */
#include <qdf_nbuf_frag.h>
#include <hal_be_api_mon.h>
#include <dp_mon.h>
#include <dp_mon_2.0.h>
#include <dp_rx_mon_2.0.h>
void dp_rx_mon_process_status_tlv(struct dp_soc *soc,
struct dp_pdev *pdev,
struct hal_mon_desc *mon_ring_desc,
qdf_dma_addr_t addr)
{
/* API to process status tlv */
}

View File

@@ -14,14 +14,105 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <dp_types.h>
#include "dp_tx.h"
#include "dp_peer.h"
#include <dp_htt.h>
#include <dp_mon_filter.h>
#include <dp_mon.h>
#include <dp_tx_mon_2.0.h>
#include "hal_be_hw_headers.h"
#include "dp_types.h"
#include "hal_be_tx.h"
#include "hal_api.h"
#include "qdf_trace.h"
#include "hal_be_api_mon.h"
#include "dp_internal.h"
#include "qdf_mem.h" /* qdf_mem_malloc,free */
#include "dp_mon.h"
#include <dp_mon_2.0.h>
#include <dp_tx_mon_2.0.h>
#include <dp_be.h>
#include <hal_be_api_mon.h>
static inline uint32_t
dp_tx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
uint32_t mac_id, uint32_t quota)
{
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
void *tx_mon_dst_ring_desc;
hal_soc_handle_t hal_soc;
void *mon_dst_srng;
struct dp_mon_pdev *mon_pdev;
uint32_t work_done = 0;
struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
struct dp_mon_soc_be *monitor_soc = be_soc->monitor_soc_be;
if (!pdev) {
dp_mon_err("%pK: pdev is null for mac_id = %d", soc, mac_id);
return work_done;
}
mon_pdev = pdev->monitor_pdev;
mon_dst_srng = monitor_soc->tx_mon_dst_ring[mac_id].hal_srng;
if (!mon_dst_srng || !hal_srng_initialized(mon_dst_srng)) {
dp_mon_err("%pK: : HAL Monitor Destination Ring Init Failed -- %pK",
soc, mon_dst_srng);
return work_done;
}
hal_soc = soc->hal_soc;
qdf_assert((hal_soc && pdev));
qdf_spin_lock_bh(&mon_pdev->mon_lock);
if (qdf_unlikely(dp_srng_access_start(int_ctx, soc, mon_dst_srng))) {
dp_mon_err("%s %d : HAL Mon Dest Ring access Failed -- %pK",
__func__, __LINE__, mon_dst_srng);
qdf_spin_unlock_bh(&mon_pdev->mon_lock);
return work_done;
}
while (qdf_likely((tx_mon_dst_ring_desc =
(void *)hal_srng_dst_get_next(hal_soc, mon_dst_srng))
&& quota--)) {
struct hal_mon_desc hal_mon_tx_desc;
struct dp_mon_desc *mon_desc;
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);
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);
mon_desc->unmapped = 1;
}
dp_tx_mon_process_status_tlv(soc, pdev,
&hal_mon_tx_desc,
mon_desc->paddr);
qdf_frag_free(mon_desc->buf_addr);
work_done++;
}
dp_srng_access_end(int_ctx, soc, mon_dst_srng);
qdf_spin_unlock_bh(&mon_pdev->mon_lock);
dp_mon_info("mac_id: %d, work_done:%d", mac_id, work_done);
return work_done;
}
uint32_t
dp_tx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
uint32_t mac_id, uint32_t quota)
{
uint32_t work_done;
work_done = dp_tx_mon_srng_process_2_0(soc, int_ctx, mac_id, quota);
return work_done;
}
void
dp_tx_mon_buf_desc_pool_deinit(struct dp_soc *soc)

View File

@@ -17,6 +17,9 @@
#ifndef _DP_TX_MON_2_0_H_
#define _DP_TX_MON_2_0_H_
#include <qdf_nbuf_frag.h>
#include <hal_be_api_mon.h>
/*
* dp_tx_mon_buffers_alloc() - allocate tx monitor buffers
* @soc: DP soc handle
@@ -70,4 +73,17 @@ void dp_tx_mon_buf_desc_pool_free(struct dp_soc *soc);
QDF_STATUS
dp_tx_mon_buf_desc_pool_alloc(struct dp_soc *soc);
/*
* dp_tx_mon_process_status_tlv() - process status tlv
* @soc: dp soc handle
* @pdev: dp pdev handle
* @mon_ring_desc: monitor ring descriptor
* @frag_addr: frag address
*
*/
void dp_tx_mon_process_status_tlv(struct dp_soc *soc,
struct dp_pdev *pdev,
struct hal_mon_desc *mon_ring_desc,
qdf_dma_addr_t addr);
#endif /* _DP_TX_MON_2_0_H_ */

View File

@@ -13,3 +13,20 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "dp_types.h"
#include "qdf_nbuf.h"
#include "dp_internal.h"
#include "qdf_mem.h" /* qdf_mem_malloc,free */
#include <qdf_nbuf_frag.h>
#include <hal_be_api_mon.h>
#include <dp_mon.h>
#include <dp_mon_2.0.h>
#include <dp_tx_mon_2.0.h>
void dp_tx_mon_process_status_tlv(struct dp_soc *soc,
struct dp_pdev *pdev,
struct hal_mon_desc *mon_ring_desc,
qdf_dma_addr_t addr)
{
/* API to process tlv */
}