qcacmn: Rearrange the functions to appropriate files

Rearrange the functions to appropriate files based on TX and RX 2.0.

Change-Id: Ie8e562a7aecdc91257210b55a323dfe47e67878c
CRs-Fixed: 3427296
This commit is contained in:
Srinivas Girigowda
2023-03-06 18:21:29 -08:00
committed by Madan Koyyalamudi
parent 9de0de3f01
commit ce736a1d8d
14 changed files with 816 additions and 729 deletions

View File

@@ -57,10 +57,6 @@
#endif #endif
#define RX_BUFFER_RESERVATION 0 #define RX_BUFFER_RESERVATION 0
#ifdef BE_PKTLOG_SUPPORT
#define BUFFER_RESIDUE 1
#define RX_MON_MIN_HEAD_ROOM 64
#endif
#define DP_DEFAULT_NOISEFLOOR (-96) #define DP_DEFAULT_NOISEFLOOR (-96)

View File

@@ -34,126 +34,6 @@
#endif #endif
#if !defined(DISABLE_MON_CONFIG) #if !defined(DISABLE_MON_CONFIG)
QDF_STATUS dp_rx_mon_ppdu_info_cache_create(struct dp_pdev *pdev)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct dp_mon_pdev_be *mon_pdev_be =
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
uint16_t obj;
struct hal_rx_ppdu_info *ppdu_info = NULL;
mon_pdev_be->ppdu_info_cache =
qdf_kmem_cache_create("rx_mon_ppdu_info_cache",
sizeof(struct hal_rx_ppdu_info));
if (!mon_pdev_be->ppdu_info_cache) {
dp_mon_err("cache creation failed pdev :%px", pdev);
return QDF_STATUS_E_NOMEM;
}
TAILQ_INIT(&mon_pdev_be->rx_mon_free_queue);
for (obj = 0; obj < DP_RX_MON_WQ_THRESHOLD; obj++) {
ppdu_info = (struct hal_rx_ppdu_info *)qdf_kmem_cache_alloc(mon_pdev_be->ppdu_info_cache);
if (ppdu_info) {
TAILQ_INSERT_TAIL(&mon_pdev_be->rx_mon_free_queue,
ppdu_info,
ppdu_free_list_elem);
mon_pdev_be->total_free_elem++;
}
}
qdf_spinlock_create(&mon_pdev_be->ppdu_info_lock);
return QDF_STATUS_SUCCESS;
}
void dp_rx_mon_ppdu_info_cache_destroy(struct dp_pdev *pdev)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct dp_mon_pdev_be *mon_pdev_be =
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
struct hal_rx_ppdu_info *ppdu_info = NULL, *temp_ppdu_info = NULL;
qdf_spin_lock(&mon_pdev_be->ppdu_info_lock);
TAILQ_FOREACH_SAFE(ppdu_info,
&mon_pdev_be->rx_mon_free_queue,
ppdu_free_list_elem,
temp_ppdu_info) {
TAILQ_REMOVE(&mon_pdev_be->rx_mon_free_queue,
ppdu_info, ppdu_free_list_elem);
if (ppdu_info) {
mon_pdev_be->total_free_elem--;
qdf_kmem_cache_free(mon_pdev_be->ppdu_info_cache,
ppdu_info);
}
}
qdf_spin_unlock(&mon_pdev_be->ppdu_info_lock);
dp_mon_debug(" total free element: %d", mon_pdev_be->total_free_elem);
qdf_kmem_cache_destroy(mon_pdev_be->ppdu_info_cache);
}
/**
* dp_mon_pdev_ext_init_2_0() - Init pdev ext param
*
* @pdev: DP pdev handle
*
* Return: QDF_STATUS_SUCCESS: Success
* QDF_STATUS_E_FAILURE: failure
*/
QDF_STATUS dp_mon_pdev_ext_init_2_0(struct dp_pdev *pdev)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct dp_mon_pdev_be *mon_pdev_be =
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
qdf_create_work(0, &mon_pdev_be->rx_mon_work,
dp_rx_mon_process_ppdu, pdev);
mon_pdev_be->rx_mon_workqueue =
qdf_alloc_unbound_workqueue("rx_mon_work_queue");
if (!mon_pdev_be->rx_mon_workqueue) {
dp_mon_err("failed to create rxmon wq mon_pdev: %pK", mon_pdev);
goto fail;
}
TAILQ_INIT(&mon_pdev_be->rx_mon_queue);
qdf_spinlock_create(&mon_pdev_be->rx_mon_wq_lock);
return QDF_STATUS_SUCCESS;
fail:
return QDF_STATUS_E_FAILURE;
}
/**
* dp_mon_pdev_ext_deinit_2_0() - denit pdev ext param
*
* @pdev: DP pdev handle
*
* Return: QDF_STATUS_SUCCESS
*/
QDF_STATUS dp_mon_pdev_ext_deinit_2_0(struct dp_pdev *pdev)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct dp_mon_pdev_be *mon_pdev_be =
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
if (!mon_pdev_be->rx_mon_workqueue)
return QDF_STATUS_E_FAILURE;
qdf_err(" total free element: %d", mon_pdev_be->total_free_elem);
qdf_flush_workqueue(0, mon_pdev_be->rx_mon_workqueue);
qdf_destroy_workqueue(0, mon_pdev_be->rx_mon_workqueue);
qdf_flush_work(&mon_pdev_be->rx_mon_work);
qdf_disable_work(&mon_pdev_be->rx_mon_work);
dp_rx_mon_drain_wq(pdev);
mon_pdev_be->rx_mon_workqueue = NULL;
qdf_spinlock_destroy(&mon_pdev_be->rx_mon_wq_lock);
return QDF_STATUS_SUCCESS;
}
/* /*
* dp_mon_add_desc_list_to_free_list() - append unused desc_list back to * dp_mon_add_desc_list_to_free_list() - append unused desc_list back to
* freelist. * freelist.
@@ -220,32 +100,6 @@ dp_mon_get_free_desc_list(struct dp_soc *soc,
return count; return count;
} }
void dp_mon_pool_frag_unmap_and_free(struct dp_soc *soc,
struct dp_mon_desc_pool *mon_desc_pool)
{
int desc_id;
qdf_frag_t vaddr;
qdf_dma_addr_t paddr;
qdf_spin_lock_bh(&mon_desc_pool->lock);
for (desc_id = 0; desc_id < mon_desc_pool->pool_size; desc_id++) {
if (mon_desc_pool->array[desc_id].mon_desc.in_use) {
vaddr = mon_desc_pool->array[desc_id].mon_desc.buf_addr;
paddr = mon_desc_pool->array[desc_id].mon_desc.paddr;
if (!(mon_desc_pool->array[desc_id].mon_desc.unmapped)) {
qdf_mem_unmap_page(soc->osdev, paddr,
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;
}
qdf_frag_free(vaddr);
}
}
qdf_spin_unlock_bh(&mon_desc_pool->lock);
}
static inline QDF_STATUS static inline QDF_STATUS
dp_mon_frag_alloc_and_map(struct dp_soc *dp_soc, dp_mon_frag_alloc_and_map(struct dp_soc *dp_soc,
struct dp_mon_desc *mon_desc, struct dp_mon_desc *mon_desc,
@@ -276,123 +130,6 @@ dp_mon_frag_alloc_and_map(struct dp_soc *dp_soc,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
QDF_STATUS
dp_mon_buffers_replenish(struct dp_soc *dp_soc,
struct dp_srng *dp_mon_srng,
struct dp_mon_desc_pool *mon_desc_pool,
uint32_t num_req_buffers,
union dp_mon_desc_list_elem_t **desc_list,
union dp_mon_desc_list_elem_t **tail,
uint32_t *replenish_cnt_ref)
{
uint32_t num_alloc_desc;
uint32_t num_entries_avail;
uint32_t count = 0;
int sync_hw_ptr = 1;
struct dp_mon_desc mon_desc = {0};
void *mon_ring_entry;
union dp_mon_desc_list_elem_t *next;
void *mon_srng;
QDF_STATUS ret = QDF_STATUS_E_FAILURE;
struct dp_mon_soc *mon_soc = dp_soc->monitor_soc;
if (!num_req_buffers) {
dp_mon_debug("%pK: Received request for 0 buffers replenish",
dp_soc);
ret = QDF_STATUS_E_INVAL;
goto free_desc;
}
mon_srng = dp_mon_srng->hal_srng;
hal_srng_access_start(dp_soc->hal_soc, mon_srng);
num_entries_avail = hal_srng_src_num_avail(dp_soc->hal_soc,
mon_srng, sync_hw_ptr);
if (!num_entries_avail) {
hal_srng_access_end(dp_soc->hal_soc, mon_srng);
goto free_desc;
}
if (num_entries_avail < num_req_buffers) {
num_req_buffers = num_entries_avail;
}
/*
* if desc_list is NULL, allocate the descs from freelist
*/
if (!(*desc_list)) {
num_alloc_desc = dp_mon_get_free_desc_list(dp_soc,
mon_desc_pool,
num_req_buffers,
desc_list,
tail);
if (!num_alloc_desc) {
dp_mon_debug("%pK: no free rx_descs in freelist", dp_soc);
hal_srng_access_end(dp_soc->hal_soc, mon_srng);
return QDF_STATUS_E_NOMEM;
}
dp_mon_info("%pK: %d rx desc allocated",
dp_soc, num_alloc_desc);
num_req_buffers = num_alloc_desc;
}
while (count <= num_req_buffers - 1) {
ret = dp_mon_frag_alloc_and_map(dp_soc,
&mon_desc,
mon_desc_pool);
if (qdf_unlikely(QDF_IS_STATUS_ERROR(ret))) {
if (qdf_unlikely(ret == QDF_STATUS_E_FAULT))
continue;
break;
}
count++;
next = (*desc_list)->next;
mon_ring_entry = hal_srng_src_get_next(
dp_soc->hal_soc,
mon_srng);
if (!mon_ring_entry)
break;
qdf_assert_always((*desc_list)->mon_desc.in_use == 0);
(*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;
(*desc_list)->mon_desc.magic = DP_MON_DESC_MAGIC;
mon_soc->stats.frag_alloc++;
hal_mon_buff_addr_info_set(dp_soc->hal_soc,
mon_ring_entry,
&((*desc_list)->mon_desc),
mon_desc.paddr);
*desc_list = next;
}
hal_srng_access_end(dp_soc->hal_soc, mon_srng);
if (replenish_cnt_ref)
*replenish_cnt_ref += count;
free_desc:
/*
* add any available free desc back to the free list
*/
if (*desc_list) {
dp_mon_add_desc_list_to_free_list(dp_soc, desc_list, tail,
mon_desc_pool);
}
return ret;
}
QDF_STATUS QDF_STATUS
dp_mon_desc_pool_init(struct dp_mon_desc_pool *mon_desc_pool, dp_mon_desc_pool_init(struct dp_mon_desc_pool *mon_desc_pool,
uint32_t pool_size) uint32_t pool_size)
@@ -441,16 +178,6 @@ void dp_mon_desc_pool_free(struct dp_mon_desc_pool *mon_desc_pool)
qdf_mem_free(mon_desc_pool->array); qdf_mem_free(mon_desc_pool->array);
} }
QDF_STATUS dp_mon_desc_pool_alloc(uint32_t pool_size,
struct dp_mon_desc_pool *mon_desc_pool)
{
mon_desc_pool->pool_size = pool_size - 1;
mon_desc_pool->array = qdf_mem_malloc((mon_desc_pool->pool_size) *
sizeof(union dp_mon_desc_list_elem_t));
return QDF_STATUS_SUCCESS;
}
QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_rx_2_0(struct dp_pdev *pdev) QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_rx_2_0(struct dp_pdev *pdev)
{ {
int rx_mon_max_entries; int rx_mon_max_entries;
@@ -495,53 +222,6 @@ QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_rx_2_0(struct dp_pdev *pdev)
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_tx_2_0(struct dp_pdev *pdev,
uint16_t num_of_buffers)
{
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_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 < num_of_buffers) {
if (dp_tx_mon_buffers_alloc(soc,
(num_of_buffers -
mon_soc_be->tx_mon_ring_fill_level))) {
dp_mon_err("%pK: Tx mon buffers allocation failed",
soc);
return QDF_STATUS_E_FAILURE;
}
mon_soc_be->tx_mon_ring_fill_level +=
(num_of_buffers -
mon_soc_be->tx_mon_ring_fill_level);
}
return QDF_STATUS_SUCCESS;
}
static static
QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev *pdev) QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev *pdev)
{ {
@@ -839,39 +519,6 @@ QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc,
return status; return status;
} }
QDF_STATUS dp_tx_mon_refill_buf_ring_2_0(struct dp_intr *int_ctx)
{
struct dp_soc *soc = int_ctx->soc;
struct dp_mon_soc *mon_soc = soc->monitor_soc;
union dp_mon_desc_list_elem_t *desc_list = NULL;
union dp_mon_desc_list_elem_t *tail = NULL;
struct dp_srng *tx_mon_buf_ring;
struct dp_intr_stats *intr_stats = &int_ctx->intr_stats;
struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
uint32_t num_entries_avail;
int sync_hw_ptr = 1;
void *hal_srng;
tx_mon_buf_ring = &mon_soc_be->tx_mon_buf_ring;
hal_srng = tx_mon_buf_ring->hal_srng;
intr_stats->num_host2txmon_ring__masks++;
mon_soc_be->tx_low_thresh_intrs++;
hal_srng_access_start(soc->hal_soc, hal_srng);
num_entries_avail = hal_srng_src_num_avail(soc->hal_soc,
hal_srng,
sync_hw_ptr);
hal_srng_access_end(soc->hal_soc, hal_srng);
if (num_entries_avail)
dp_mon_buffers_replenish(soc, tx_mon_buf_ring,
&mon_soc_be->tx_desc_mon,
num_entries_avail, &desc_list, &tail,
NULL);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS dp_rx_mon_refill_buf_ring_2_0(struct dp_intr *int_ctx) QDF_STATUS dp_rx_mon_refill_buf_ring_2_0(struct dp_intr *int_ctx)
{ {
struct dp_soc *soc = int_ctx->soc; struct dp_soc *soc = int_ctx->soc;
@@ -954,55 +601,6 @@ static void dp_mon_soc_deinit_2_0(struct dp_soc *soc)
mon_soc_be->is_dp_mon_soc_initialized = false; mon_soc_be->is_dp_mon_soc_initialized = false;
} }
static
QDF_STATUS dp_rx_mon_soc_init_2_0(struct dp_soc *soc)
{
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_rx_mon_buf_desc_pool_init(soc)) {
dp_mon_err("%pK: " RNG_ERR "rx mon desc pool init", soc);
goto fail;
}
/* monitor buffers for src */
if (dp_rx_mon_buffers_alloc(soc, DP_MON_RING_FILL_LEVEL_DEFAULT)) {
dp_mon_err("%pK: Rx mon buffers allocation failed", soc);
goto fail;
}
return QDF_STATUS_SUCCESS;
fail:
return QDF_STATUS_E_FAILURE;
}
static
QDF_STATUS dp_tx_mon_soc_init_2_0(struct dp_soc *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);
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;
}
if (dp_tx_mon_buf_desc_pool_init(soc)) {
dp_mon_err("%pK: " RNG_ERR "tx mon desc pool init", soc);
goto fail;
}
return QDF_STATUS_SUCCESS;
fail:
return QDF_STATUS_E_FAILURE;
}
static
QDF_STATUS dp_mon_soc_init_2_0(struct dp_soc *soc) QDF_STATUS dp_mon_soc_init_2_0(struct dp_soc *soc)
{ {
struct dp_mon_soc *mon_soc = soc->monitor_soc; struct dp_mon_soc *mon_soc = soc->monitor_soc;
@@ -1082,110 +680,6 @@ fail:
return QDF_STATUS_E_NOMEM; return QDF_STATUS_E_NOMEM;
} }
static
void dp_pdev_mon_rings_deinit_2_0(struct dp_pdev *pdev)
{
int mac_id = 0;
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);
for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
pdev->pdev_id);
dp_srng_deinit(soc, &soc->rxdma_mon_dst_ring[lmac_id],
RXDMA_MONITOR_DST, pdev->pdev_id);
dp_srng_deinit(soc, &mon_soc_be->tx_mon_dst_ring[lmac_id],
TX_MONITOR_DST, pdev->pdev_id);
}
}
static
QDF_STATUS dp_pdev_mon_rings_init_2_0(struct dp_pdev *pdev)
{
struct dp_soc *soc = pdev->soc;
int mac_id = 0;
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);
for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
pdev->pdev_id);
if (dp_srng_init(soc, &soc->rxdma_mon_dst_ring[lmac_id],
RXDMA_MONITOR_DST, pdev->pdev_id, lmac_id)) {
dp_mon_err("%pK: " RNG_ERR "rxdma_mon_dst_ring", soc);
goto fail;
}
if (dp_srng_init(soc, &mon_soc_be->tx_mon_dst_ring[lmac_id],
TX_MONITOR_DST, pdev->pdev_id, lmac_id)) {
dp_mon_err("%pK: " RNG_ERR "tx_mon_dst_ring", soc);
goto fail;
}
}
return QDF_STATUS_SUCCESS;
fail:
dp_pdev_mon_rings_deinit_2_0(pdev);
return QDF_STATUS_E_NOMEM;
}
static
void dp_pdev_mon_rings_free_2_0(struct dp_pdev *pdev)
{
int mac_id = 0;
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);
for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
pdev->pdev_id);
dp_srng_free(soc, &soc->rxdma_mon_dst_ring[lmac_id]);
dp_srng_free(soc, &mon_soc_be->tx_mon_dst_ring[lmac_id]);
}
}
static
QDF_STATUS dp_pdev_mon_rings_alloc_2_0(struct dp_pdev *pdev)
{
struct dp_soc *soc = pdev->soc;
int mac_id = 0;
int entries;
struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
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);
pdev_cfg_ctx = pdev->wlan_cfg_ctx;
for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
int lmac_id =
dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev->pdev_id);
entries = wlan_cfg_get_dma_rx_mon_dest_ring_size(pdev_cfg_ctx);
if (dp_srng_alloc(soc, &soc->rxdma_mon_dst_ring[lmac_id],
RXDMA_MONITOR_DST, entries, 0)) {
dp_err("%pK: " RNG_ERR "rxdma_mon_dst_ring", pdev);
goto fail;
}
entries = wlan_cfg_get_dma_tx_mon_dest_ring_size(pdev_cfg_ctx);
if (dp_srng_alloc(soc, &mon_soc_be->tx_mon_dst_ring[lmac_id],
TX_MONITOR_DST, entries, 0)) {
dp_err("%pK: " RNG_ERR "tx_mon_dst_ring", pdev);
goto fail;
}
}
return QDF_STATUS_SUCCESS;
fail:
dp_pdev_mon_rings_free_2_0(pdev);
return QDF_STATUS_E_NOMEM;
}
static static
void dp_mon_pdev_free_2_0(struct dp_pdev *pdev) void dp_mon_pdev_free_2_0(struct dp_pdev *pdev)
{ {
@@ -1223,11 +717,6 @@ dp_tx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
return 0; return 0;
} }
static void
dp_tx_mon_print_ring_stat_2_0(struct dp_pdev *pdev)
{
}
static inline static inline
QDF_STATUS dp_mon_soc_attach_2_0(struct dp_soc *soc) QDF_STATUS dp_mon_soc_attach_2_0(struct dp_soc *soc)
{ {
@@ -1286,6 +775,291 @@ QDF_STATUS dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev *pdev,
} }
#endif #endif
void dp_pdev_mon_rings_deinit_2_0(struct dp_pdev *pdev)
{
int mac_id = 0;
struct dp_soc *soc = pdev->soc;
for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
pdev->pdev_id);
dp_rx_mon_pdev_rings_deinit_2_0(pdev, lmac_id);
dp_tx_mon_pdev_rings_deinit_2_0(pdev, lmac_id);
}
}
QDF_STATUS dp_pdev_mon_rings_init_2_0(struct dp_pdev *pdev)
{
struct dp_soc *soc = pdev->soc;
int mac_id = 0;
QDF_STATUS status = QDF_STATUS_SUCCESS;
for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
pdev->pdev_id);
status = dp_rx_mon_pdev_rings_init_2_0(pdev, lmac_id);
if (QDF_IS_STATUS_ERROR(status)) {
dp_mon_err("%pK: " RNG_ERR "rxdma_mon_dst_ring", soc);
goto fail;
}
status = dp_tx_mon_pdev_rings_init_2_0(pdev, lmac_id);
if (QDF_IS_STATUS_ERROR(status)) {
dp_mon_err("%pK: " RNG_ERR "tx_mon_dst_ring", soc);
goto fail;
}
}
return status;
fail:
dp_pdev_mon_rings_deinit_2_0(pdev);
return status;
}
void dp_pdev_mon_rings_free_2_0(struct dp_pdev *pdev)
{
int mac_id = 0;
struct dp_soc *soc = pdev->soc;
for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
pdev->pdev_id);
dp_rx_mon_pdev_rings_free_2_0(pdev, lmac_id);
dp_tx_mon_pdev_rings_free_2_0(pdev, lmac_id);
}
}
QDF_STATUS dp_pdev_mon_rings_alloc_2_0(struct dp_pdev *pdev)
{
struct dp_soc *soc = pdev->soc;
int mac_id = 0;
QDF_STATUS status = QDF_STATUS_SUCCESS;
for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
int lmac_id =
dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev->pdev_id);
status = dp_rx_mon_pdev_rings_alloc_2_0(pdev, lmac_id);
if (QDF_IS_STATUS_ERROR(status)) {
dp_err("%pK: " RNG_ERR "rxdma_mon_dst_ring", pdev);
goto fail;
}
status = dp_tx_mon_pdev_rings_alloc_2_0(pdev, lmac_id);
if (QDF_IS_STATUS_ERROR(status)) {
dp_err("%pK: " RNG_ERR "tx_mon_dst_ring", pdev);
goto fail;
}
}
return status;
fail:
dp_pdev_mon_rings_free_2_0(pdev);
return status;
}
void dp_mon_pool_frag_unmap_and_free(struct dp_soc *soc,
struct dp_mon_desc_pool *mon_desc_pool)
{
int desc_id;
qdf_frag_t vaddr;
qdf_dma_addr_t paddr;
qdf_spin_lock_bh(&mon_desc_pool->lock);
for (desc_id = 0; desc_id < mon_desc_pool->pool_size; desc_id++) {
if (mon_desc_pool->array[desc_id].mon_desc.in_use) {
vaddr = mon_desc_pool->array[desc_id].mon_desc.buf_addr;
paddr = mon_desc_pool->array[desc_id].mon_desc.paddr;
if (!(mon_desc_pool->array[desc_id].mon_desc.unmapped)) {
qdf_mem_unmap_page(soc->osdev, paddr,
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;
}
qdf_frag_free(vaddr);
}
}
qdf_spin_unlock_bh(&mon_desc_pool->lock);
}
QDF_STATUS
dp_mon_buffers_replenish(struct dp_soc *dp_soc,
struct dp_srng *dp_mon_srng,
struct dp_mon_desc_pool *mon_desc_pool,
uint32_t num_req_buffers,
union dp_mon_desc_list_elem_t **desc_list,
union dp_mon_desc_list_elem_t **tail,
uint32_t *replenish_cnt_ref)
{
uint32_t num_alloc_desc;
uint32_t num_entries_avail;
uint32_t count = 0;
int sync_hw_ptr = 1;
struct dp_mon_desc mon_desc = {0};
void *mon_ring_entry;
union dp_mon_desc_list_elem_t *next;
void *mon_srng;
QDF_STATUS ret = QDF_STATUS_E_FAILURE;
struct dp_mon_soc *mon_soc = dp_soc->monitor_soc;
if (!num_req_buffers) {
dp_mon_debug("%pK: Received request for 0 buffers replenish",
dp_soc);
ret = QDF_STATUS_E_INVAL;
goto free_desc;
}
mon_srng = dp_mon_srng->hal_srng;
hal_srng_access_start(dp_soc->hal_soc, mon_srng);
num_entries_avail = hal_srng_src_num_avail(dp_soc->hal_soc,
mon_srng, sync_hw_ptr);
if (!num_entries_avail) {
hal_srng_access_end(dp_soc->hal_soc, mon_srng);
goto free_desc;
}
if (num_entries_avail < num_req_buffers)
num_req_buffers = num_entries_avail;
/*
* if desc_list is NULL, allocate the descs from freelist
*/
if (!(*desc_list)) {
num_alloc_desc = dp_mon_get_free_desc_list(dp_soc,
mon_desc_pool,
num_req_buffers,
desc_list,
tail);
if (!num_alloc_desc) {
dp_mon_debug("%pK: no free rx_descs in freelist", dp_soc);
hal_srng_access_end(dp_soc->hal_soc, mon_srng);
return QDF_STATUS_E_NOMEM;
}
dp_mon_info("%pK: %d rx desc allocated",
dp_soc, num_alloc_desc);
num_req_buffers = num_alloc_desc;
}
while (count <= num_req_buffers - 1) {
ret = dp_mon_frag_alloc_and_map(dp_soc,
&mon_desc,
mon_desc_pool);
if (qdf_unlikely(QDF_IS_STATUS_ERROR(ret))) {
if (qdf_unlikely(ret == QDF_STATUS_E_FAULT))
continue;
break;
}
count++;
next = (*desc_list)->next;
mon_ring_entry = hal_srng_src_get_next(
dp_soc->hal_soc,
mon_srng);
if (!mon_ring_entry)
break;
qdf_assert_always((*desc_list)->mon_desc.in_use == 0);
(*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;
(*desc_list)->mon_desc.magic = DP_MON_DESC_MAGIC;
mon_soc->stats.frag_alloc++;
hal_mon_buff_addr_info_set(dp_soc->hal_soc,
mon_ring_entry,
&((*desc_list)->mon_desc),
mon_desc.paddr);
*desc_list = next;
}
hal_srng_access_end(dp_soc->hal_soc, mon_srng);
if (replenish_cnt_ref)
*replenish_cnt_ref += count;
free_desc:
/*
* add any available free desc back to the free list
*/
if (*desc_list) {
dp_mon_add_desc_list_to_free_list(dp_soc, desc_list, tail,
mon_desc_pool);
}
return ret;
}
QDF_STATUS dp_mon_desc_pool_alloc(uint32_t pool_size,
struct dp_mon_desc_pool *mon_desc_pool)
{
mon_desc_pool->pool_size = pool_size - 1;
mon_desc_pool->array = qdf_mem_malloc((mon_desc_pool->pool_size) *
sizeof(union dp_mon_desc_list_elem_t));
return QDF_STATUS_SUCCESS;
}
QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_tx_2_0(struct dp_pdev *pdev,
uint16_t num_of_buffers)
{
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_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 < num_of_buffers) {
if (dp_tx_mon_buffers_alloc(soc,
(num_of_buffers -
mon_soc_be->tx_mon_ring_fill_level))) {
dp_mon_err("%pK: Tx mon buffers allocation failed",
soc);
return QDF_STATUS_E_FAILURE;
}
mon_soc_be->tx_mon_ring_fill_level +=
(num_of_buffers -
mon_soc_be->tx_mon_ring_fill_level);
}
return QDF_STATUS_SUCCESS;
}
#if defined(WDI_EVENT_ENABLE) &&\ #if defined(WDI_EVENT_ENABLE) &&\
(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
static inline static inline
@@ -1747,28 +1521,6 @@ void dp_mon_cdp_ops_register_2_0(struct cdp_ops *ops)
} }
#endif #endif
#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\
defined(WLAN_SUPPORT_RX_TAG_STATISTICS)
/** dp_mon_rx_update_rx_protocol_tag_stats() - Update mon protocols's
* statistics
* @pdev: pdev handle
* @protocol_index: Protocol index for which the stats should be incremented
* @ring_index: REO ring number from which this tag was received.
*
* Return: void
*/
void dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev,
uint16_t protocol_index)
{
pdev->mon_proto_tag_stats[protocol_index].tag_ctr++;
}
#else
void dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev,
uint16_t protocol_index)
{
}
#endif
#ifdef QCA_ENHANCED_STATS_SUPPORT #ifdef QCA_ENHANCED_STATS_SUPPORT
static void static void
dp_enable_enhanced_stats_for_each_pdev(struct dp_soc *soc, void *arg, dp_enable_enhanced_stats_for_each_pdev(struct dp_soc *soc, void *arg,

View File

@@ -490,21 +490,6 @@ dp_rx_mon_add_frag_to_skb(struct hal_rx_ppdu_info *ppdu_info,
} }
} }
#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\
defined(WLAN_SUPPORT_RX_FLOW_TAG)
/**
* dp_mon_rx_update_rx_protocol_tag_stats() - Update mon protocols's
* statistics from given protocol
* type
* @pdev: pdev handle
* @protocol_index: Protocol index for which the stats should be incremented
*
* Return: void
*/
void dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev,
uint16_t protocol_index);
#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
#if !defined(DISABLE_MON_CONFIG) && (defined(WLAN_PKT_CAPTURE_TX_2_0) || \ #if !defined(DISABLE_MON_CONFIG) && (defined(WLAN_PKT_CAPTURE_TX_2_0) || \
defined(WLAN_PKT_CAPTURE_RX_2_0)) defined(WLAN_PKT_CAPTURE_RX_2_0))
/** /**

View File

@@ -119,16 +119,6 @@ fail:
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
void dp_rx_mon_hdr_length_set(uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter)
{
if (!msg_word || !tlv_filter)
return;
HTT_RX_RING_SELECTION_CFG_RX_HDR_LEN_SET(*msg_word,
tlv_filter->rx_hdr_length);
}
void dp_rx_mon_packet_length_set(uint32_t *msg_word, void dp_rx_mon_packet_length_set(uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter) struct htt_rx_ring_tlv_filter *tlv_filter)
{ {
@@ -1013,6 +1003,7 @@ dp_htt_h2t_send_complete_free_netbuf(
* @htt_tlv_filter: Rx SRNG TLV and filter setting * @htt_tlv_filter: Rx SRNG TLV and filter setting
* Return: 0 on success; error code on failure * Return: 0 on success; error code on failure
*/ */
static
int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id, int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id,
hal_ring_handle_t hal_ring_hdl, hal_ring_handle_t hal_ring_hdl,
int hal_ring_type, int ring_buf_size, int hal_ring_type, int ring_buf_size,
@@ -1390,7 +1381,7 @@ dp_mon_filter_reset_undecoded_metadata_capture_2_0(struct dp_pdev *pdev)
} }
#endif #endif
void dp_tx_mon_filter_set_downstream_tlvs(struct htt_tx_ring_tlv_filter *filter) static void dp_tx_mon_filter_set_downstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
{ {
filter->dtlvs.tx_fes_setup = 1; filter->dtlvs.tx_fes_setup = 1;
filter->dtlvs.pcu_ppdu_setup_init = 1; filter->dtlvs.pcu_ppdu_setup_init = 1;
@@ -1399,7 +1390,8 @@ void dp_tx_mon_filter_set_downstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
filter->dtlvs.fw2s_mon = 1; filter->dtlvs.fw2s_mon = 1;
} }
void dp_tx_mon_filter_set_upstream_tlvs(struct htt_tx_ring_tlv_filter *filter) static void
dp_tx_mon_filter_set_upstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
{ {
filter->utlvs.tx_fes_status_end = 1; filter->utlvs.tx_fes_status_end = 1;
filter->utlvs.rx_response_required_info = 1; filter->utlvs.rx_response_required_info = 1;
@@ -1434,7 +1426,8 @@ void dp_tx_mon_filter_set_upstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
filter->utlvs.eht_sig_usr_ofdma = 1; filter->utlvs.eht_sig_usr_ofdma = 1;
} }
void dp_tx_mon_filter_set_all(struct dp_mon_pdev_be *mon_pdev_be, static void
dp_tx_mon_filter_set_all(struct dp_mon_pdev_be *mon_pdev_be,
struct htt_tx_ring_tlv_filter *filter) struct htt_tx_ring_tlv_filter *filter)
{ {
qdf_mem_zero(&filter->dtlvs, qdf_mem_zero(&filter->dtlvs,
@@ -1472,6 +1465,7 @@ void dp_tx_mon_filter_set_all(struct dp_mon_pdev_be *mon_pdev_be,
filter->data_dma_length = mon_pdev_be->tx_mon_filter_length; filter->data_dma_length = mon_pdev_be->tx_mon_filter_length;
} }
static
void dp_tx_mon_filter_set_word_mask(struct dp_pdev *pdev, void dp_tx_mon_filter_set_word_mask(struct dp_pdev *pdev,
struct htt_tx_ring_tlv_filter *filter) struct htt_tx_ring_tlv_filter *filter)
{ {
@@ -2297,6 +2291,7 @@ void dp_mon_filter_reset_rx_pktlog_cbf_2_0(struct dp_pdev *pdev)
mon_pdev_be->filter_be[mode][srng_type] = filter; mon_pdev_be->filter_be[mode][srng_type] = filter;
} }
#ifdef BE_PKTLOG_SUPPORT
void dp_mon_filter_setup_pktlog_hybrid_2_0(struct dp_pdev *pdev) void dp_mon_filter_setup_pktlog_hybrid_2_0(struct dp_pdev *pdev)
{ {
struct dp_mon_filter_be filter = {0}; struct dp_mon_filter_be filter = {0};
@@ -2389,6 +2384,7 @@ void dp_mon_filter_reset_pktlog_hybrid_2_0(struct dp_pdev *pdev)
mon_pdev_be->filter_be[mode][srng_type] = filter; mon_pdev_be->filter_be[mode][srng_type] = filter;
} }
#endif
#endif /* WDI_EVENT_ENABLE */ #endif /* WDI_EVENT_ENABLE */
/** /**

View File

@@ -25,18 +25,6 @@
#define DMA_LENGTH_128B 2 #define DMA_LENGTH_128B 2
#define DMA_LENGTH_256B 4 #define DMA_LENGTH_256B 4
/* rx hdr tlv dma lengths */
enum dp_rx_hdr_dma_length {
/* default dma length(128B) */
DEFAULT_RX_HDR_DMA_LENGTH = 0,
/* dma length 64 bytes */
RX_HDR_DMA_LENGTH_64B = 1,
/* dma length 128 bytes */
RX_HDR_DMA_LENGTH_128B = 2,
/* dma length 256 bytes */
RX_HDR_DMA_LENGTH_256B = 3,
};
/* fwd declarations */ /* fwd declarations */
struct dp_mon_pdev_be; struct dp_mon_pdev_be;
@@ -49,15 +37,6 @@ void
dp_rx_mon_enable_set(uint32_t *msg_word, dp_rx_mon_enable_set(uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter); struct htt_rx_ring_tlv_filter *tlv_filter);
/**
* dp_rx_mon_hdr_length_set() - Setup rx monitor hdr tlv length
* @msg_word: msg word
* @tlv_filter: rx ring filter configuration
*/
void
dp_rx_mon_hdr_length_set(uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter);
/** /**
* dp_rx_mon_packet_length_set() - Setup rx monitor per packet type length * dp_rx_mon_packet_length_set() - Setup rx monitor per packet type length
* @msg_word: msg word * @msg_word: msg word

View File

@@ -40,9 +40,21 @@
#define F_MASK 0xFFFF #define F_MASK 0xFFFF
#define TEST_MASK 0xCBF #define TEST_MASK 0xCBF
#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\ #if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\
defined(WLAN_SUPPORT_RX_FLOW_TAG) defined(WLAN_SUPPORT_RX_TAG_STATISTICS)
/** dp_mon_rx_update_rx_protocol_tag_stats() - Update mon protocols's
* statistics
* @pdev: pdev handle
* @protocol_index: Protocol index for which the stats should be incremented
* @ring_index: REO ring number from which this tag was received.
*
* Return: void
*/
static void dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev,
uint16_t protocol_index)
{
pdev->mon_proto_tag_stats[protocol_index].tag_ctr++;
}
#ifdef QCA_TEST_MON_PF_TAGS_STATS #ifdef QCA_TEST_MON_PF_TAGS_STATS
static static
@@ -57,7 +69,6 @@ static
void dp_rx_mon_print_tag_buf(uint8_t *buf, uint16_t room) void dp_rx_mon_print_tag_buf(uint8_t *buf, uint16_t room)
{ {
} }
#endif #endif
/** /**
@@ -168,22 +179,6 @@ dp_rx_mon_nbuf_add_rx_frag(qdf_nbuf_t nbuf, qdf_frag_t *frag,
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
/**
* dp_mon_free_parent_nbuf() - Free parent SKB
*
* @mon_pdev: monitor pdev
* @nbuf: SKB to be freed
*
* Return: void
*/
void
dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev,
qdf_nbuf_t nbuf)
{
mon_pdev->rx_mon_stats.parent_buf_free++;
qdf_nbuf_free(nbuf);
}
void void
dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc, dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc,
struct hal_rx_ppdu_info *ppdu_info) struct hal_rx_ppdu_info *ppdu_info)
@@ -340,19 +335,49 @@ dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf,
} }
#else #else
static inline void
static dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev,
void dp_rx_mon_set_zero(qdf_nbuf_t nbuf) uint16_t protocol_index)
{ {
} }
static static inline void
dp_rx_mon_update_drop_cnt(struct dp_mon_pdev *mon_pdev,
struct hal_mon_desc *hal_mon_rx_desc)
{
}
static inline void dp_rx_mon_set_zero(qdf_nbuf_t nbuf)
{
}
static inline QDF_STATUS
dp_rx_mon_nbuf_add_rx_frag(qdf_nbuf_t nbuf, qdf_frag_t *frag,
uint16_t frag_len, uint16_t offset,
uint16_t buf_size, bool frag_ref)
{
return QDF_STATUS_SUCCESS;
}
static inline struct hal_rx_ppdu_info*
dp_rx_mon_get_ppdu_info(struct dp_mon_pdev *mon_pdev)
{
return NULL;
}
static inline void
__dp_rx_mon_free_ppdu_info(struct dp_mon_pdev *mon_pdev,
struct hal_rx_ppdu_info *ppdu_info)
{
}
static inline
void dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc, void dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc,
struct hal_rx_ppdu_info *ppdu_info) struct hal_rx_ppdu_info *ppdu_info)
{ {
} }
static static inline
void dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf, void dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf,
struct hal_rx_ppdu_info *ppdu_info, struct hal_rx_ppdu_info *ppdu_info,
struct dp_pdev *pdev, struct dp_pdev *pdev,
@@ -590,6 +615,21 @@ dp_mon_record_clear_buffer(struct dp_mon_pdev_be *mon_pdev_be) {
#endif #endif
/**
* dp_mon_free_parent_nbuf() - Free parent SKB
*
* @mon_pdev: monitor pdev
* @nbuf: SKB to be freed
*
* Return: void
*/
void dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev,
qdf_nbuf_t nbuf)
{
mon_pdev->rx_mon_stats.parent_buf_free++;
qdf_nbuf_free(nbuf);
}
/** /**
* dp_rx_mon_free_mpdu_queue() - Free MPDU queue * dp_rx_mon_free_mpdu_queue() - Free MPDU queue
* @mon_pdev: monitor pdev * @mon_pdev: monitor pdev
@@ -1397,6 +1437,8 @@ static void dp_rx_mon_append_nbuf(qdf_nbuf_t nbuf, qdf_nbuf_t tmp_nbuf)
qdf_nbuf_set_next(last_nbuf, tmp_nbuf); qdf_nbuf_set_next(last_nbuf, tmp_nbuf);
} }
} }
static
uint8_t dp_rx_mon_process_tlv_status(struct dp_pdev *pdev, uint8_t dp_rx_mon_process_tlv_status(struct dp_pdev *pdev,
struct hal_rx_ppdu_info *ppdu_info, struct hal_rx_ppdu_info *ppdu_info,
void *status_frag, void *status_frag,
@@ -2206,87 +2248,123 @@ dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
return work_done; return work_done;
} }
void QDF_STATUS dp_rx_mon_ppdu_info_cache_create(struct dp_pdev *pdev)
dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *soc)
{ {
struct dp_mon_soc *mon_soc = soc->monitor_soc; struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); struct dp_mon_pdev_be *mon_pdev_be =
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
uint16_t obj;
struct hal_rx_ppdu_info *ppdu_info = NULL;
/* Drain page frag cachce before pool deinit */ mon_pdev_be->ppdu_info_cache =
qdf_frag_cache_drain(&mon_soc_be->rx_desc_mon.pf_cache); qdf_kmem_cache_create("rx_mon_ppdu_info_cache",
dp_mon_desc_pool_deinit(&mon_soc_be->rx_desc_mon); sizeof(struct hal_rx_ppdu_info));
if (!mon_pdev_be->ppdu_info_cache) {
dp_mon_err("cache creation failed pdev :%px", pdev);
return QDF_STATUS_E_NOMEM;
}
TAILQ_INIT(&mon_pdev_be->rx_mon_free_queue);
for (obj = 0; obj < DP_RX_MON_WQ_THRESHOLD; obj++) {
ppdu_info = (struct hal_rx_ppdu_info *)qdf_kmem_cache_alloc(mon_pdev_be->ppdu_info_cache);
if (ppdu_info) {
TAILQ_INSERT_TAIL(&mon_pdev_be->rx_mon_free_queue,
ppdu_info,
ppdu_free_list_elem);
mon_pdev_be->total_free_elem++;
}
}
qdf_spinlock_create(&mon_pdev_be->ppdu_info_lock);
return QDF_STATUS_SUCCESS;
} }
QDF_STATUS void dp_rx_mon_ppdu_info_cache_destroy(struct dp_pdev *pdev)
dp_rx_mon_buf_desc_pool_init(struct dp_soc *soc)
{ {
struct dp_mon_soc *mon_soc = soc->monitor_soc; struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); struct dp_mon_pdev_be *mon_pdev_be =
uint32_t num_entries; dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
struct hal_rx_ppdu_info *ppdu_info = NULL, *temp_ppdu_info = NULL;
num_entries = qdf_spin_lock(&mon_pdev_be->ppdu_info_lock);
wlan_cfg_get_dp_soc_rx_mon_buf_ring_size(soc->wlan_cfg_ctx); TAILQ_FOREACH_SAFE(ppdu_info,
return dp_mon_desc_pool_init(&mon_soc_be->rx_desc_mon, num_entries); &mon_pdev_be->rx_mon_free_queue,
ppdu_free_list_elem,
temp_ppdu_info) {
TAILQ_REMOVE(&mon_pdev_be->rx_mon_free_queue,
ppdu_info, ppdu_free_list_elem);
if (ppdu_info) {
mon_pdev_be->total_free_elem--;
qdf_kmem_cache_free(mon_pdev_be->ppdu_info_cache,
ppdu_info);
}
}
qdf_spin_unlock(&mon_pdev_be->ppdu_info_lock);
dp_mon_debug(" total free element: %d", mon_pdev_be->total_free_elem);
qdf_kmem_cache_destroy(mon_pdev_be->ppdu_info_cache);
} }
void dp_rx_mon_buf_desc_pool_free(struct dp_soc *soc) /**
* dp_mon_pdev_ext_init_2_0() - Init pdev ext param
*
* @pdev: DP pdev handle
*
* Return: QDF_STATUS_SUCCESS: Success
* QDF_STATUS_E_FAILURE: failure
*/
QDF_STATUS dp_mon_pdev_ext_init_2_0(struct dp_pdev *pdev)
{ {
struct dp_mon_soc *mon_soc = soc->monitor_soc; struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); struct dp_mon_pdev_be *mon_pdev_be =
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
if (mon_soc) qdf_create_work(0, &mon_pdev_be->rx_mon_work,
dp_mon_desc_pool_free(&mon_soc_be->rx_desc_mon); dp_rx_mon_process_ppdu, pdev);
mon_pdev_be->rx_mon_workqueue =
qdf_alloc_unbound_workqueue("rx_mon_work_queue");
if (!mon_pdev_be->rx_mon_workqueue) {
dp_mon_err("failed to create rxmon wq mon_pdev: %pK", mon_pdev);
goto fail;
}
TAILQ_INIT(&mon_pdev_be->rx_mon_queue);
qdf_spinlock_create(&mon_pdev_be->rx_mon_wq_lock);
return QDF_STATUS_SUCCESS;
fail:
return QDF_STATUS_E_FAILURE;
} }
QDF_STATUS /**
dp_rx_mon_buf_desc_pool_alloc(struct dp_soc *soc) * dp_mon_pdev_ext_deinit_2_0() - denit pdev ext param
*
* @pdev: DP pdev handle
*
* Return: QDF_STATUS_SUCCESS
*/
QDF_STATUS dp_mon_pdev_ext_deinit_2_0(struct dp_pdev *pdev)
{ {
struct dp_mon_desc_pool *rx_mon_desc_pool; struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct dp_mon_soc *mon_soc = soc->monitor_soc; struct dp_mon_pdev_be *mon_pdev_be =
struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
int entries;
struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
soc_cfg_ctx = soc->wlan_cfg_ctx; if (!mon_pdev_be->rx_mon_workqueue)
return QDF_STATUS_E_FAILURE;
entries = wlan_cfg_get_dp_soc_rx_mon_buf_ring_size(soc_cfg_ctx); qdf_err(" total free element: %d", mon_pdev_be->total_free_elem);
qdf_flush_workqueue(0, mon_pdev_be->rx_mon_workqueue);
qdf_destroy_workqueue(0, mon_pdev_be->rx_mon_workqueue);
qdf_flush_work(&mon_pdev_be->rx_mon_work);
qdf_disable_work(&mon_pdev_be->rx_mon_work);
dp_rx_mon_drain_wq(pdev);
mon_pdev_be->rx_mon_workqueue = NULL;
qdf_spinlock_destroy(&mon_pdev_be->rx_mon_wq_lock);
rx_mon_desc_pool = &mon_soc_be->rx_desc_mon; return QDF_STATUS_SUCCESS;
qdf_print("%s:%d rx mon buf desc pool entries: %d", __func__, __LINE__, entries);
return dp_mon_desc_pool_alloc(entries, rx_mon_desc_pool);
}
void
dp_rx_mon_buffers_free(struct dp_soc *soc)
{
struct dp_mon_desc_pool *rx_mon_desc_pool;
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);
rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
dp_mon_pool_frag_unmap_and_free(soc, rx_mon_desc_pool);
}
QDF_STATUS
dp_rx_mon_buffers_alloc(struct dp_soc *soc, uint32_t size)
{
struct dp_srng *mon_buf_ring;
struct dp_mon_desc_pool *rx_mon_desc_pool;
union dp_mon_desc_list_elem_t *desc_list = NULL;
union dp_mon_desc_list_elem_t *tail = NULL;
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);
mon_buf_ring = &soc->rxdma_mon_buf_ring[0];
rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
return dp_mon_buffers_replenish(soc, mon_buf_ring,
rx_mon_desc_pool,
size,
&desc_list, &tail, NULL);
} }
#ifdef QCA_ENHANCED_STATS_SUPPORT #ifdef QCA_ENHANCED_STATS_SUPPORT
@@ -2449,3 +2527,114 @@ void dp_mon_rx_print_advanced_stats_2_0(struct dp_soc *soc,
mon_pdev->rx_mon_stats.tlv_drop_cnt); mon_pdev->rx_mon_stats.tlv_drop_cnt);
} }
#endif #endif
#ifdef WLAN_PKT_CAPTURE_RX_2_0
void
dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *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);
/* Drain page frag cachce before pool deinit */
qdf_frag_cache_drain(&mon_soc_be->rx_desc_mon.pf_cache);
dp_mon_desc_pool_deinit(&mon_soc_be->rx_desc_mon);
}
QDF_STATUS
dp_rx_mon_buf_desc_pool_init(struct dp_soc *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);
uint32_t num_entries;
num_entries =
wlan_cfg_get_dp_soc_rx_mon_buf_ring_size(soc->wlan_cfg_ctx);
return dp_mon_desc_pool_init(&mon_soc_be->rx_desc_mon, num_entries);
}
void dp_rx_mon_buf_desc_pool_free(struct dp_soc *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);
if (mon_soc)
dp_mon_desc_pool_free(&mon_soc_be->rx_desc_mon);
}
QDF_STATUS
dp_rx_mon_buf_desc_pool_alloc(struct dp_soc *soc)
{
struct dp_srng *mon_buf_ring;
struct dp_mon_desc_pool *rx_mon_desc_pool;
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);
int entries;
struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
soc_cfg_ctx = soc->wlan_cfg_ctx;
entries = wlan_cfg_get_dp_soc_rx_mon_buf_ring_size(soc_cfg_ctx);
mon_buf_ring = &soc->rxdma_mon_buf_ring[0];
rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
qdf_print("%s:%d rx mon buf desc pool entries: %d", __func__, __LINE__, entries);
return dp_mon_desc_pool_alloc(entries, rx_mon_desc_pool);
}
void
dp_rx_mon_buffers_free(struct dp_soc *soc)
{
struct dp_mon_desc_pool *rx_mon_desc_pool;
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);
rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
dp_mon_pool_frag_unmap_and_free(soc, rx_mon_desc_pool);
}
QDF_STATUS
dp_rx_mon_buffers_alloc(struct dp_soc *soc, uint32_t size)
{
struct dp_srng *mon_buf_ring;
struct dp_mon_desc_pool *rx_mon_desc_pool;
union dp_mon_desc_list_elem_t *desc_list = NULL;
union dp_mon_desc_list_elem_t *tail = NULL;
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);
mon_buf_ring = &soc->rxdma_mon_buf_ring[0];
rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
return dp_mon_buffers_replenish(soc, mon_buf_ring,
rx_mon_desc_pool,
size,
&desc_list, &tail, NULL);
}
QDF_STATUS dp_rx_mon_soc_init_2_0(struct dp_soc *soc)
{
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_rx_mon_buf_desc_pool_init(soc)) {
dp_mon_err("%pK: " RNG_ERR "rx mon desc pool init", soc);
goto fail;
}
/* monitor buffers for src */
if (dp_rx_mon_buffers_alloc(soc, DP_MON_RING_FILL_LEVEL_DEFAULT)) {
dp_mon_err("%pK: Rx mon buffers allocation failed", soc);
goto fail;
}
return QDF_STATUS_SUCCESS;
fail:
return QDF_STATUS_E_FAILURE;
}
#endif

View File

@@ -50,6 +50,16 @@
+ (DP_RX_MON_TLV_TOTAL_LEN)) + (DP_RX_MON_TLV_TOTAL_LEN))
#define DP_RX_MON_WQ_THRESHOLD 128 #define DP_RX_MON_WQ_THRESHOLD 128
#ifdef WLAN_PKT_CAPTURE_RX_2_0
QDF_STATUS dp_mon_pdev_ext_init_2_0(struct dp_pdev *pdev);
QDF_STATUS dp_mon_pdev_ext_deinit_2_0(struct dp_pdev *pdev);
QDF_STATUS dp_rx_mon_ppdu_info_cache_create(struct dp_pdev *pdev);
void dp_rx_mon_ppdu_info_cache_destroy(struct dp_pdev *pdev);
QDF_STATUS dp_rx_mon_pdev_rings_init_2_0(struct dp_pdev *pdev, int lmac_id);
void dp_rx_mon_pdev_rings_deinit_2_0(struct dp_pdev *pdev, int lmac_id);
QDF_STATUS dp_rx_mon_soc_init_2_0(struct dp_soc *soc);
/* /*
* dp_rx_mon_buffers_alloc() - allocate rx monitor buffers * dp_rx_mon_buffers_alloc() - allocate rx monitor buffers
* @soc: DP soc handle * @soc: DP soc handle
@@ -154,7 +164,95 @@ QDF_STATUS dp_rx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
struct hal_rx_ppdu_info *ppdu_info, struct hal_rx_ppdu_info *ppdu_info,
void *status_frag, uint32_t end_offset); void *status_frag, uint32_t end_offset);
#if !defined(DISABLE_MON_CONFIG) #else
static inline QDF_STATUS dp_mon_pdev_ext_init_2_0(struct dp_pdev *pdev)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS dp_mon_pdev_ext_deinit_2_0(struct dp_pdev *pdev)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS dp_rx_mon_ppdu_info_cache_create(struct dp_pdev *pdev)
{
return QDF_STATUS_SUCCESS;
}
static inline void dp_rx_mon_ppdu_info_cache_destroy(struct dp_pdev *pdev)
{
}
static inline QDF_STATUS
dp_rx_mon_buffers_alloc(struct dp_soc *soc, uint32_t size)
{
return QDF_STATUS_SUCCESS;
}
static inline
QDF_STATUS dp_rx_mon_soc_init_2_0(struct dp_soc *soc)
{
return QDF_STATUS_SUCCESS;
}
static inline void
dp_rx_mon_buffers_free(struct dp_soc *soc)
{
}
static inline void
dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *soc)
{
}
static inline QDF_STATUS
dp_rx_mon_buf_desc_pool_init(struct dp_soc *soc)
{
return QDF_STATUS_SUCCESS;
}
static inline void dp_rx_mon_buf_desc_pool_free(struct dp_soc *soc)
{
}
static inline QDF_STATUS
dp_rx_mon_buf_desc_pool_alloc(struct dp_soc *soc)
{
return QDF_STATUS_SUCCESS;
}
static inline
void dp_rx_mon_stats_update_2_0(struct dp_mon_peer *mon_peer,
struct cdp_rx_indication_ppdu *ppdu,
struct cdp_rx_stats_ppdu_user *ppdu_user)
{
}
static inline void
dp_rx_mon_populate_ppdu_usr_info_2_0(struct mon_rx_user_status *rx_user_status,
struct cdp_rx_stats_ppdu_user *ppdu_user)
{
}
static inline void
dp_rx_mon_populate_ppdu_info_2_0(struct hal_rx_ppdu_info *hal_ppdu_info,
struct cdp_rx_indication_ppdu *ppdu)
{
}
static inline
QDF_STATUS dp_rx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
struct hal_rx_ppdu_info *ppdu_info,
void *status_frag, uint32_t end_offset)
{
return QDF_STATUS_SUCCESS;
}
#endif
#if !defined(DISABLE_MON_CONFIG) && defined(WLAN_PKT_CAPTURE_RX_2_0)
/* /*
* dp_rx_mon_process_2_0() - Process Rx monitor interrupt * dp_rx_mon_process_2_0() - Process Rx monitor interrupt
* *
@@ -174,7 +272,7 @@ dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
*/ */
void dp_rx_mon_process_ppdu(void *context); void dp_rx_mon_process_ppdu(void *context);
#else #else
static uint32_t static inline uint32_t
dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
uint32_t mac_id, uint32_t quota) uint32_t mac_id, uint32_t quota)
{ {
@@ -217,22 +315,10 @@ void dp_rx_mon_drain_wq(struct dp_pdev *pdev);
* *
* Return: void * Return: void
*/ */
void void dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev,
dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev,
qdf_nbuf_t nbuf); qdf_nbuf_t nbuf);
#if !defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\
!defined(WLAN_SUPPORT_RX_FLOW_TAG)
void
dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf,
struct hal_rx_ppdu_info *ppdu_info,
struct dp_pdev *pdev, struct dp_soc *soc)
{
}
void dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc) #ifdef QCA_ENHANCED_STATS_SUPPORT
{
}
#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
/** /**
* dp_mon_rx_print_advanced_stats_2_0() - print advanced monitor statistics * dp_mon_rx_print_advanced_stats_2_0() - print advanced monitor statistics
* *
@@ -243,4 +329,12 @@ void dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc)
*/ */
void dp_mon_rx_print_advanced_stats_2_0(struct dp_soc *soc, void dp_mon_rx_print_advanced_stats_2_0(struct dp_soc *soc,
struct dp_pdev *pdev); struct dp_pdev *pdev);
#else
static inline
void dp_mon_rx_print_advanced_stats_2_0(struct dp_soc *soc,
struct dp_pdev *pdev)
{
}
#endif
#endif /* _DP_RX_MON_2_0_H_ */ #endif /* _DP_RX_MON_2_0_H_ */

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2021, The Linux Foundation. All rights reserved. * Copyright (c) 2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for any * Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above * purpose with or without fee is hereby granted, provided that the above
@@ -26,6 +26,11 @@
#include <dp_rx.h> #include <dp_rx.h>
#include <dp_rx_mon.h> #include <dp_rx_mon.h>
#ifdef BE_PKTLOG_SUPPORT
#define BUFFER_RESIDUE 1
#define RX_MON_MIN_HEAD_ROOM 64
#endif
QDF_STATUS QDF_STATUS
dp_rx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev, dp_rx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
struct hal_rx_ppdu_info *ppdu_info, struct hal_rx_ppdu_info *ppdu_info,

View File

@@ -356,6 +356,28 @@ void dp_tx_mon_buf_desc_pool_free(struct dp_soc *soc)
dp_mon_desc_pool_free(&mon_soc_be->tx_desc_mon); dp_mon_desc_pool_free(&mon_soc_be->tx_desc_mon);
} }
QDF_STATUS dp_tx_mon_soc_init_2_0(struct dp_soc *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);
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;
}
if (dp_tx_mon_buf_desc_pool_init(soc)) {
dp_mon_err("%pK: " RNG_ERR "tx mon desc pool init", soc);
goto fail;
}
return QDF_STATUS_SUCCESS;
fail:
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS QDF_STATUS
dp_tx_mon_buf_desc_pool_alloc(struct dp_soc *soc) dp_tx_mon_buf_desc_pool_alloc(struct dp_soc *soc)
{ {

View File

@@ -116,6 +116,8 @@ dp_tx_mon_status_free_packet_buf(struct dp_pdev *pdev,
uint32_t end_offset, uint32_t end_offset,
struct dp_tx_mon_desc_list *mon_desc_list_ref); struct dp_tx_mon_desc_list *mon_desc_list_ref);
#if defined(WLAN_TX_PKT_CAPTURE_ENH_BE) && defined(WLAN_PKT_CAPTURE_TX_2_0) && \
defined(BE_PKTLOG_SUPPORT)
/** /**
* dp_tx_process_pktlog_be() - process pktlog * dp_tx_process_pktlog_be() - process pktlog
* @soc: dp soc handle * @soc: dp soc handle
@@ -131,6 +133,15 @@ dp_tx_mon_status_free_packet_buf(struct dp_pdev *pdev,
QDF_STATUS QDF_STATUS
dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev, dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
void *status_frag, uint32_t end_offset); void *status_frag, uint32_t end_offset);
#else
static inline QDF_STATUS
dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
void *status_frag, uint32_t end_offset)
{
return QDF_STATUS_SUCCESS;
}
#endif
/** /**
* dp_tx_mon_process_status_tlv() - API to processed TLV * dp_tx_mon_process_status_tlv() - API to processed TLV
* invoked from interrupt handler * invoked from interrupt handler
@@ -750,4 +761,14 @@ QDF_STATUS dp_peer_set_tx_capture_enabled_2_0(struct dp_pdev *pdev_handle,
QDF_STATUS dp_config_enh_tx_core_monitor_2_0(struct dp_pdev *pdev, uint8_t val); QDF_STATUS dp_config_enh_tx_core_monitor_2_0(struct dp_pdev *pdev, uint8_t val);
#endif #endif
#ifdef WLAN_PKT_CAPTURE_TX_2_0
QDF_STATUS dp_tx_mon_soc_init_2_0(struct dp_soc *soc);
#else
static inline
QDF_STATUS dp_tx_mon_soc_init_2_0(struct dp_soc *soc)
{
return QDF_STATUS_SUCCESS;
}
#endif
#endif /* _DP_TX_MON_2_0_H_ */ #endif /* _DP_TX_MON_2_0_H_ */

View File

@@ -1404,40 +1404,6 @@ dp_tx_mon_update_ppdu_info_status(struct dp_pdev *pdev,
return status; return status;
} }
QDF_STATUS
dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
qdf_frag_t status_frag, uint32_t end_offset)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
qdf_nbuf_t nbuf = NULL;
enum WDI_EVENT pktlog_mode = WDI_NO_VAL;
int frag_bytes;
if (!mon_pdev->pktlog_hybrid_mode)
return QDF_STATUS_E_INVAL;
nbuf = qdf_nbuf_alloc(soc->osdev, MAX_DUMMY_FRM_BODY, 0, 4, FALSE);
if (!nbuf)
return QDF_STATUS_E_NOMEM;
qdf_nbuf_add_rx_frag(status_frag, nbuf, 0,
(end_offset + 1),
0, true);
if (mon_pdev->pktlog_hybrid_mode)
pktlog_mode = WDI_EVENT_HYBRID_TX;
frag_bytes = qdf_nbuf_get_frag_len(nbuf, 0);
if (pktlog_mode != WDI_NO_VAL) {
dp_wdi_event_handler(pktlog_mode, soc,
nbuf, HTT_INVALID_PEER,
WDI_NO_VAL, pdev->pdev_id);
}
qdf_nbuf_free(nbuf);
return QDF_STATUS_SUCCESS;
}
/** /**
* dp_tx_mon_process_tlv_2_0() - API to parse PPDU worth information * dp_tx_mon_process_tlv_2_0() - API to parse PPDU worth information
* @pdev: DP_PDEV handle * @pdev: DP_PDEV handle
@@ -1445,7 +1411,7 @@ dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
* *
* Return: status * Return: status
*/ */
QDF_STATUS static QDF_STATUS
dp_tx_mon_process_tlv_2_0(struct dp_pdev *pdev, dp_tx_mon_process_tlv_2_0(struct dp_pdev *pdev,
struct dp_tx_mon_desc_list *mon_desc_list_ref) struct dp_tx_mon_desc_list *mon_desc_list_ref)
{ {
@@ -1821,3 +1787,41 @@ void dp_tx_mon_update_end_reason(struct dp_mon_pdev *mon_pdev,
{ {
} }
#endif #endif
#if defined(WLAN_TX_PKT_CAPTURE_ENH_BE) && defined(WLAN_PKT_CAPTURE_TX_2_0) && \
defined(BE_PKTLOG_SUPPORT)
QDF_STATUS
dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
qdf_frag_t status_frag, uint32_t end_offset)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
qdf_nbuf_t nbuf = NULL;
enum WDI_EVENT pktlog_mode = WDI_NO_VAL;
int frag_bytes;
if (!mon_pdev->pktlog_hybrid_mode)
return QDF_STATUS_E_INVAL;
nbuf = qdf_nbuf_alloc(soc->osdev, MAX_DUMMY_FRM_BODY, 0, 4, FALSE);
if (!nbuf)
return QDF_STATUS_E_NOMEM;
qdf_nbuf_add_rx_frag(status_frag, nbuf, 0,
(end_offset + 1),
0, true);
if (mon_pdev->pktlog_hybrid_mode)
pktlog_mode = WDI_EVENT_HYBRID_TX;
frag_bytes = qdf_nbuf_get_frag_len(nbuf, 0);
if (pktlog_mode != WDI_NO_VAL) {
dp_wdi_event_handler(pktlog_mode, soc,
nbuf, HTT_INVALID_PEER,
WDI_NO_VAL, pdev->pdev_id);
}
qdf_nbuf_free(nbuf);
return QDF_STATUS_SUCCESS;
}
#endif

View File

@@ -78,6 +78,20 @@ struct dp_peer_tx_capture {
}; };
#endif #endif
/**
* struct ieee80211_ctlframe_addr2 - control frame addr
* @i_fc: frame control
* @i_aidordur: aid or duration
* @i_addr1: address 1
* @i_addr2: address 2
*/
struct ieee80211_ctlframe_addr2 {
uint8_t i_fc[2];
uint8_t i_aidordur[2];
uint8_t i_addr1[QDF_NET_MAC_ADDR_MAX_LEN];
uint8_t i_addr2[QDF_NET_MAC_ADDR_MAX_LEN];
} __packed;
#ifndef WLAN_TX_PKT_CAPTURE_ENH #ifndef WLAN_TX_PKT_CAPTURE_ENH
static inline void static inline void
dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev, dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev,

View File

@@ -496,6 +496,24 @@ void dp_mon_filter_reset_mon_mode(struct dp_pdev *pdev)
mon_ops->mon_filter_reset_rx_mon_mode(pdev); mon_ops->mon_filter_reset_rx_mon_mode(pdev);
} }
#if defined(WLAN_PKT_CAPTURE_RX_2_0) || defined(CONFIG_WORD_BASED_TLV) || \
defined(WLAN_FEATURE_LOCAL_PKT_CAPTURE)
void dp_rx_mon_hdr_length_set(uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter)
{
if (!msg_word || !tlv_filter)
return;
HTT_RX_RING_SELECTION_CFG_RX_HDR_LEN_SET(*msg_word,
tlv_filter->rx_hdr_length);
}
#else
void dp_rx_mon_hdr_length_set(uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter)
{
}
#endif
#ifdef WDI_EVENT_ENABLE #ifdef WDI_EVENT_ENABLE
void dp_mon_filter_setup_rx_pkt_log_full(struct dp_pdev *pdev) void dp_mon_filter_setup_rx_pkt_log_full(struct dp_pdev *pdev)
{ {

View File

@@ -96,6 +96,18 @@ struct dp_mon_filter {
struct htt_rx_ring_tlv_filter tlv_filter; struct htt_rx_ring_tlv_filter tlv_filter;
}; };
/* rx hdr tlv dma lengths */
enum dp_rx_hdr_dma_length {
/* default dma length(128B) */
DEFAULT_RX_HDR_DMA_LENGTH = 0,
/* dma length 64 bytes */
RX_HDR_DMA_LENGTH_64B = 1,
/* dma length 128 bytes */
RX_HDR_DMA_LENGTH_128B = 2,
/* dma length 256 bytes */
RX_HDR_DMA_LENGTH_256B = 3,
};
/* /*
* NB: intentionally not using kernel-doc comment because the kernel-doc * NB: intentionally not using kernel-doc comment because the kernel-doc
* script does not handle the complex conditional compilation * script does not handle the complex conditional compilation