qcacmn: Conditionally compile monitor related features and issue fixes

PATCH[7/7]:
This patch consists following changes:
 -Conditionally compile all monitor destination ring related code
  Macro used QCA_MONITOR_PKT_SUPPORT
 -Add QCA_ENHANCED_STATS_SUPPORT macro to conditionally compile
  enhanced stats support
 -Use QCA_MCOPY_SUPPORT and QCA_TX_CAPTURE_SUPPORT macros
  to conditionally compile MCOPY and Tx capture features
  respectively
 -Use QCN_IE macro to conditionally compile BPR
  feature
 -Use QCA_ADVANCE_MON_FILTER_SUPPORT macro to conditionally
  compile advance monitor filter feature
 -Fix vdev attach issue for special and smart monitor vap
 -Fix status ring initialization issue.

Change-Id: I0deaa28a9a54bf34b0f41e6dd510fdd8d4992db2
CRs-Fixed: 2983780
This commit is contained in:
aloksing
2021-06-14 20:12:04 +05:30
committed by Madan Koyyalamudi
parent 53fe7000ba
commit c60b9619a3
24 changed files with 2719 additions and 1971 deletions

View File

@@ -66,7 +66,6 @@ cdp_dump_flow_pool_info(struct cdp_soc_t *soc)
#include <dp_mon.h>
#endif
#include "dp_ipa.h"
#include "dp_cal_client_api.h"
#ifdef FEATURE_WDS
#include "dp_txrx_wds.h"
#endif
@@ -328,6 +327,8 @@ dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS_MAX] = {
#endif
};
qdf_export_symbol(dp_cpu_ring_map);
/**
* @brief Select the type of statistics
*/
@@ -3075,14 +3076,16 @@ void dp_hw_link_desc_pool_banks_free(struct dp_soc *soc, uint32_t mac_id)
if (mac_id != WLAN_INVALID_PDEV_ID) {
pages = monitor_get_link_desc_pages(soc, mac_id);
if (!pages)
/* monitor_get_link_desc_pages returns NULL only
* if monitor SOC is NULL */
QDF_ASSERT(pages);
} else {
pages = &soc->link_desc_pages;
}
if (!pages) {
dp_err("can not get link desc pages");
QDF_ASSERT(0);
return;
}
if (pages->dma_pages) {
wlan_minidump_remove((void *)
pages->dma_pages->page_v_addr_start,
@@ -3095,6 +3098,8 @@ void dp_hw_link_desc_pool_banks_free(struct dp_soc *soc, uint32_t mac_id)
}
}
qdf_export_symbol(dp_hw_link_desc_pool_banks_free);
/*
* dp_hw_link_desc_pool_banks_alloc() - Allocate h/w link desc pool banks
* @soc: DP SOC handle
@@ -3134,11 +3139,14 @@ QDF_STATUS dp_hw_link_desc_pool_banks_alloc(struct dp_soc *soc, uint32_t mac_id)
*/
if (mac_id != WLAN_INVALID_PDEV_ID) {
pages = monitor_get_link_desc_pages(soc, mac_id);
if (!pages)
/* monitor_get_link_desc_pages returns NULL only
* if monitor SOC is NULL
*/
QDF_ASSERT(pages);
/* monitor_get_link_desc_pages returns NULL only
* if monitor SOC is NULL
*/
if (!pages) {
dp_err("can not get link desc pages");
QDF_ASSERT(0);
return QDF_STATUS_E_FAULT;
}
dp_srng = &soc->rxdma_mon_desc_ring[mac_id];
num_entries = dp_srng->alloc_size /
hal_srng_get_entrysize(soc->hal_soc,
@@ -3338,6 +3346,8 @@ fail:
return QDF_STATUS_E_NOMEM;
}
qdf_export_symbol(dp_hw_link_desc_pool_banks_alloc);
/*
* dp_hw_link_desc_ring_init() - Initialize hw link desc rings
* @soc: DP SOC handle
@@ -3402,11 +3412,14 @@ void dp_link_desc_ring_replenish(struct dp_soc *soc, uint32_t mac_id)
desc_srng = soc->wbm_idle_link_ring.hal_srng;
} else {
pages = monitor_get_link_desc_pages(soc, mac_id);
if (!pages)
/* monitor_get_link_desc_pages returns NULL only
* if monitor SOC is NULL
*/
QDF_ASSERT(pages);
/* monitor_get_link_desc_pages returns NULL only
* if monitor SOC is NULL
*/
if (!pages) {
dp_err("can not get link desc pages");
QDF_ASSERT(0);
return;
}
total_link_descs_addr =
monitor_get_total_link_descs(soc, mac_id);
total_link_descs = *total_link_descs_addr;
@@ -3492,6 +3505,8 @@ void dp_link_desc_ring_replenish(struct dp_soc *soc, uint32_t mac_id)
}
}
qdf_export_symbol(dp_link_desc_ring_replenish);
#ifdef IPA_OFFLOAD
#define USE_1_IPA_RX_REO_RING 1
#define USE_2_IPA_RX_REO_RINGS 2
@@ -5297,8 +5312,6 @@ static void dp_soc_detach(struct cdp_soc_t *txrx_soc)
dp_soc_tx_history_detach(soc);
dp_soc_rx_history_detach(soc);
monitor_vdev_timer_deinit(soc);
if (!dp_monitor_modularized_enable()) {
dp_mon_soc_detach_wrapper(soc);
}
@@ -5446,13 +5459,10 @@ static QDF_STATUS dp_rxdma_ring_config(struct dp_soc *soc)
htt_srng_setup(soc->htt_handle, mac_for_pdev,
soc->rx_refill_buf_ring[lmac_id].
hal_srng, RXDMA_BUF);
if (wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) {
/* Configure monitor mode rings */
monitor_htt_srng_setup(soc, pdev,
lmac_id,
mac_for_pdev);
}
/* Configure monitor mode rings */
monitor_htt_srng_setup(soc, pdev,
lmac_id,
mac_for_pdev);
htt_srng_setup(soc->htt_handle, mac_for_pdev,
soc->rxdma_err_dst_ring[lmac_id].hal_srng,
RXDMA_DST);
@@ -5829,8 +5839,13 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc,
dp_vdev_id_map_tbl_add(soc, vdev, vdev_id);
if (wlan_op_mode_monitor == vdev->opmode) {
monitor_vdev_attach(vdev);
return QDF_STATUS_SUCCESS;
if (monitor_vdev_attach(vdev) == QDF_STATUS_SUCCESS) {
monitor_pdev_set_mon_vdev(vdev);
monitor_vdev_set_monitor_mode_buf_rings(pdev);
return QDF_STATUS_SUCCESS;
} else {
return QDF_STATUS_E_FAILURE;
}
}
vdev->tx_encap_type = wlan_cfg_pkt_type(soc->wlan_cfg_ctx);
@@ -5854,6 +5869,7 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc,
cdp_soc, vdev->ap_bridge_enabled);
dp_tx_vdev_attach(vdev);
monitor_vdev_attach(vdev);
if (!pdev->is_lro_hash_configured) {
if (QDF_IS_STATUS_SUCCESS(dp_lro_hash_setup(soc, pdev)))
@@ -6400,13 +6416,9 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
QDF_STATUS_SUCCESS)
dp_warn("peer ext_stats ctx alloc failed");
monitor_peer_attach(soc, peer);
/*
* In tx_monitor mode, filter may be set for unassociated peer
* when unassociated peer get associated peer need to
* update tx_cap_enabled flag to support peer filter.
*/
monitor_peer_tx_capture_filter_check(pdev, peer);
if (monitor_peer_attach(soc, peer) !=
QDF_STATUS_SUCCESS)
dp_warn("peer monitor ctx alloc failed");
dp_set_peer_isolation(peer, false);
@@ -7058,6 +7070,7 @@ void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev,
dp_tx_flow_pool_unmap_handler(pdev, vdev_id,
FLOW_TYPE_VDEV, vdev_id);
dp_tx_vdev_detach(vdev);
monitor_vdev_detach(vdev);
free_vdev:
qdf_spinlock_destroy(&vdev->peer_list_lock);
@@ -7087,6 +7100,8 @@ free_vdev:
vdev_delete_cb(vdev_delete_context);
}
qdf_export_symbol(dp_vdev_unref_delete);
/*
* dp_peer_unref_delete() - unref and delete peer
* @peer_handle: Datapath peer handle
@@ -7152,8 +7167,6 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id mod_id)
wlan_minidump_remove(peer, sizeof(*peer), soc->ctrl_psoc,
WLAN_MD_DP_PEER, "dp_peer");
monitor_peer_detach(soc, peer);
qdf_spin_lock_bh(&soc->inactive_peer_list_lock);
TAILQ_FOREACH(tmp_peer, &soc->inactive_peer_list,
inactive_list_elem) {
@@ -7172,6 +7185,8 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id mod_id)
/* cleanup the peer data */
dp_peer_cleanup(vdev, peer);
monitor_peer_detach(soc, peer);
for (tid = 0; tid < DP_MAX_TIDS; tid++)
qdf_spinlock_destroy(&peer->rx_tid[tid].tid_lock);
@@ -7185,6 +7200,8 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id mod_id)
}
}
qdf_export_symbol(dp_peer_unref_delete);
#ifdef PEER_CACHE_RX_PKTS
static inline void dp_peer_rx_bufq_resources_deinit(struct dp_peer *peer)
{
@@ -11299,7 +11316,7 @@ static QDF_STATUS dp_bus_suspend(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
qdf_timer_stop(&soc->int_timer);
/* Stop monitor reap timer and reap any pending frames in ring */
monitor_stop_reap_timer(pdev);
monitor_pktlog_reap_pending_frames(pdev);
dp_suspend_fse_cache_flush(soc);
@@ -11320,7 +11337,7 @@ static QDF_STATUS dp_bus_resume(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS);
/* Start monitor reap timer */
monitor_start_reap_timer(pdev);
monitor_pktlog_start_reap_timer(pdev);
dp_resume_fse_cache_flush(soc);
@@ -11349,7 +11366,7 @@ static void dp_process_wow_ack_rsp(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
* response from FW reap mon status ring to make sure no packets pending
* in the ring.
*/
monitor_stop_reap_timer(pdev);
monitor_pktlog_reap_pending_frames(pdev);
}
/**
@@ -11371,7 +11388,7 @@ static void dp_process_target_suspend_req(struct cdp_soc_t *soc_hdl,
}
/* Stop monitor reap timer and reap any pending frames in ring */
monitor_stop_reap_timer(pdev);
monitor_pktlog_reap_pending_frames(pdev);
}
static struct cdp_bus_ops dp_ops_bus = {
@@ -11469,6 +11486,8 @@ void dp_soc_set_txrx_ring_map(struct dp_soc *soc)
}
}
qdf_export_symbol(dp_soc_set_txrx_ring_map);
#if defined(QCA_WIFI_QCA8074) || defined(QCA_WIFI_QCA6018) || \
defined(QCA_WIFI_QCA5018) || defined(QCA_WIFI_QCA9574)
/**
@@ -11931,6 +11950,9 @@ void dp_is_hw_dbs_enable(struct dp_soc *soc,
*max_mac_rings = (dbs_enable)?(*max_mac_rings):1;
}
qdf_export_symbol(dp_is_hw_dbs_enable);
#if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
/**
* dp_get_cfr_rcc() - get cfr rcc config
* @soc_hdl: Datapath soc handle
@@ -12020,6 +12042,7 @@ static void dp_clear_cfr_dbg_stats(struct cdp_soc_t *soc_hdl,
qdf_mem_zero(&pdev->stats.rcc, sizeof(pdev->stats.rcc));
}
#endif
/**
* dp_bucket_index() - Return index from array