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:

committed by
Madan Koyyalamudi

parent
9de0de3f01
commit
ce736a1d8d
@@ -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)
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
@@ -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))
|
||||||
/**
|
/**
|
||||||
|
@@ -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,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;
|
filter->utlvs.eht_sig_usr_ofdma = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dp_tx_mon_filter_set_all(struct dp_mon_pdev_be *mon_pdev_be,
|
static void
|
||||||
struct htt_tx_ring_tlv_filter *filter)
|
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,
|
qdf_mem_zero(&filter->dtlvs,
|
||||||
sizeof(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;
|
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 */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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_ */
|
||||||
|
@@ -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,
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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_ */
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user