diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index c703ff3979..36cc286c42 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -57,10 +57,6 @@ #endif #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) 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 98292fc52f..3e472308a0 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 @@ -34,126 +34,6 @@ #endif #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 * freelist. @@ -220,32 +100,6 @@ dp_mon_get_free_desc_list(struct dp_soc *soc, 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 dp_mon_frag_alloc_and_map(struct dp_soc *dp_soc, 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; } -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_init(struct dp_mon_desc_pool *mon_desc_pool, 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_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) { 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; } -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 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; } -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) { 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; } -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) { struct dp_mon_soc *mon_soc = soc->monitor_soc; @@ -1082,110 +680,6 @@ fail: 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 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; } -static void -dp_tx_mon_print_ring_stat_2_0(struct dp_pdev *pdev) -{ -} - static inline 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 +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) &&\ (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) static inline @@ -1747,28 +1521,6 @@ void dp_mon_cdp_ops_register_2_0(struct cdp_ops *ops) } #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 static void dp_enable_enhanced_stats_for_each_pdev(struct dp_soc *soc, void *arg, 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 187463729f..9d7cb5f46d 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 @@ -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) || \ defined(WLAN_PKT_CAPTURE_RX_2_0)) /** diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c index b46c6492e2..906ffe4207 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c @@ -119,16 +119,6 @@ fail: 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, 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 * Return: 0 on success; error code on failure */ +static int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id, hal_ring_handle_t hal_ring_hdl, 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 -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.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; } -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.rx_response_required_info = 1; @@ -1434,8 +1426,9 @@ void dp_tx_mon_filter_set_upstream_tlvs(struct htt_tx_ring_tlv_filter *filter) filter->utlvs.eht_sig_usr_ofdma = 1; } -void dp_tx_mon_filter_set_all(struct dp_mon_pdev_be *mon_pdev_be, - struct htt_tx_ring_tlv_filter *filter) +static void +dp_tx_mon_filter_set_all(struct dp_mon_pdev_be *mon_pdev_be, + struct htt_tx_ring_tlv_filter *filter) { qdf_mem_zero(&filter->dtlvs, sizeof(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; } +static void dp_tx_mon_filter_set_word_mask(struct dp_pdev *pdev, 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; } +#ifdef BE_PKTLOG_SUPPORT void dp_mon_filter_setup_pktlog_hybrid_2_0(struct dp_pdev *pdev) { 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; } +#endif #endif /* WDI_EVENT_ENABLE */ /** diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h index f1aff5b70b..8522c03bf3 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h @@ -25,18 +25,6 @@ #define DMA_LENGTH_128B 2 #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 */ struct dp_mon_pdev_be; @@ -49,15 +37,6 @@ void dp_rx_mon_enable_set(uint32_t *msg_word, 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 * @msg_word: msg word 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 3cc30171f8..86ff1b58d7 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 @@ -40,9 +40,21 @@ #define F_MASK 0xFFFF #define TEST_MASK 0xCBF -#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\ - defined(WLAN_SUPPORT_RX_FLOW_TAG) - +#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 + */ +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 static @@ -57,7 +69,6 @@ static void dp_rx_mon_print_tag_buf(uint8_t *buf, uint16_t room) { } - #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; } -/** - * 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 dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc, struct hal_rx_ppdu_info *ppdu_info) @@ -340,19 +335,49 @@ dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf, } #else - -static -void dp_rx_mon_set_zero(qdf_nbuf_t nbuf) +static inline void +dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev, + 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, struct hal_rx_ppdu_info *ppdu_info) { } -static +static inline void dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf, struct hal_rx_ppdu_info *ppdu_info, struct dp_pdev *pdev, @@ -590,6 +615,21 @@ dp_mon_record_clear_buffer(struct dp_mon_pdev_be *mon_pdev_be) { #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 * @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); } } + +static uint8_t dp_rx_mon_process_tlv_status(struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info, 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; } -void -dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *soc) +QDF_STATUS dp_rx_mon_ppdu_info_cache_create(struct dp_pdev *pdev) { - 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); + 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; - /* 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); + 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; } -QDF_STATUS -dp_rx_mon_buf_desc_pool_init(struct dp_soc *soc) +void dp_rx_mon_ppdu_info_cache_destroy(struct dp_pdev *pdev) { - 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; + 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; - 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); + 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); } -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_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); + 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_soc) - dp_mon_desc_pool_free(&mon_soc_be->rx_desc_mon); + 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; } -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_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; + 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); - 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; - - 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); + return QDF_STATUS_SUCCESS; } #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); } #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 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 4a08717c6b..93cd7b124b 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 @@ -50,6 +50,16 @@ + (DP_RX_MON_TLV_TOTAL_LEN)) #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 * @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, 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 * @@ -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); #else -static uint32_t +static inline uint32_t dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, uint32_t mac_id, uint32_t quota) { @@ -217,22 +315,10 @@ void dp_rx_mon_drain_wq(struct dp_pdev *pdev); * * Return: void */ -void -dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev, +void dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev, 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) -{ -} -#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */ +#ifdef QCA_ENHANCED_STATS_SUPPORT /** * 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, 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_ */ diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_status_2.0.c b/dp/wifi3.0/monitor/2.0/dp_rx_mon_status_2.0.c index 6b184cd3ce..80b66b8836 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_status_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_status_2.0.c @@ -1,6 +1,6 @@ /* * 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 * purpose with or without fee is hereby granted, provided that the above @@ -26,6 +26,11 @@ #include #include +#ifdef BE_PKTLOG_SUPPORT +#define BUFFER_RESIDUE 1 +#define RX_MON_MIN_HEAD_ROOM 64 +#endif + QDF_STATUS dp_rx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info, 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 48dba3b1e0..897d2eb662 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 @@ -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); } +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 dp_tx_mon_buf_desc_pool_alloc(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 a6823a447e..abef8d580a 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 @@ -116,6 +116,8 @@ dp_tx_mon_status_free_packet_buf(struct dp_pdev *pdev, uint32_t end_offset, 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 * @soc: dp soc handle @@ -131,6 +133,15 @@ dp_tx_mon_status_free_packet_buf(struct dp_pdev *pdev, QDF_STATUS dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev, 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 * 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); #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_ */ diff --git a/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c b/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c index 29e924ecc7..3e24cc8269 100644 --- a/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c @@ -1404,40 +1404,6 @@ dp_tx_mon_update_ppdu_info_status(struct dp_pdev *pdev, 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 * @pdev: DP_PDEV handle @@ -1445,7 +1411,7 @@ dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev, * * Return: status */ -QDF_STATUS +static QDF_STATUS dp_tx_mon_process_tlv_2_0(struct dp_pdev *pdev, 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 + +#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 + diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index fe432843ea..4499b8aff8 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -78,6 +78,20 @@ struct dp_peer_tx_capture { }; #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 static inline void dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev, diff --git a/dp/wifi3.0/monitor/dp_mon_filter.c b/dp/wifi3.0/monitor/dp_mon_filter.c index 6849123918..8cc177498e 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.c +++ b/dp/wifi3.0/monitor/dp_mon_filter.c @@ -496,6 +496,24 @@ void dp_mon_filter_reset_mon_mode(struct dp_pdev *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 void dp_mon_filter_setup_rx_pkt_log_full(struct dp_pdev *pdev) { diff --git a/dp/wifi3.0/monitor/dp_mon_filter.h b/dp/wifi3.0/monitor/dp_mon_filter.h index e3a85cb74e..c8a7543e57 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.h +++ b/dp/wifi3.0/monitor/dp_mon_filter.h @@ -96,6 +96,18 @@ struct dp_mon_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 * script does not handle the complex conditional compilation