qcacmn: Move monitor related fields from soc/pdev to mon_soc/mon_pdev

PATCH[6/7]:
This patch consists following changes:
 -Move monitor related pdev variables to struct dp_mon_pdev
 -Move monitor relted soc variables to struct dp_mon_soc
 -Move cookie to monitor link desc va to monitor file
 -Add APIs to access monitor related variables
 -Add dummy APIs to build without monitor support.

Change-Id: I032a480b1383d061f984cee3ba6b10ac7a0ff350
CRs-Fixed: 2983781
This commit is contained in:
aloksing
2021-05-26 16:04:48 +05:30
committed by Madan Koyyalamudi
parent c4796962ca
commit 53fe7000ba
22 changed files with 1766 additions and 1077 deletions

View File

@@ -23,7 +23,6 @@
#include "dp_types.h"
#include "dp_internal.h"
#include "dp_rx.h"
#include "dp_rx_mon.h"
#include "htt_stats.h"
#include "htt_ppdu_stats.h"
#include "dp_htt.h"
@@ -57,71 +56,6 @@
((pkt->htc_pkt.Status != QDF_STATUS_E_CANCELED) && \
(pkt->htc_pkt.Status != QDF_STATUS_E_RESOURCES))
QDF_STATUS dp_rx_populate_cbf_hdr(struct dp_soc *soc,
uint32_t mac_id,
uint32_t event,
qdf_nbuf_t mpdu,
uint32_t msdu_timestamp)
{
uint32_t data_size, hdr_size, ppdu_id, align4byte;
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
uint32_t *msg_word;
if (!pdev)
return QDF_STATUS_E_INVAL;
ppdu_id = pdev->ppdu_info.com_info.ppdu_id;
hdr_size = HTT_T2H_PPDU_STATS_IND_HDR_SIZE
+ qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload);
data_size = qdf_nbuf_len(mpdu);
qdf_nbuf_push_head(mpdu, hdr_size);
msg_word = (uint32_t *)qdf_nbuf_data(mpdu);
/*
* Populate the PPDU Stats Indication header
*/
HTT_H2T_MSG_TYPE_SET(*msg_word, HTT_T2H_MSG_TYPE_PPDU_STATS_IND);
HTT_T2H_PPDU_STATS_MAC_ID_SET(*msg_word, mac_id);
HTT_T2H_PPDU_STATS_PDEV_ID_SET(*msg_word, pdev->pdev_id);
align4byte = ((data_size +
qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload)
+ 3) >> 2) << 2;
HTT_T2H_PPDU_STATS_PAYLOAD_SIZE_SET(*msg_word, align4byte);
msg_word++;
HTT_T2H_PPDU_STATS_PPDU_ID_SET(*msg_word, ppdu_id);
msg_word++;
*msg_word = msdu_timestamp;
msg_word++;
/* Skip reserved field */
msg_word++;
/*
* Populate MGMT_CTRL Payload TLV first
*/
HTT_STATS_TLV_TAG_SET(*msg_word,
HTT_PPDU_STATS_RX_MGMTCTRL_PAYLOAD_TLV);
align4byte = ((data_size - sizeof(htt_tlv_hdr_t) +
qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload)
+ 3) >> 2) << 2;
HTT_STATS_TLV_LENGTH_SET(*msg_word, align4byte);
msg_word++;
HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH_SET(
*msg_word, data_size);
msg_word++;
dp_wdi_event_handler(event, soc, (void *)mpdu,
HTT_INVALID_PEER, WDI_NO_VAL, pdev->pdev_id);
qdf_nbuf_pull_head(mpdu, hdr_size);
return QDF_STATUS_SUCCESS;
}
/*
* htt_htc_pkt_alloc() - Allocate HTC packet buffer
* @htt_soc: HTT SOC handle

View File

@@ -454,6 +454,19 @@ bool monitor_vdev_timer_stop(struct dp_soc *soc)
#endif
#ifndef WIFI_MONITOR_SUPPORT
#define MON_BUF_MIN_ENTRIES 64
static inline struct qdf_mem_multi_page_t*
monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id)
{
return NULL;
}
static inline uint32_t *
monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id)
{
return NULL;
}
static inline QDF_STATUS monitor_drop_inv_peer_pkts(struct dp_vdev *vdev,
struct ieee80211_frame *wh)
{
@@ -482,6 +495,97 @@ static inline void monitor_vdev_delete(struct dp_soc *soc, struct dp_vdev *vdev)
static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer)
{
}
static inline void monitor_neighbour_peer_add_ast(struct dp_pdev *pdev,
struct dp_peer *ta_peer,
uint8_t *mac_addr,
qdf_nbuf_t nbuf,
uint32_t flags)
{
}
static inline void
monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band)
{
}
static inline void
monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq)
{
}
static inline void monitor_set_chan_num(struct dp_pdev *pdev, int chan_num)
{
}
static inline bool monitor_is_enable_mcopy_mode(struct dp_pdev *pdev)
{
return false;
}
static inline
void monitor_neighbour_peer_list_remove(struct dp_pdev *pdev,
struct dp_vdev *vdev,
struct dp_neighbour_peer *peer)
{
}
static inline bool monitor_is_chan_band_known(struct dp_pdev *pdev)
{
return false;
}
static inline enum reg_wifi_band
monitor_get_chan_band(struct dp_pdev *pdev)
{
return 0;
}
static inline void monitor_get_mpdu_status(struct dp_pdev *pdev,
struct dp_soc *soc,
uint8_t *rx_tlv_hdr)
{
}
static inline void monitor_print_tx_stats(struct dp_pdev *pdev)
{
}
static inline
QDF_STATUS monitor_mcopy_check_deliver(struct dp_pdev *pdev,
uint16_t peer_id, uint32_t ppdu_id,
uint8_t first_msdu)
{
return QDF_STATUS_SUCCESS;
}
static inline bool monitor_is_enable_tx_sniffer(struct dp_pdev *pdev)
{
return false;
}
static inline struct dp_vdev*
monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev)
{
return NULL;
}
static inline QDF_STATUS monitor_check_com_info_ppdu_id(struct dp_pdev *pdev,
void *rx_desc)
{
return QDF_STATUS_E_FAILURE;
}
static inline struct mon_rx_status*
monitor_get_rx_status_addr(struct dp_pdev *pdev)
{
return NULL;
}
static inline bool monitor_is_enable_enhanced_stats(struct dp_pdev *pdev)
{
return false;
}
#endif
#define DP_MAX_TIMER_EXEC_TIME_TICKS \
@@ -2021,15 +2125,6 @@ void dp_wdi_event_handler(enum WDI_EVENT event, struct dp_soc *soc,
int dp_wdi_event_attach(struct dp_pdev *txrx_pdev);
int dp_wdi_event_detach(struct dp_pdev *txrx_pdev);
/**
* dp_get_pldev() - function to get pktlog device handle
* @soc_hdl: datapath soc handle
* @pdev_id: physical device id
*
* Return: pktlog device handle or NULL
*/
void *dp_get_pldev(struct cdp_soc_t *soc_hdl, uint8_t pdev_id);
static inline void
dp_hif_update_pipe_callback(struct dp_soc *dp_soc,
void *cb_context,
@@ -2642,18 +2737,6 @@ static inline uint32_t dp_history_get_next_index(qdf_atomic_t *curr_idx,
*/
void dp_rx_skip_tlvs(struct dp_soc *soc, qdf_nbuf_t nbuf, uint32_t l3_padding);
/**
* dp_soc_is_full_mon_enable () - Return if full monitor mode is enabled
* @soc: DP soc handle
*
* Return: Full monitor mode status
*/
static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev)
{
return (pdev->soc->full_mon_mode && pdev->monitor_configured) ?
true : false;
}
#ifndef FEATURE_WDS
static inline void
dp_hmwds_ast_add_notify(struct dp_peer *peer,

View File

@@ -139,7 +139,7 @@ QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc,
for (i = 0; i < soc->pdev_count; i++) {
pdev = soc->pdev_list[i];
if (pdev && pdev->monitor_configured)
if (pdev && monitor_is_configured(pdev))
return QDF_STATUS_SUCCESS;
}

View File

@@ -32,7 +32,6 @@
#include "dp_tx.h"
#include "dp_tx_desc.h"
#include "dp_rx.h"
#include "dp_rx_mon.h"
#ifdef DP_RATETABLE_SUPPORT
#include "dp_ratetable.h"
#endif
@@ -44,7 +43,6 @@
#include "cdp_txrx_cmn_reg.h"
#include <qdf_util.h>
#include "dp_peer.h"
#include "dp_rx_mon.h"
#include "htt_stats.h"
#include "dp_htt.h"
#ifdef WLAN_SUPPORT_RX_FISA
@@ -53,14 +51,10 @@
#include "htt_ppdu_stats.h"
#include "qdf_mem.h" /* qdf_mem_malloc,free */
#include "cfg_ucfg_api.h"
#include "dp_mon_filter.h"
#ifdef QCA_LL_TX_FLOW_CONTROL_V2
#include "cdp_txrx_flow_ctrl_v2.h"
#else
#ifdef WIFI_MONITOR_SUPPORT
#include <dp_mon.h>
#endif
static inline void
cdp_dump_flow_pool_info(struct cdp_soc_t *soc)
@@ -68,6 +62,9 @@ cdp_dump_flow_pool_info(struct cdp_soc_t *soc)
return;
}
#endif
#ifdef WIFI_MONITOR_SUPPORT
#include <dp_mon.h>
#endif
#include "dp_ipa.h"
#include "dp_cal_client_api.h"
#ifdef FEATURE_WDS
@@ -2509,6 +2506,7 @@ static void dp_interrupt_timer(void *arg)
uint8_t dp_intr_id = wlan_cfg_get_num_contexts(soc->wlan_cfg_ctx);
uint32_t lmac_iter;
int max_mac_rings = wlan_cfg_get_num_mac_rings(pdev->wlan_cfg_ctx);
enum reg_wifi_band mon_band;
/*
* this logic makes all data path interfacing rings (UMAC/LMAC)
@@ -2529,8 +2527,9 @@ static void dp_interrupt_timer(void *arg)
if (!qdf_atomic_read(&soc->cmn_init_done))
return;
if (pdev->mon_chan_band != REG_BAND_UNKNOWN) {
lmac_id = pdev->ch_band_lmac_id_mapping[pdev->mon_chan_band];
if (monitor_is_chan_band_known(pdev)) {
mon_band = monitor_get_chan_band(pdev);
lmac_id = pdev->ch_band_lmac_id_mapping[mon_band];
if (qdf_likely(lmac_id != DP_MON_INVALID_LMAC_ID)) {
dp_intr_id = soc->mon_intr_id_lmac_map[lmac_id];
dp_srng_record_timer_entry(soc, dp_intr_id);
@@ -3074,10 +3073,15 @@ void dp_hw_link_desc_pool_banks_free(struct dp_soc *soc, uint32_t mac_id)
{
struct qdf_mem_multi_page_t *pages;
if (mac_id != WLAN_INVALID_PDEV_ID)
pages = &soc->mon_link_desc_pages[mac_id];
else
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->dma_pages) {
wlan_minidump_remove((void *)
@@ -3129,12 +3133,17 @@ QDF_STATUS dp_hw_link_desc_pool_banks_alloc(struct dp_soc *soc, uint32_t mac_id)
* with REO queue descriptors
*/
if (mac_id != WLAN_INVALID_PDEV_ID) {
pages = &soc->mon_link_desc_pages[mac_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);
dp_srng = &soc->rxdma_mon_desc_ring[mac_id];
num_entries = dp_srng->alloc_size /
hal_srng_get_entrysize(soc->hal_soc,
RXDMA_MONITOR_DESC);
total_link_descs = &soc->total_mon_link_descs[mac_id];
total_link_descs = monitor_get_total_link_descs(soc, mac_id);
qdf_str_lcopy(minidump_str, "mon_link_desc_bank",
MINIDUMP_STR_SIZE);
} else {
@@ -3375,6 +3384,7 @@ void dp_link_desc_ring_replenish(struct dp_soc *soc, uint32_t mac_id)
uint32_t count = 0;
void *desc_srng;
int link_desc_size = hal_get_link_desc_size(soc->hal_soc);
uint32_t *total_link_descs_addr;
uint32_t total_link_descs;
uint32_t scatter_buf_num;
uint32_t num_entries_per_buf = 0;
@@ -3391,8 +3401,15 @@ void dp_link_desc_ring_replenish(struct dp_soc *soc, uint32_t mac_id)
total_link_descs = soc->total_link_descs;
desc_srng = soc->wbm_idle_link_ring.hal_srng;
} else {
pages = &soc->mon_link_desc_pages[mac_id];
total_link_descs = soc->total_mon_link_descs[mac_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);
total_link_descs_addr =
monitor_get_total_link_descs(soc, mac_id);
total_link_descs = *total_link_descs_addr;
desc_srng = soc->rxdma_mon_desc_ring[mac_id].hal_srng;
}
@@ -4528,36 +4545,6 @@ static void dp_cleanup_ipa_rx_refill_buf_ring(struct dp_soc *soc,
}
#endif
#ifdef ATH_SUPPORT_EXT_STAT
/*dp_peer_cal_clients_stats_update - update peer stats on cal client timer
* @soc : Datapath SOC
* @peer : Datapath peer
* @arg : argument to iter function
*/
static void
dp_peer_cal_clients_stats_update(struct dp_soc *soc,
struct dp_peer *peer,
void *arg)
{
dp_cal_client_update_peer_stats(&peer->stats);
}
/*dp_iterate_update_peer_list - update peer stats on cal client timer
* @pdev_hdl: pdev handle
*/
void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl)
{
struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl;
dp_pdev_iterate_peer(pdev, dp_peer_cal_clients_stats_update, NULL,
DP_MOD_ID_CDP);
}
#else
void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl)
{
}
#endif
#ifdef DP_TX_HW_DESC_HISTORY
/**
* dp_soc_tx_hw_desc_history_attach - Attach TX HW descriptor history
@@ -4925,7 +4912,6 @@ static void dp_pdev_deinit(struct cdp_pdev *txrx_pdev, int force)
dp_rx_pdev_desc_pool_deinit(pdev);
dp_pdev_bkp_stats_detach(pdev);
qdf_event_destroy(&pdev->fw_peer_stats_event);
dp_cal_client_detach(&pdev->cal_client_ctx);
if (pdev->sojourn_buf)
qdf_nbuf_free(pdev->sojourn_buf);
@@ -5844,7 +5830,6 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc,
if (wlan_op_mode_monitor == vdev->opmode) {
monitor_vdev_attach(vdev);
pdev->monitor_vdev = vdev;
return QDF_STATUS_SUCCESS;
}
@@ -6066,7 +6051,6 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
struct dp_soc *soc = (struct dp_soc *)cdp_soc;
struct dp_pdev *pdev;
struct dp_neighbour_peer *peer = NULL;
struct dp_neighbour_peer *temp_peer = NULL;
struct dp_peer *vap_self_peer = NULL;
struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
DP_MOD_ID_CDP);
@@ -6113,23 +6097,7 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
*/
dp_vdev_id_map_tbl_remove(soc, vdev);
qdf_spin_lock_bh(&pdev->neighbour_peer_mutex);
if (!soc->hw_nac_monitor_support) {
TAILQ_FOREACH(peer, &pdev->neighbour_peers_list,
neighbour_peer_list_elem) {
QDF_ASSERT(peer->vdev != vdev);
}
} else {
TAILQ_FOREACH_SAFE(peer, &pdev->neighbour_peers_list,
neighbour_peer_list_elem, temp_peer) {
if (peer->vdev == vdev) {
TAILQ_REMOVE(&pdev->neighbour_peers_list, peer,
neighbour_peer_list_elem);
qdf_mem_free(peer);
}
}
}
qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex);
monitor_neighbour_peer_list_remove(pdev, vdev, peer);
dp_tx_vdev_multipass_deinit(vdev);
@@ -7083,7 +7051,6 @@ void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev,
if (wlan_op_mode_monitor == vdev->opmode) {
monitor_vdev_delete(soc, vdev);
pdev->monitor_vdev = NULL;
goto free_vdev;
}
@@ -7702,7 +7669,7 @@ void dp_aggregate_pdev_stats(struct dp_pdev *pdev)
qdf_mem_zero(&pdev->stats.rx, sizeof(pdev->stats.rx));
qdf_mem_zero(&pdev->stats.tx_i, sizeof(pdev->stats.tx_i));
if (pdev->mcopy_mode)
if (monitor_is_enable_mcopy_mode(pdev))
DP_UPDATE_STATS(pdev, pdev->invalid_peer);
soc = pdev->soc;
@@ -8445,6 +8412,8 @@ static QDF_STATUS dp_set_pdev_param(struct cdp_soc_t *cdp_soc, uint8_t pdev_id,
struct dp_pdev *pdev =
dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)cdp_soc,
pdev_id);
enum reg_wifi_band chan_band;
if (!pdev)
return QDF_STATUS_E_FAILURE;
@@ -8510,12 +8479,12 @@ static QDF_STATUS dp_set_pdev_param(struct cdp_soc_t *cdp_soc, uint8_t pdev_id,
val.cdp_pdev_param_fltr_neigh_peers);
break;
case CDP_MONITOR_CHANNEL:
pdev->mon_chan_num = val.cdp_pdev_param_monitor_chan;
monitor_set_chan_num(pdev, val.cdp_pdev_param_monitor_chan);
break;
case CDP_MONITOR_FREQUENCY:
pdev->mon_chan_freq = val.cdp_pdev_param_mon_freq;
pdev->mon_chan_band =
wlan_reg_freq_to_band(pdev->mon_chan_freq);
chan_band = wlan_reg_freq_to_band(val.cdp_pdev_param_mon_freq);
monitor_set_chan_freq(pdev, val.cdp_pdev_param_mon_freq);
monitor_set_chan_band(pdev, chan_band);
break;
case CDP_CONFIG_BSS_COLOR:
monitor_set_bsscolor(pdev, val.cdp_pdev_param_bss_color);
@@ -10697,9 +10666,6 @@ static struct cdp_ctrl_ops dp_ops_ctrl = {
.txrx_get_sec_type = dp_get_sec_type,
.txrx_wdi_event_sub = dp_wdi_event_sub,
.txrx_wdi_event_unsub = dp_wdi_event_unsub,
#ifdef WDI_EVENT_ENABLE
.txrx_get_pldev = dp_get_pldev,
#endif
.txrx_set_pdev_param = dp_set_pdev_param,
.txrx_get_pdev_param = dp_get_pdev_param,
.txrx_set_peer_param = dp_set_peer_param,
@@ -11333,11 +11299,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 */
if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
dp_is_enable_reap_timer_non_pkt(pdev))) {
if (monitor_reap_timer_stop(soc))
monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET);
}
monitor_stop_reap_timer(pdev);
dp_suspend_fse_cache_flush(soc);
@@ -11358,9 +11320,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 */
if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
dp_is_enable_reap_timer_non_pkt(pdev)))
monitor_reap_timer_start(soc);
monitor_start_reap_timer(pdev);
dp_resume_fse_cache_flush(soc);
@@ -11389,11 +11349,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.
*/
if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
dp_is_enable_reap_timer_non_pkt(pdev)) &&
soc->reap_timer_init) {
monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET);
}
monitor_stop_reap_timer(pdev);
}
/**
@@ -11415,11 +11371,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 */
if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
dp_is_enable_reap_timer_non_pkt(pdev))) {
if (monitor_reap_timer_stop(soc))
monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET);
}
monitor_stop_reap_timer(pdev);
}
static struct cdp_bus_ops dp_ops_bus = {
@@ -12870,8 +12822,6 @@ static void dp_soc_cfg_dump(struct dp_soc *soc, uint32_t target_type)
dp_init_info("DP soc Dump for Target = %d", target_type);
dp_init_info("ast_override_support = %d, da_war_enabled = %d,",
soc->ast_override_support, soc->da_war_enabled);
dp_init_info("hw_nac_monitor_support = %d",
soc->hw_nac_monitor_support);
wlan_cfg_dp_soc_ctx_dump(soc->wlan_cfg_ctx);
}
@@ -13205,14 +13155,6 @@ static QDF_STATUS dp_pdev_init(struct cdp_soc_t *txrx_soc,
/* set the reo destination during initialization */
dp_pdev_set_default_reo(pdev);
/*
* initialize ppdu tlv list
*/
TAILQ_INIT(&pdev->ppdu_info_list);
TAILQ_INIT(&pdev->sched_comp_ppdu_list);
pdev->tlv_count = 0;
pdev->list_depth = 0;
qdf_mem_zero(&pdev->sojourn_stats, sizeof(struct cdp_tx_sojourn_stats));
pdev->sojourn_buf = qdf_nbuf_alloc(pdev->soc->osdev,
@@ -13226,11 +13168,6 @@ static QDF_STATUS dp_pdev_init(struct cdp_soc_t *txrx_soc,
sojourn_buf = qdf_nbuf_data(pdev->sojourn_buf);
qdf_mem_zero(sojourn_buf, sizeof(struct cdp_tx_sojourn_stats));
/* initlialize cal client timer */
dp_cal_client_attach(&pdev->cal_client_ctx,
dp_pdev_to_cdp_pdev(pdev),
pdev->soc->osdev,
&dp_iterate_update_peer_list);
qdf_event_create(&pdev->fw_peer_stats_event);
pdev->num_tx_allowed = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);

View File

@@ -29,15 +29,11 @@
#include <hal_reo.h>
#include <cdp_txrx_handle.h>
#include <wlan_cfg.h>
#ifdef FEATURE_WDS
#include "dp_txrx_wds.h"
#endif
#ifdef WIFI_MONITOR_SUPPORT
#include <dp_mon.h>
#endif
#ifdef WLAN_TX_PKT_CAPTURE_ENH
#include "dp_tx_capture.h"
#ifdef FEATURE_WDS
#include "dp_txrx_wds.h"
#endif
#ifdef QCA_PEER_EXT_STATS

View File

@@ -28,17 +28,16 @@
#include "if_meta_hdr.h"
#endif
#include "dp_internal.h"
#include "dp_rx_mon.h"
#include "dp_ipa.h"
#ifdef FEATURE_WDS
#include "dp_txrx_wds.h"
#endif
#include "dp_hist.h"
#include "dp_rx_buffer_pool.h"
#ifdef WIFI_MONITOR_SUPPORT
#include "dp_htt.h"
#include <dp_mon.h>
#endif
#ifdef FEATURE_WDS
#include "dp_txrx_wds.h"
#endif
#ifndef QCA_HOST_MODE_WIFI_DISABLED

View File

@@ -1081,40 +1081,6 @@ void *dp_rx_cookie_2_link_desc_va(struct dp_soc *soc,
return link_desc_va;
}
/**
* dp_rx_cookie_2_mon_link_desc_va() - Converts cookie to a virtual address of
* the MSDU Link Descriptor
* @pdev: core txrx pdev context
* @buf_info: buf_info includes cookie that used to lookup virtual address of
* link descriptor. Normally this is just an index into a per pdev array.
*
* This is the VA of the link descriptor in monitor mode destination ring,
* that HAL layer later uses to retrieve the list of MSDU's for a given MPDU.
*
* Return: void *: Virtual Address of the Rx descriptor
*/
static inline
void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev,
struct hal_buf_info *buf_info,
int mac_id)
{
void *link_desc_va;
struct qdf_mem_multi_page_t *pages;
uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie);
pages = &pdev->soc->mon_link_desc_pages[mac_id];
if (!pages)
return NULL;
if (qdf_unlikely(page_id >= pages->num_pages))
return NULL;
link_desc_va = pages->dma_pages[page_id].page_v_addr_start +
(buf_info->paddr - pages->dma_pages[page_id].page_p_addr);
return link_desc_va;
}
#ifndef QCA_HOST_MODE_WIFI_DISABLED
/*
* dp_rx_intrabss_fwd() - API for intrabss fwd. For EAPOL

View File

@@ -26,7 +26,6 @@
#include "wlan_cfg.h"
#include "dp_internal.h"
#include "dp_rx.h"
#include "dp_rx_mon.h"
#ifdef WLAN_FEATURE_RX_PREALLOC_BUFFER_POOL
/**

View File

@@ -914,9 +914,8 @@ dp_rx_chain_msdus(struct dp_soc *soc, qdf_nbuf_t nbuf,
dp_pdev->invalid_peer_head_msdu = NULL;
dp_pdev->invalid_peer_tail_msdu = NULL;
hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_tlv_hdr,
&(dp_pdev->ppdu_info.rx_status));
monitor_get_mpdu_status(dp_pdev, soc, rx_tlv_hdr);
}
if (dp_pdev->ppdu_id == hal_rx_attn_phy_ppdu_id_get(soc->hal_soc,

View File

@@ -21,7 +21,6 @@
#include "dp_internal.h"
#include "htt_stats.h"
#include "htt_ppdu_stats.h"
#include "dp_htt.h"
#ifdef QCA_PEER_EXT_STATS
#include <cdp_txrx_hist_struct.h>
@@ -172,10 +171,6 @@ const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
};
#endif
#ifdef WLAN_TX_PKT_CAPTURE_ENH
#include "dp_tx_capture.h"
#endif
#define TID_COUNTER_STATS 1 /* Success/drop stats type */
#define TID_DELAY_STATS 2 /* Delay stats type */
@@ -6250,13 +6245,9 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev)
}
DP_PRINT_STATS("BA not received for delayed_ba: %d",
pdev->stats.cdp_delayed_ba_not_recev);
DP_PRINT_STATS("ppdu info schedule completion list depth: %d",
pdev->sched_comp_list_depth);
DP_PRINT_STATS("cur sched cmdid: %d", pdev->last_sched_cmdid);
DP_PRINT_STATS("delivered sched cmdid: %d",
pdev->delivered_sched_cmdid);
DP_PRINT_STATS("ppdu info list depth: %d",
pdev->list_depth);
monitor_print_tx_stats(pdev);
DP_PRINT_STATS("tx_ppdu_proc: %llu",
pdev->stats.tx_ppdu_proc);
DP_PRINT_STATS("ack ba comes twice: %llu",

View File

@@ -34,9 +34,6 @@
#endif
#include "enet.h"
#include "dp_internal.h"
#ifdef FEATURE_WDS
#include "dp_txrx_wds.h"
#endif
#ifdef ATH_SUPPORT_IQUE
#include "dp_txrx_me.h"
#endif
@@ -47,6 +44,9 @@
#ifdef WIFI_MONITOR_SUPPORT
#include <dp_mon.h>
#endif
#ifdef FEATURE_WDS
#include "dp_txrx_wds.h"
#endif
/* Flag to skip CCE classify when mesh or tid override enabled */
#define DP_TX_SKIP_CCE_CLASSIFY \
@@ -1994,7 +1994,7 @@ dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
HTT_TX_TCL_METADATA_VALID_HTT_SET(htt_tcl_metadata, 1);
dp_tx_desc_update_fast_comp_flag(soc, tx_desc,
!pdev->enhanced_stats_en);
!monitor_is_enable_enhanced_stats(pdev));
dp_tx_update_mesh_flags(soc, vdev, tx_desc);
@@ -3837,7 +3837,7 @@ static inline void dp_tx_sojourn_stats_process(struct dp_pdev *pdev,
uint64_t delta_ms;
struct cdp_tx_sojourn_stats *sojourn_stats;
if (qdf_unlikely(pdev->enhanced_stats_en == 0))
if (qdf_unlikely(!monitor_is_enable_enhanced_stats(pdev)))
return;
if (qdf_unlikely(tid == HTT_INVALID_TID ||

View File

@@ -24,6 +24,9 @@
#include "dp_internal.h"
#include "dp_tx.h"
#include "enet.h"
#ifdef WIFI_MONITOR_SUPPORT
#include "dp_mon.h"
#endif
#include "dp_txrx_wds.h"
/* Generic AST entry aging timer value */
@@ -1176,7 +1179,8 @@ dp_get_completion_indication_for_stack(struct dp_soc *soc,
uint8_t last_msdu = ts->last_msdu;
uint32_t txcap_hdr_size = sizeof(struct tx_capture_hdr);
if (qdf_unlikely(!pdev->tx_sniffer_enable && !pdev->mcopy_mode &&
if (qdf_unlikely(!monitor_is_enable_tx_sniffer(pdev) &&
!monitor_is_enable_mcopy_mode(pdev) &&
!pdev->latency_capture_enable))
return QDF_STATUS_E_NOSUPPORT;
@@ -1186,24 +1190,13 @@ dp_get_completion_indication_for_stack(struct dp_soc *soc,
return QDF_STATUS_E_INVAL;
}
if (pdev->mcopy_mode) {
/* If mcopy is enabled and mcopy_mode is M_COPY deliver 1st MSDU
* per PPDU. If mcopy_mode is M_COPY_EXTENDED deliver 1st MSDU
* for each MPDU
*/
if (pdev->mcopy_mode == M_COPY) {
if ((pdev->m_copy_id.tx_ppdu_id == ppdu_id) &&
(pdev->m_copy_id.tx_peer_id == peer_id)) {
if (monitor_mcopy_check_deliver(pdev, peer_id, ppdu_id, first_msdu) !=
QDF_STATUS_SUCCESS)
return QDF_STATUS_E_INVAL;
}
}
if (!first_msdu)
return QDF_STATUS_E_INVAL;
pdev->m_copy_id.tx_ppdu_id = ppdu_id;
pdev->m_copy_id.tx_peer_id = peer_id;
}
if (qdf_unlikely(qdf_nbuf_headroom(netbuf) < txcap_hdr_size)) {
netbuf = qdf_nbuf_realloc_headroom(netbuf, txcap_hdr_size);

View File

@@ -152,7 +152,6 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
struct dp_ast_entry *ast;
uint32_t flags = DP_AST_FLAGS_HM;
uint32_t ret = 0;
struct dp_neighbour_peer *neighbour_peer = NULL;
struct dp_pdev *pdev = ta_peer->vdev->pdev;
uint8_t wds_src_mac[QDF_MAC_ADDR_SIZE];
@@ -230,32 +229,9 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
* smart monitor is enabled and send add_ast command
* to FW.
*/
if (pdev->neighbour_peers_added) {
qdf_mem_copy(wds_src_mac,
(qdf_nbuf_data(nbuf) +
QDF_MAC_ADDR_SIZE),
QDF_MAC_ADDR_SIZE);
qdf_spin_lock_bh(&pdev->neighbour_peer_mutex);
TAILQ_FOREACH(neighbour_peer,
&pdev->neighbour_peers_list,
neighbour_peer_list_elem) {
if (!qdf_mem_cmp(&neighbour_peer->neighbour_peers_macaddr,
wds_src_mac,
QDF_MAC_ADDR_SIZE)) {
ret = dp_peer_add_ast(soc,
ta_peer,
wds_src_mac,
CDP_TXRX_AST_TYPE_WDS,
monitor_neighbour_peer_add_ast(pdev, ta_peer,
wds_src_mac, nbuf,
flags);
QDF_TRACE(QDF_MODULE_ID_DP,
QDF_TRACE_LEVEL_INFO,
"sa valid and nac roamed to wds");
break;
}
}
qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex);
}
return;
}
}

View File

@@ -55,9 +55,6 @@
#include <pktlog.h>
#endif
#ifdef WLAN_TX_PKT_CAPTURE_ENH
#include "dp_tx_capture.h"
#endif
//#include "dp_tx.h"
#define REPT_MU_MIMO 1
@@ -1710,17 +1707,6 @@ struct dp_soc {
/* total link descriptors for regular RX and TX */
uint32_t total_link_descs;
/* monitor link descriptor pages */
struct qdf_mem_multi_page_t mon_link_desc_pages[MAX_NUM_LMAC_HW];
/* total link descriptors for monitor mode for each radio */
uint32_t total_mon_link_descs[MAX_NUM_LMAC_HW];
/* Monitor Link descriptor memory banks */
struct link_desc_bank
mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS];
uint32_t num_mon_link_desc_banks[MAX_NUM_LMAC_HW];
/* Link descriptor Idle list for HW internal use (SRNG mode) */
struct dp_srng wbm_idle_link_ring;
@@ -1969,8 +1955,6 @@ struct dp_soc {
bool is_last_stats_ctx_init;
#endif /* WLAN_FEATURE_STATS_EXT */
/* Smart monitor capability for HKv2 */
uint8_t hw_nac_monitor_support;
/* Flag to indicate if HTT v2 is enabled*/
bool is_peer_map_unmap_v2;
/* Per peer per Tid ba window size support */
@@ -2023,8 +2007,6 @@ struct dp_soc {
} skip_fisa_param;
#endif
#endif /* WLAN_SUPPORT_RX_FLOW_TAG || WLAN_SUPPORT_RX_FISA */
/* Full monitor mode support */
bool full_mon_mode;
/* SG supported for msdu continued packets from wbm release ring */
bool wbm_release_desc_rx_sg_support;
bool peer_map_attach_success;
@@ -2291,13 +2273,6 @@ struct rx_protocol_tag_stats {
#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
#ifndef WLAN_TX_PKT_CAPTURE_ENH
struct dp_pdev_tx_capture {
};
struct dp_peer_tx_capture {
};
#endif
#ifdef WLAN_RX_PKT_CAPTURE_ENH
/* Template data to be set for Enhanced RX Monitor packets */
#define RX_MON_CAP_ENH_TRAILER 0xdeadc0dedeadda7a
@@ -2388,9 +2363,6 @@ struct dp_pdev {
/* TXRX SOC handle */
struct dp_soc *soc;
/* Stuck count on monitor destination ring MPDU process */
uint32_t mon_dest_ring_stuck_cnt;
bool pdev_deinit;
/* pdev status down or up required to handle dynamic hw
@@ -2433,42 +2405,9 @@ struct dp_pdev {
/* PDEV transmit lock */
qdf_spinlock_t tx_lock;
#ifndef REMOVE_PKT_LOG
bool pkt_log_init;
/* Pktlog pdev */
struct pktlog_dev_t *pl_dev;
#endif /* #ifndef REMOVE_PKT_LOG */
/* Monitor mode interface and status storage */
struct dp_vdev *monitor_vdev;
/* Monitor mode operation channel */
int mon_chan_num;
/* Monitor mode operation frequency */
qdf_freq_t mon_chan_freq;
/* Monitor mode band */
enum reg_wifi_band mon_chan_band;
/* monitor mode lock */
qdf_spinlock_t mon_lock;
/*tx_mutex for me*/
DP_MUTEX_TYPE tx_mutex;
/* monitor */
bool monitor_configured;
/* Smart Mesh */
bool filter_neighbour_peers;
/*flag to indicate neighbour_peers_list not empty */
bool neighbour_peers_added;
/* smart mesh mutex */
qdf_spinlock_t neighbour_peer_mutex;
/* Neighnour peer list */
TAILQ_HEAD(, dp_neighbour_peer) neighbour_peers_list;
/* msdu chain head & tail */
qdf_nbuf_t invalid_peer_head_msdu;
qdf_nbuf_t invalid_peer_tail_msdu;
@@ -2482,19 +2421,6 @@ struct dp_pdev {
/* Global RX decap mode for the device */
enum htt_pkt_type rx_decap_mode;
/* Enhanced Stats is enabled */
bool enhanced_stats_en;
/* advance filter mode and type*/
uint8_t mon_filter_mode;
uint16_t fp_mgmt_filter;
uint16_t fp_ctrl_filter;
uint16_t fp_data_filter;
uint16_t mo_mgmt_filter;
uint16_t mo_ctrl_filter;
uint16_t mo_data_filter;
uint16_t md_data_filter;
qdf_atomic_t num_tx_outstanding;
int32_t tx_descs_max;
@@ -2511,8 +2437,6 @@ struct dp_pdev {
/* dscp_tid_map_*/
uint8_t dscp_tid_map[DP_MAX_TID_MAPS][DSCP_TID_MAP_MAX];
struct hal_rx_ppdu_info ppdu_info;
/* operating channel */
struct {
uint8_t num;
@@ -2520,32 +2444,6 @@ struct dp_pdev {
uint16_t freq;
} operating_channel;
qdf_nbuf_queue_t rx_status_q;
uint32_t mon_ppdu_status;
struct cdp_mon_status rx_mon_recv_status;
/* monitor mode status/destination ring PPDU and MPDU count */
struct cdp_pdev_mon_stats rx_mon_stats;
/* to track duplicate link descriptor indications by HW for a WAR */
uint64_t mon_last_linkdesc_paddr;
/* to track duplicate buffer indications by HW for a WAR */
uint32_t mon_last_buf_cookie;
/* 128 bytes mpdu header queue per user for ppdu */
qdf_nbuf_queue_t mpdu_q[MAX_MU_USERS];
/* is this a mpdu header TLV and not msdu header TLV */
bool is_mpdu_hdr[MAX_MU_USERS];
/* per user 128 bytes msdu header list for MPDU */
struct msdu_list msdu_list[MAX_MU_USERS];
/* RX enhanced capture mode */
uint8_t rx_enh_capture_mode;
/* Rx per peer enhanced capture mode */
bool rx_enh_capture_peer;
struct dp_vdev *rx_enh_monitor_vdev;
/* RX enhanced capture trailer enable/disable flag */
bool is_rx_enh_capture_trailer_enabled;
#ifdef WLAN_RX_PKT_CAPTURE_ENH
/* RX per MPDU/PPDU information */
struct cdp_rx_indication_mpdu mpdu_ind;
#endif
/* pool addr for mcast enhance buff */
struct {
int size;
@@ -2575,69 +2473,21 @@ struct dp_pdev {
/* map this pdev to a particular Reo Destination ring */
enum cdp_host_reo_dest_ring reo_dest;
/* Packet log mode */
uint8_t rx_pktlog_mode;
/* Enable pktlog logging cbf */
bool rx_pktlog_cbf;
/* WDI event handlers */
struct wdi_event_subscribe_t **wdi_event_list;
/* ppdu_id of last received HTT TX stats */
uint32_t last_ppdu_id;
struct {
uint8_t last_user;
qdf_nbuf_t buf;
} tx_ppdu_info;
bool tx_sniffer_enable;
/* mirror copy mode */
enum m_copy_mode mcopy_mode;
bool cfr_rcc_mode;
bool enable_reap_timer_non_pkt;
bool bpr_enable;
/* enable time latency check for tx completion */
bool latency_capture_enable;
/* enable calculation of delay stats*/
bool delay_stats_flag;
struct {
uint32_t tx_ppdu_id;
uint16_t tx_peer_id;
uint32_t rx_ppdu_id;
} m_copy_id;
/* To check if PPDU Tx stats are enabled for Pktlog */
bool pktlog_ppdu_stats;
void *dp_txrx_handle; /* Advanced data path handle */
#ifdef ATH_SUPPORT_NAC_RSSI
bool nac_rssi_filtering;
#endif
/* ppdu_stats lock for queue concurrency between cores*/
qdf_spinlock_t ppdu_stats_lock;
/* list of ppdu tlvs */
TAILQ_HEAD(, ppdu_info) ppdu_info_list;
TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list;
uint32_t sched_comp_list_depth;
uint16_t delivered_sched_cmdid;
uint16_t last_sched_cmdid;
uint32_t tlv_count;
uint32_t list_depth;
uint32_t ppdu_id;
bool first_nbuf;
struct {
qdf_nbuf_t last_nbuf; /*Ptr to mgmt last buf */
uint8_t *mgmt_buf; /* Ptr to mgmt. payload in HTT ppdu stats */
uint32_t mgmt_buf_len; /* Len of mgmt. payload in ppdu stats */
uint32_t ppdu_id;
} mgmtctrl_frm_info;
/* Current noise-floor reading for the pdev channel */
int16_t chan_noise_floor;
@@ -2652,8 +2502,6 @@ struct dp_pdev {
* with same MAC address across 2 radios
*/
uint8_t is_primary;
/* Context of cal client timer */
struct cdp_cal_client *cal_client_ctx;
struct cdp_tx_sojourn_stats sojourn_stats;
qdf_nbuf_t sojourn_buf;
@@ -2662,11 +2510,6 @@ struct dp_pdev {
union dp_rx_desc_list_elem_t *free_list_head;
union dp_rx_desc_list_elem_t *free_list_tail;
/* Pdev level flag to check peer based pktlog enabled or
* disabled
*/
uint8_t dp_peer_based_pktlog;
/* Cached peer_id from htt_peer_details_tlv */
uint16_t fw_stats_peer_id;
@@ -2705,12 +2548,6 @@ struct dp_pdev {
#endif /* WLAN_SUPPORT_RX_TAG_STATISTICS */
#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
/* tx packet capture enhancement */
enum cdp_tx_enh_capture_mode tx_capture_enabled;
struct dp_pdev_tx_capture tx_capture;
uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/
#ifdef WLAN_SUPPORT_RX_FLOW_TAG
/**
* Pointer to DP Flow FST at SOC level if
@@ -2728,38 +2565,13 @@ struct dp_pdev {
data_stall_detect_cb data_stall_detect_callback;
#endif /* WLAN_SUPPORT_DATA_STALL */
struct dp_mon_filter **filter; /* Monitor Filter pointer */
#ifdef QCA_SUPPORT_FULL_MON
/* List to maintain all MPDUs for a PPDU in monitor mode */
TAILQ_HEAD(, dp_mon_mpdu) mon_mpdu_q;
/* TODO: define per-user mpdu list
* struct dp_mon_mpdu_list mpdu_list[MAX_MU_USERS];
*/
struct hal_rx_mon_desc_info *mon_desc;
#endif
qdf_nbuf_t mcopy_status_nbuf;
/* flag to indicate whether LRO hash command has been sent to FW */
uint8_t is_lro_hash_configured;
/* Flag to hold on to monitor destination ring */
bool hold_mon_dest_ring;
#ifdef WLAN_ATF_ENABLE
/* ATF stats enable */
bool dp_atf_stats_enable;
#endif
/* Maintains first status buffer's paddr of a PPDU */
uint64_t status_buf_addr;
#ifdef HTT_STATS_DEBUGFS_SUPPORT
/* HTT stats debugfs params */
struct pdev_htt_stats_dbgfs_cfg *dbgfs_cfg;
#endif
/* Flag to inidicate monitor rings are initialized */
uint8_t pdev_mon_init;
struct {
qdf_work_t work;
qdf_workqueue_t *work_queue;
@@ -3560,4 +3372,17 @@ void dp_rx_refill_buff_pool_enqueue(struct dp_soc *soc);
#else
static inline void dp_rx_refill_buff_pool_enqueue(struct dp_soc *soc) {}
#endif
QDF_STATUS dp_srng_alloc(struct dp_soc *soc, struct dp_srng *srng,
int ring_type, uint32_t num_entries,
bool cached);
void dp_srng_free(struct dp_soc *soc, struct dp_srng *srng);
QDF_STATUS dp_srng_init(struct dp_soc *soc, struct dp_srng *srng,
int ring_type, int ring_num, int mac_id);
void dp_srng_deinit(struct dp_soc *soc, struct dp_srng *srng,
int ring_type, int ring_num);
enum timer_yield_status
dp_should_timer_irq_yield(struct dp_soc *soc, uint32_t work_done,
uint64_t start_time);
#endif /* _DP_TYPES_H_ */

View File

@@ -25,16 +25,6 @@
#endif
#ifdef WDI_EVENT_ENABLE
void *dp_get_pldev(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
{
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
if (!pdev)
return NULL;
return pdev->pl_dev;
}
/*
* dp_wdi_event_next_sub() - Return handle for Next WDI event
* @wdi_sub: WDI Event handle

View File

@@ -31,8 +31,10 @@
#include "if_meta_hdr.h"
#endif
#include "dp_internal.h"
#include "dp_rx_mon.h"
#include "dp_ipa.h"
#ifdef WIFI_MONITOR_SUPPORT
#include <dp_mon.h>
#endif
#ifdef FEATURE_WDS
#include "dp_txrx_wds.h"
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -13,6 +13,10 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifdef WLAN_TX_PKT_CAPTURE_ENH
#include "dp_tx_capture.h"
#endif
#define DP_INTR_POLL_TIMER_MS 5
#define MON_VDEV_TIMER_INIT 0x1
@@ -20,6 +24,7 @@
/* Budget to reap monitor status ring */
#define DP_MON_REAP_BUDGET 1024
#define MON_BUF_MIN_ENTRIES 64
#define mon_rx_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_RX, params)
@@ -121,11 +126,35 @@ struct dp_mon_ops {
void (*mon_reap_timer_start)(struct dp_mon_soc *mon_soc);
bool (*mon_reap_timer_stop)(struct dp_mon_soc *mon_soc);
void (*mon_reap_timer_deinit)(struct dp_mon_soc *mon_soc);
QDF_STATUS (*mon_mcopy_check_deliver)(struct dp_mon_pdev *mon_pdev,
uint16_t peer_id,
uint32_t ppdu_id,
uint8_t first_msdu);
void (*mon_neighbour_peer_add_ast)(struct dp_pdev *pdev,
struct dp_peer *ta_peer,
uint8_t *mac_addr,
qdf_nbuf_t nbuf,
uint32_t flags);
};
struct dp_mon_soc {
/* Holds all monitor related fields extracted from dp_soc */
/* Holds pointer to monitor ops */
/* monitor link descriptor pages */
struct qdf_mem_multi_page_t mon_link_desc_pages[MAX_NUM_LMAC_HW];
/* total link descriptors for monitor mode for each radio */
uint32_t total_mon_link_descs[MAX_NUM_LMAC_HW];
/* Monitor Link descriptor memory banks */
struct link_desc_bank
mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS];
uint32_t num_mon_link_desc_banks[MAX_NUM_LMAC_HW];
/* Smart monitor capability for HKv2 */
uint8_t hw_nac_monitor_support;
/* Full monitor mode support */
bool full_mon_mode;
/*interrupt timer*/
qdf_timer_t mon_reap_timer;
@@ -138,6 +167,170 @@ struct dp_mon_soc {
};
struct dp_mon_pdev {
/* monitor */
bool monitor_configured;
struct dp_mon_filter **filter; /* Monitor Filter pointer */
/* advance filter mode and type*/
uint8_t mon_filter_mode;
uint16_t fp_mgmt_filter;
uint16_t fp_ctrl_filter;
uint16_t fp_data_filter;
uint16_t mo_mgmt_filter;
uint16_t mo_ctrl_filter;
uint16_t mo_data_filter;
uint16_t md_data_filter;
struct dp_pdev_tx_capture tx_capture;
/* tx packet capture enhancement */
enum cdp_tx_enh_capture_mode tx_capture_enabled;
/* Stuck count on monitor destination ring MPDU process */
uint32_t mon_dest_ring_stuck_cnt;
/* monitor mode lock */
qdf_spinlock_t mon_lock;
/* Monitor mode operation channel */
int mon_chan_num;
/* Monitor mode operation frequency */
qdf_freq_t mon_chan_freq;
/* Monitor mode band */
enum reg_wifi_band mon_chan_band;
uint32_t mon_ppdu_status;
/* monitor mode status/destination ring PPDU and MPDU count */
struct cdp_pdev_mon_stats rx_mon_stats;
/* Monitor mode interface and status storage */
struct dp_vdev *mvdev;
struct cdp_mon_status rx_mon_recv_status;
/* to track duplicate link descriptor indications by HW for a WAR */
uint64_t mon_last_linkdesc_paddr;
/* to track duplicate buffer indications by HW for a WAR */
uint32_t mon_last_buf_cookie;
#ifdef QCA_SUPPORT_FULL_MON
/* List to maintain all MPDUs for a PPDU in monitor mode */
TAILQ_HEAD(, dp_mon_mpdu) mon_mpdu_q;
/* TODO: define per-user mpdu list
* struct dp_mon_mpdu_list mpdu_list[MAX_MU_USERS];
*/
struct hal_rx_mon_desc_info *mon_desc;
#endif
/* Flag to hold on to monitor destination ring */
bool hold_mon_dest_ring;
/* Flag to inidicate monitor rings are initialized */
uint8_t pdev_mon_init;
#ifndef REMOVE_PKT_LOG
bool pkt_log_init;
struct pktlog_dev_t *pl_dev; /* Pktlog pdev */
#endif /* #ifndef REMOVE_PKT_LOG */
/* Smart Mesh */
bool filter_neighbour_peers;
/*flag to indicate neighbour_peers_list not empty */
bool neighbour_peers_added;
/* smart mesh mutex */
qdf_spinlock_t neighbour_peer_mutex;
/* Neighnour peer list */
TAILQ_HEAD(, dp_neighbour_peer) neighbour_peers_list;
/* Enhanced Stats is enabled */
bool enhanced_stats_en;
qdf_nbuf_queue_t rx_status_q;
/* 128 bytes mpdu header queue per user for ppdu */
qdf_nbuf_queue_t mpdu_q[MAX_MU_USERS];
/* is this a mpdu header TLV and not msdu header TLV */
bool is_mpdu_hdr[MAX_MU_USERS];
/* per user 128 bytes msdu header list for MPDU */
struct msdu_list msdu_list[MAX_MU_USERS];
/* RX enhanced capture mode */
uint8_t rx_enh_capture_mode;
/* Rx per peer enhanced capture mode */
bool rx_enh_capture_peer;
struct dp_vdev *rx_enh_monitor_vdev;
/* RX enhanced capture trailer enable/disable flag */
bool is_rx_enh_capture_trailer_enabled;
#ifdef WLAN_RX_PKT_CAPTURE_ENH
/* RX per MPDU/PPDU information */
struct cdp_rx_indication_mpdu mpdu_ind;
#endif
/* Packet log mode */
uint8_t rx_pktlog_mode;
/* Enable pktlog logging cbf */
bool rx_pktlog_cbf;
bool tx_sniffer_enable;
/* mirror copy mode */
enum m_copy_mode mcopy_mode;
bool enable_reap_timer_non_pkt;
bool bpr_enable;
/* Pdev level flag to check peer based pktlog enabled or
* disabled
*/
uint8_t dp_peer_based_pktlog;
#ifdef WLAN_ATF_ENABLE
/* ATF stats enable */
bool dp_atf_stats_enable;
#endif
/* Maintains first status buffer's paddr of a PPDU */
uint64_t status_buf_addr;
struct hal_rx_ppdu_info ppdu_info;
struct {
uint8_t last_user;
qdf_nbuf_t buf;
} tx_ppdu_info;
struct {
uint32_t tx_ppdu_id;
uint16_t tx_peer_id;
uint32_t rx_ppdu_id;
} m_copy_id;
/* To check if PPDU Tx stats are enabled for Pktlog */
bool pktlog_ppdu_stats;
#ifdef ATH_SUPPORT_NAC_RSSI
bool nac_rssi_filtering;
#endif
/* ppdu_stats lock for queue concurrency between cores*/
qdf_spinlock_t ppdu_stats_lock;
/* list of ppdu tlvs */
TAILQ_HEAD(, ppdu_info) ppdu_info_list;
TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list;
uint32_t sched_comp_list_depth;
uint16_t delivered_sched_cmdid;
uint16_t last_sched_cmdid;
uint32_t tlv_count;
uint32_t list_depth;
struct {
qdf_nbuf_t last_nbuf; /*Ptr to mgmt last buf */
uint8_t *mgmt_buf; /* Ptr to mgmt. payload in HTT ppdu stats */
uint32_t mgmt_buf_len; /* Len of mgmt. payload in ppdu stats */
uint32_t ppdu_id;
} mgmtctrl_frm_info;
/* Context of cal client timer */
struct cdp_cal_client *cal_client_ctx;
uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/
qdf_nbuf_t mcopy_status_nbuf;
bool is_dp_mon_pdev_initialized;
};
struct dp_mon_vdev {
@@ -157,6 +350,9 @@ struct dp_mon_peer {
#endif
};
struct mon_ops {
};
#ifdef FEATURE_PERPKT_INFO
void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf);
#else
@@ -167,6 +363,12 @@ void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
#endif
#ifndef WLAN_TX_PKT_CAPTURE_ENH
struct dp_pdev_tx_capture {
};
struct dp_peer_tx_capture {
};
/**
* dp_peer_tid_queue_init() Initialize ppdu stats queue per TID
* @peer: Datapath peer
@@ -340,21 +542,282 @@ void dp_print_pdev_tx_capture_stats(struct dp_pdev *pdev)
}
#endif
/**
* dp_rx_cookie_2_mon_link_desc_va() - Converts cookie to a virtual address of
* the MSDU Link Descriptor
* @pdev: core txrx pdev context
* @buf_info: buf_info includes cookie that used to lookup virtual address of
* link descriptor. Normally this is just an index into a per pdev array.
*
* This is the VA of the link descriptor in monitor mode destination ring,
* that HAL layer later uses to retrieve the list of MSDU's for a given MPDU.
*
* Return: void *: Virtual Address of the Rx descriptor
*/
static inline
void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev,
struct hal_buf_info *buf_info,
int mac_id)
{
void *link_desc_va;
struct qdf_mem_multi_page_t *pages;
uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie);
struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
if (!mon_soc)
return NULL;
pages = &mon_soc->mon_link_desc_pages[mac_id];
if (!pages)
return NULL;
if (qdf_unlikely(page_id >= pages->num_pages))
return NULL;
link_desc_va = pages->dma_pages[page_id].page_v_addr_start +
(buf_info->paddr - pages->dma_pages[page_id].page_p_addr);
return link_desc_va;
}
/**
* dp_soc_is_full_mon_enable () - Return if full monitor mode is enabled
* @soc: DP soc handle
*
* Return: Full monitor mode status
*/
static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev)
{
return (pdev->soc->monitor_soc->full_mon_mode &&
pdev->monitor_pdev->monitor_configured) ? true : false;
}
/*
* dp_is_enable_reap_timer_non_pkt() - check if mon reap timer is
* monitor_is_enable_reap_timer_non_pkt() - check if mon reap timer is
* enabled by non-pkt log or not
* @pdev: point to dp pdev
*
* Return: true if mon reap timer is enabled by non-pkt log
*/
static inline bool dp_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev)
static inline bool monitor_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev)
{
if (!pdev) {
dp_err("null pdev");
if (!pdev || !pdev->monitor_pdev)
return false;
return pdev->monitor_pdev->enable_reap_timer_non_pkt;
}
/*
* monitor_is_enable_mcopy_mode() - check if mcopy mode is enabled
* @pdev: point to dp pdev
*
* Return: true if mcopy mode is enabled
*/
static inline bool monitor_is_enable_mcopy_mode(struct dp_pdev *pdev)
{
if (!pdev || !pdev->monitor_pdev)
return false;
return pdev->monitor_pdev->mcopy_mode;
}
/*
* monitor_is_enable_tx_sniffer() - check if tx sniffer is enabled
* @pdev: point to dp pdev
*
* Return: true if tx sniffer is enabled
*/
static inline bool monitor_is_enable_tx_sniffer(struct dp_pdev *pdev)
{
if (!pdev || !pdev->monitor_pdev)
return false;
return pdev->monitor_pdev->tx_sniffer_enable;
}
/*
* monitor_is_set_monitor_configured() - check if monitor configured is set
* @pdev: point to dp pdev
*
* Return: true if monitor configured is set
*/
static inline bool monitor_is_configured(struct dp_pdev *pdev)
{
if (!pdev || !pdev->monitor_pdev)
return false;
return pdev->monitor_pdev->monitor_configured;
}
static inline QDF_STATUS monitor_check_com_info_ppdu_id(struct dp_pdev *pdev,
void *rx_desc)
{
struct cdp_mon_status *rs;
struct dp_mon_pdev *mon_pdev;
uint32_t msdu_ppdu_id = 0;
if (!pdev || !pdev->monitor_pdev)
return QDF_STATUS_E_FAILURE;
mon_pdev = pdev->monitor_pdev;
if (qdf_likely(1 != mon_pdev->ppdu_info.rx_status.rxpcu_filter_pass))
return QDF_STATUS_E_FAILURE;
rs = &pdev->monitor_pdev->rx_mon_recv_status;
if (!rs || rs->cdp_rs_rxdma_err)
return QDF_STATUS_E_FAILURE;
msdu_ppdu_id = hal_rx_get_ppdu_id(pdev->soc->hal_soc, rx_desc);
if (msdu_ppdu_id != mon_pdev->ppdu_info.com_info.ppdu_id) {
QDF_TRACE(QDF_MODULE_ID_DP,
QDF_TRACE_LEVEL_ERROR,
"msdu_ppdu_id=%x,com_info.ppdu_id=%x",
msdu_ppdu_id,
mon_pdev->ppdu_info.com_info.ppdu_id);
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
static inline struct mon_rx_status*
monitor_get_rx_status_addr(struct dp_pdev *pdev)
{
if (!pdev || !pdev->monitor_pdev)
return NULL;
return &pdev->monitor_pdev->ppdu_info.rx_status;
}
/*
* monitor_is_chan_band_known() - check if monitor chan band known
* @pdev: point to dp pdev
*
* Return: true if chan band known
*/
static inline bool monitor_is_chan_band_known(struct dp_pdev *pdev)
{
if (!pdev || !pdev->monitor_pdev)
return false;
if (pdev->monitor_pdev->mon_chan_band != REG_BAND_UNKNOWN)
return true;
return false;
}
return pdev->enable_reap_timer_non_pkt;
/*
* monitor_get_chan_band() - get chan band
* @pdev: point to dp pdev
*
* Return: wifi channel band
*/
static inline enum reg_wifi_band
monitor_get_chan_band(struct dp_pdev *pdev)
{
return pdev->monitor_pdev->mon_chan_band;
}
/*
* monitor_print_tx_stats() - print tx stats from monitor pdev
* @pdev: point to dp pdev
*
*/
static inline void monitor_print_tx_stats(struct dp_pdev *pdev)
{
if (!pdev || !pdev->monitor_pdev)
return;
DP_PRINT_STATS("ppdu info schedule completion list depth: %d",
pdev->monitor_pdev->sched_comp_list_depth);
DP_PRINT_STATS("delivered sched cmdid: %d",
pdev->monitor_pdev->delivered_sched_cmdid);
DP_PRINT_STATS("cur sched cmdid: %d",
pdev->monitor_pdev->last_sched_cmdid);
DP_PRINT_STATS("ppdu info list depth: %d",
pdev->monitor_pdev->list_depth);
}
/*
* monitor_is_enable_enhanced_stats() - check if enhanced stats enabled
* @pdev: point to dp pdev
*
* Return: true if enhanced stats is enabled
*/
static inline bool monitor_is_enable_enhanced_stats(struct dp_pdev *pdev)
{
if (!pdev || !pdev->monitor_pdev)
return false;
return pdev->monitor_pdev->enhanced_stats_en;
}
/*
* monitor_set_chan_num() - set channel number
* @pdev: point to dp pdev
* @chan_num: channel number
*
* Return:
*/
static inline void monitor_set_chan_num(struct dp_pdev *pdev, int chan_num)
{
if (!pdev || !pdev->monitor_pdev)
return;
pdev->monitor_pdev->mon_chan_num = chan_num;
}
/*
* monitor_set_chan_freq() - set channel frequency
* @pdev: point to dp pdev
* @chan_freq: channel frequency
*
* Return:
*/
static inline void
monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq)
{
if (!pdev || !pdev->monitor_pdev)
return;
pdev->monitor_pdev->mon_chan_freq = chan_freq;
}
/*
* monitor_set_chan_band() - set channel band
* @pdev: point to dp pdev
* @chan_band: channel band
*
* Return:
*/
static inline void
monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band)
{
if (!pdev || !pdev->monitor_pdev)
return;
pdev->monitor_pdev->mon_chan_band = chan_band;
}
/*
* monitor_get_mpdu_status() - get mpdu status
* @pdev: point to dp pdev
* @soc: point to dp soc
*
*/
static inline void monitor_get_mpdu_status(struct dp_pdev *pdev,
struct dp_soc *soc,
uint8_t *rx_tlv_hdr)
{
struct dp_mon_pdev *mon_pdev;
if (!pdev || !pdev->monitor_pdev)
return;
mon_pdev = pdev->monitor_pdev;
hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_tlv_hdr,
&mon_pdev->ppdu_info.rx_status);
}
#ifdef FEATURE_NAC_RSSI
@@ -364,8 +827,11 @@ static inline QDF_STATUS monitor_drop_inv_peer_pkts(struct dp_vdev *vdev,
struct dp_pdev *pdev = vdev->pdev;
struct dp_soc *soc = pdev->soc;
if (!soc->hw_nac_monitor_support &&
pdev->filter_neighbour_peers &&
if (!soc->monitor_soc)
return QDF_STATUS_E_FAILURE;
if (!soc->monitor_soc->hw_nac_monitor_support &&
pdev->monitor_pdev->filter_neighbour_peers &&
vdev->opmode == wlan_op_mode_sta) {
mon_rx_warn("%pK: Drop inv peer pkts with STA RA:%pm",
soc, wh->i_addr1);
@@ -416,6 +882,15 @@ static inline void monitor_vdev_register_osif(struct dp_vdev *vdev,
vdev->monitor_vdev->osif_rx_mon = txrx_ops->rx.mon;
}
static inline struct dp_vdev*
monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev)
{
if (!pdev || !pdev->monitor_pdev || !pdev->monitor_pdev->mvdev)
return NULL;
return pdev->monitor_pdev->mvdev;
}
static inline bool monitor_is_vdev_timer_running(struct dp_soc *soc)
{
struct dp_mon_soc *mon_soc;
@@ -428,6 +903,21 @@ static inline bool monitor_is_vdev_timer_running(struct dp_soc *soc)
return mon_soc->mon_vdev_timer_state & MON_VDEV_TIMER_RUNNING;
}
static inline struct qdf_mem_multi_page_t*
monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id)
{
if (!soc || !soc->monitor_soc)
return NULL;
return &soc->monitor_soc->mon_link_desc_pages[mac_id];
}
static inline uint32_t *
monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id)
{
return &soc->monitor_soc->total_mon_link_descs[mac_id];
}
static inline QDF_STATUS monitor_pdev_attach(struct dp_pdev *pdev)
{
struct dp_mon_ops *monitor_ops;
@@ -1473,7 +1963,7 @@ bool monitor_reap_timer_stop(struct dp_soc *soc)
return false;
}
monitor_ops->mon_reap_timer_stop(mon_soc);
return monitor_ops->mon_reap_timer_stop(mon_soc);
}
static inline
@@ -1556,6 +2046,54 @@ bool monitor_vdev_timer_stop(struct dp_soc *soc)
return monitor_ops->mon_vdev_timer_stop(mon_soc);
}
static inline
QDF_STATUS monitor_mcopy_check_deliver(struct dp_pdev *pdev,
uint16_t peer_id, uint32_t ppdu_id,
uint8_t first_msdu)
{
struct dp_mon_ops *monitor_ops;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
if (!mon_soc) {
qdf_err("monitor soc is NULL");
return QDF_STATUS_SUCCESS;
}
monitor_ops = mon_soc->mon_ops;
if (!monitor_ops || !monitor_ops->mon_mcopy_check_deliver) {
qdf_err("callback not registered");
return QDF_STATUS_SUCCESS;
}
return monitor_ops->mon_mcopy_check_deliver(mon_pdev, peer_id,
ppdu_id, first_msdu);
}
static inline void monitor_neighbour_peer_add_ast(struct dp_pdev *pdev,
struct dp_peer *ta_peer,
uint8_t *mac_addr,
qdf_nbuf_t nbuf,
uint32_t flags)
{
struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
struct dp_mon_ops *monitor_ops;
if (!mon_soc) {
qdf_err("monitor soc is NULL");
return;
}
monitor_ops = mon_soc->mon_ops;
if (!monitor_ops || !monitor_ops->mon_neighbour_peer_add_ast) {
qdf_err("callback not registered");
return;
}
return monitor_ops->mon_neighbour_peer_add_ast(pdev, ta_peer, mac_addr,
nbuf, flags);
}
static inline void monitor_vdev_delete(struct dp_soc *soc, struct dp_vdev *vdev)
{
if (soc->intr_mode == DP_INTR_POLL) {
@@ -1569,3 +2107,77 @@ static inline void monitor_vdev_delete(struct dp_soc *soc, struct dp_vdev *vdev)
monitor_vdev_detach(vdev);
}
#ifdef DP_POWER_SAVE
/*
* monitor_stop_reap_timer() - stop reap timer
* @pdev: point to dp pdev
*
* Return:
*/
static inline void monitor_stop_reap_timer(struct dp_pdev *pdev)
{
struct dp_soc *soc;
if (!pdev || !pdev->monitor_pdev)
return;
soc = pdev->soc;
if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
monitor_is_enable_reap_timer_non_pkt(pdev))) {
if (monitor_reap_timer_stop(soc))
monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET);
}
}
/*
* monitor_start_reap_timer() - start reap timer
* @pdev: point to dp pdev
*
* Return:
*/
static inline void monitor_start_reap_timer(struct dp_pdev *pdev)
{
struct dp_soc *soc;
if (!pdev || !pdev->monitor_pdev)
return;
soc = pdev->soc;
if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
monitor_is_enable_reap_timer_non_pkt(pdev)))
monitor_reap_timer_start(soc);
}
#endif
static inline
void monitor_neighbour_peer_list_remove(struct dp_pdev *pdev,
struct dp_vdev *vdev,
struct dp_neighbour_peer *peer)
{
struct dp_mon_pdev *mon_pdev;
struct dp_neighbour_peer *temp_peer = NULL;
if (!pdev || !pdev->monitor_pdev)
return;
mon_pdev = pdev->monitor_pdev;
qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex);
if (!pdev->soc->monitor_soc->hw_nac_monitor_support) {
TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list,
neighbour_peer_list_elem) {
QDF_ASSERT(peer->vdev != vdev);
}
} else {
TAILQ_FOREACH_SAFE(peer, &mon_pdev->neighbour_peers_list,
neighbour_peer_list_elem, temp_peer) {
if (peer->vdev == vdev) {
TAILQ_REMOVE(&mon_pdev->neighbour_peers_list,
peer,
neighbour_peer_list_elem);
qdf_mem_free(peer);
}
}
}
qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex);
}

View File

@@ -21,6 +21,7 @@
#include "dp_types.h"
#include "dp_internal.h"
#include "dp_htt.h"
#include "dp_mon.h"
#include "dp_mon_filter.h"
/**
@@ -51,7 +52,7 @@ static int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = {
* @mode: The filter modes
* @tlv_filter: tlv filter
*/
static void dp_mon_filter_show_filter(struct dp_pdev *pdev,
static void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev,
enum dp_mon_filter_mode mode,
struct dp_mon_filter *filter)
{
@@ -192,6 +193,7 @@ static void dp_mon_filter_ht2_setup(struct dp_soc *soc, struct dp_pdev *pdev,
{
int32_t current_mode = 0;
struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
/*
* Loop through all the modes.
@@ -199,7 +201,7 @@ static void dp_mon_filter_ht2_setup(struct dp_soc *soc, struct dp_pdev *pdev,
for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE;
current_mode++) {
struct dp_mon_filter *mon_filter =
&pdev->filter[current_mode][srng_type];
&mon_pdev->filter[current_mode][srng_type];
uint32_t src_filter = 0, dst_filter = 0;
/*
@@ -305,7 +307,7 @@ static void dp_mon_filter_ht2_setup(struct dp_soc *soc, struct dp_pdev *pdev,
DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter);
}
dp_mon_filter_show_filter(pdev, 0, filter);
dp_mon_filter_show_filter(mon_pdev, 0, filter);
}
/**
@@ -338,44 +340,46 @@ dp_mon_filter_reset_mon_srng(struct dp_soc *soc, struct dp_pdev *pdev,
*/
static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
/*
* Check if the Rx Enhanced capture mode, monitor mode,
* smart_monitor_mode and mcopy mode can co-exist together.
*/
if ((pdev->rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED) &&
((pdev->neighbour_peers_added && pdev->monitor_vdev) ||
pdev->mcopy_mode)) {
if ((mon_pdev->rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED) &&
((mon_pdev->neighbour_peers_added && mon_pdev->mvdev) ||
mon_pdev->mcopy_mode)) {
dp_mon_filter_err("%pK:Rx Capture mode can't exist with modes:\n"
"Smart Monitor Mode:%d\n"
"M_Copy Mode:%d", pdev->soc,
pdev->neighbour_peers_added,
pdev->mcopy_mode);
mon_pdev->neighbour_peers_added,
mon_pdev->mcopy_mode);
return QDF_STATUS_E_FAILURE;
}
/*
* Check if the monitor mode cannot co-exist with any other mode.
*/
if ((pdev->monitor_vdev && pdev->monitor_configured) &&
(pdev->mcopy_mode || pdev->neighbour_peers_added)) {
if ((mon_pdev->mvdev && mon_pdev->monitor_configured) &&
(mon_pdev->mcopy_mode || mon_pdev->neighbour_peers_added)) {
dp_mon_filter_err("%pK: Monitor mode can't exist with modes\n"
"M_Copy Mode:%d\n"
"Smart Monitor Mode:%d",
pdev->soc, pdev->mcopy_mode,
pdev->neighbour_peers_added);
pdev->soc, mon_pdev->mcopy_mode,
mon_pdev->neighbour_peers_added);
return QDF_STATUS_E_FAILURE;
}
/*
* Check if the smart monitor mode can co-exist with any other mode
*/
if (pdev->neighbour_peers_added &&
((pdev->mcopy_mode) || pdev->monitor_configured)) {
dp_mon_filter_err("%pK: Smart Monitor mode can't exist with modes\n"
if (mon_pdev->neighbour_peers_added &&
((mon_pdev->mcopy_mode) || mon_pdev->monitor_configured)) {
dp_mon_filter_err("%pk: Smart Monitor mode can't exist with modes\n"
"M_Copy Mode:%d\n"
"Monitor Mode:%d",
pdev->soc, pdev->mcopy_mode,
pdev->monitor_configured);
pdev->soc, mon_pdev->mcopy_mode,
mon_pdev->monitor_configured);
return QDF_STATUS_E_FAILURE;
}
@@ -383,13 +387,13 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
* Check if the m_copy, monitor mode and the smart_monitor_mode
* can co-exist togther.
*/
if (pdev->mcopy_mode &&
(pdev->monitor_vdev || pdev->neighbour_peers_added)) {
if (mon_pdev->mcopy_mode &&
(mon_pdev->mvdev || mon_pdev->neighbour_peers_added)) {
dp_mon_filter_err("%pK: mcopy mode can't exist with modes\n"
"Monitor Mode:%pK\n"
"Smart Monitor Mode:%d",
pdev->soc, pdev->monitor_vdev,
pdev->neighbour_peers_added);
pdev->soc, mon_pdev->mvdev,
mon_pdev->neighbour_peers_added);
return QDF_STATUS_E_FAILURE;
}
@@ -397,12 +401,12 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
* Check if the Rx packet log lite or full can co-exist with
* the enable modes.
*/
if ((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) &&
!pdev->rx_pktlog_cbf &&
(pdev->monitor_vdev || pdev->monitor_configured)) {
if ((mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) &&
!mon_pdev->rx_pktlog_cbf &&
(mon_pdev->mvdev || mon_pdev->monitor_configured)) {
dp_mon_filter_err("%pK: Rx pktlog full/lite can't exist with modes\n"
"Monitor Mode:%d", pdev->soc,
pdev->monitor_configured);
mon_pdev->monitor_configured);
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
@@ -414,11 +418,11 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
* Check if the Rx packet log lite or full can co-exist with
* the enable modes.
*/
if ((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) &&
(pdev->monitor_vdev || pdev->monitor_configured)) {
if ((mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) &&
(mon_pdev->mvdev || mon_pdev->monitor_configured)) {
dp_mon_filter_err("%pK: Rx pktlog full/lite can't exist with modes\n"
"Monitor Mode:%d", pdev->soc,
pdev->monitor_configured);
mon_pdev->monitor_configured);
return QDF_STATUS_E_FAILURE;
}
@@ -433,7 +437,7 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
*
* Return: QDF_STATUS
*/
static void dp_mon_filter_set_mon_cmn(struct dp_pdev *pdev,
static void dp_mon_filter_set_mon_cmn(struct dp_mon_pdev *mon_pdev,
struct dp_mon_filter *filter)
{
filter->tlv_filter.mpdu_start = 1;
@@ -450,16 +454,16 @@ static void dp_mon_filter_set_mon_cmn(struct dp_pdev *pdev,
filter->tlv_filter.ppdu_end_status_done = 0;
filter->tlv_filter.header_per_msdu = 1;
filter->tlv_filter.enable_fp =
(pdev->mon_filter_mode & MON_FILTER_PASS) ? 1 : 0;
(mon_pdev->mon_filter_mode & MON_FILTER_PASS) ? 1 : 0;
filter->tlv_filter.enable_mo =
(pdev->mon_filter_mode & MON_FILTER_OTHER) ? 1 : 0;
(mon_pdev->mon_filter_mode & MON_FILTER_OTHER) ? 1 : 0;
filter->tlv_filter.fp_mgmt_filter = pdev->fp_mgmt_filter;
filter->tlv_filter.fp_ctrl_filter = pdev->fp_ctrl_filter;
filter->tlv_filter.fp_data_filter = pdev->fp_data_filter;
filter->tlv_filter.mo_mgmt_filter = pdev->mo_mgmt_filter;
filter->tlv_filter.mo_ctrl_filter = pdev->mo_ctrl_filter;
filter->tlv_filter.mo_data_filter = pdev->mo_data_filter;
filter->tlv_filter.fp_mgmt_filter = mon_pdev->fp_mgmt_filter;
filter->tlv_filter.fp_ctrl_filter = mon_pdev->fp_ctrl_filter;
filter->tlv_filter.fp_data_filter = mon_pdev->fp_data_filter;
filter->tlv_filter.mo_mgmt_filter = mon_pdev->mo_mgmt_filter;
filter->tlv_filter.mo_ctrl_filter = mon_pdev->mo_ctrl_filter;
filter->tlv_filter.mo_data_filter = mon_pdev->mo_data_filter;
filter->tlv_filter.offset_valid = false;
}
@@ -470,7 +474,7 @@ static void dp_mon_filter_set_mon_cmn(struct dp_pdev *pdev,
*
* Return: QDF_STATUS
*/
static void dp_mon_filter_set_status_cmn(struct dp_pdev *pdev,
static void dp_mon_filter_set_status_cmn(struct dp_mon_pdev *mon_pdev,
struct dp_mon_filter *filter)
{
filter->tlv_filter.mpdu_start = 1;
@@ -491,7 +495,7 @@ static void dp_mon_filter_set_status_cmn(struct dp_pdev *pdev,
filter->tlv_filter.fp_data_filter = FILTER_DATA_ALL;
filter->tlv_filter.offset_valid = false;
if (pdev->mon_filter_mode & MON_FILTER_OTHER) {
if (mon_pdev->mon_filter_mode & MON_FILTER_OTHER) {
filter->tlv_filter.enable_mo = 1;
filter->tlv_filter.mo_mgmt_filter = FILTER_MGMT_ALL;
filter->tlv_filter.mo_ctrl_filter = FILTER_CTRL_ALL;
@@ -562,26 +566,26 @@ static void dp_mon_filter_set_cbf_cmn(struct dp_pdev *pdev,
#ifdef FEATURE_PERPKT_INFO
/**
* dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter
* @pdev: DP pdev handle
* @mon_pdev: Monitor DP pdev handle
*/
void dp_mon_filter_setup_enhanced_stats(struct dp_pdev *pdev)
void dp_mon_filter_setup_enhanced_stats(struct dp_mon_pdev *mon_pdev)
{
struct dp_mon_filter filter = {0};
enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
if (!mon_pdev) {
dp_mon_filter_err("Monitor pdev Context is null");
return;
}
/* Enabled the filter */
filter.valid = true;
dp_mon_filter_set_status_cmn(pdev, &filter);
dp_mon_filter_show_filter(pdev, mode, &filter);
pdev->filter[mode][srng_type] = filter;
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
mon_pdev->filter[mode][srng_type] = filter;
}
/**
@@ -594,12 +598,15 @@ void dp_mon_filter_reset_enhanced_stats(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
return;
}
pdev->filter[mode][srng_type] = filter;
mon_pdev = pdev->monitor_pdev;
mon_pdev->filter[mode][srng_type] = filter;
}
/**
@@ -613,6 +620,7 @@ void dp_mon_filter_setup_mcopy_mode(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_MCOPY_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
@@ -625,19 +633,24 @@ void dp_mon_filter_setup_mcopy_mode(struct dp_pdev *pdev)
return;
}
mon_pdev = pdev->monitor_pdev;
if (!mon_pdev) {
dp_mon_filter_err("monitor pdev Context is null");
return;
}
/* Enabled the filter */
filter.valid = true;
dp_mon_filter_set_mon_cmn(pdev, &filter);
dp_mon_filter_set_mon_cmn(mon_pdev, &filter);
filter.tlv_filter.fp_data_filter = 0;
filter.tlv_filter.mo_data_filter = 0;
dp_mon_filter_show_filter(pdev, mode, &filter);
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
/* Clear the filter as the same filter will be used to set the
* monitor status ring
@@ -646,16 +659,16 @@ void dp_mon_filter_setup_mcopy_mode(struct dp_pdev *pdev)
/* Enabled the filter */
filter.valid = true;
dp_mon_filter_set_status_cmn(pdev, &filter);
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
/* Setup the filter */
filter.tlv_filter.enable_mo = 1;
filter.tlv_filter.packet_header = 1;
filter.tlv_filter.mpdu_end = 1;
dp_mon_filter_show_filter(pdev, mode, &filter);
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
}
/**
@@ -669,6 +682,7 @@ void dp_mon_filter_reset_mcopy_mode(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_MCOPY_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
@@ -681,13 +695,14 @@ void dp_mon_filter_reset_mcopy_mode(struct dp_pdev *pdev)
return;
}
mon_pdev = pdev->monitor_pdev;
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
}
#endif /* FEATURE_PERPKT_INFO */
@@ -700,9 +715,12 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev)
{
struct dp_mon_filter filter = {0};
struct dp_soc *soc = NULL;
struct dp_mon_soc *mon_soc;
enum dp_mon_filter_mode mode = DP_MON_FILTER_SMART_MONITOR_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
@@ -715,36 +733,39 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev)
return;
}
mon_soc = soc->monitor_soc;
mon_pdev = pdev->monitor_pdev;
/* Enabled the filter */
filter.valid = true;
dp_mon_filter_set_status_cmn(pdev, &filter);
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
if (soc->hw_nac_monitor_support) {
if (mon_soc->hw_nac_monitor_support) {
filter.tlv_filter.enable_md = 1;
filter.tlv_filter.packet_header = 1;
filter.tlv_filter.md_data_filter = FILTER_DATA_ALL;
}
dp_mon_filter_show_filter(pdev, mode, &filter);
pdev->filter[mode][srng_type] = filter;
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
mon_pdev->filter[mode][srng_type] = filter;
}
/**
* dp_mon_filter_reset_smart_monitor() - Reset the smart monitor mode filter
* @pdev: DP pdev handle
*/
void dp_mon_filter_reset_smart_monitor(struct dp_pdev *pdev)
void dp_mon_filter_reset_smart_monitor(struct dp_mon_pdev *mon_pdev)
{
struct dp_mon_filter filter = {0};
enum dp_mon_filter_mode mode = DP_MON_FILTER_SMART_MONITOR_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
if (!mon_pdev) {
dp_mon_filter_err("monitor pdev Context is null");
return;
}
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
}
#endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */
@@ -760,6 +781,7 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_RX_CAPTURE_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
@@ -772,9 +794,11 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev)
return;
}
mon_pdev = pdev->monitor_pdev;
/* Enabled the filter */
filter.valid = true;
dp_mon_filter_set_mon_cmn(pdev, &filter);
dp_mon_filter_set_mon_cmn(mon_pdev, &filter);
filter.tlv_filter.fp_mgmt_filter = 0;
filter.tlv_filter.fp_ctrl_filter = 0;
@@ -783,12 +807,12 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev)
filter.tlv_filter.mo_ctrl_filter = 0;
filter.tlv_filter.mo_data_filter = 0;
dp_mon_filter_show_filter(pdev, mode, &filter);
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
/* Clear the filter as the same filter will be used to set the
* monitor status ring
@@ -797,31 +821,31 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev)
/* Enabled the filter */
filter.valid = true;
dp_mon_filter_set_status_cmn(pdev, &filter);
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
/* Setup the filter */
filter.tlv_filter.mpdu_end = 1;
filter.tlv_filter.enable_mo = 1;
filter.tlv_filter.packet_header = 1;
if (pdev->rx_enh_capture_mode == CDP_RX_ENH_CAPTURE_MPDU) {
if (mon_pdev->rx_enh_capture_mode == CDP_RX_ENH_CAPTURE_MPDU) {
filter.tlv_filter.header_per_msdu = 0;
filter.tlv_filter.enable_mo = 0;
} else if (pdev->rx_enh_capture_mode ==
} else if (mon_pdev->rx_enh_capture_mode ==
CDP_RX_ENH_CAPTURE_MPDU_MSDU) {
bool is_rx_mon_proto_flow_tag_enabled =
wlan_cfg_is_rx_mon_protocol_flow_tag_enabled(soc->wlan_cfg_ctx);
filter.tlv_filter.header_per_msdu = 1;
filter.tlv_filter.enable_mo = 0;
if (pdev->is_rx_enh_capture_trailer_enabled ||
if (mon_pdev->is_rx_enh_capture_trailer_enabled ||
is_rx_mon_proto_flow_tag_enabled)
filter.tlv_filter.msdu_end = 1;
}
dp_mon_filter_show_filter(pdev, mode, &filter);
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
}
/**
@@ -835,6 +859,7 @@ void dp_mon_filter_reset_rx_enh_capture(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_RX_CAPTURE_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
@@ -847,13 +872,14 @@ void dp_mon_filter_reset_rx_enh_capture(struct dp_pdev *pdev)
return;
}
mon_pdev = pdev->monitor_pdev;
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
}
#endif /* WLAN_RX_PKT_CAPTURE_ENH */
@@ -868,6 +894,7 @@ void dp_mon_filter_setup_mon_mode(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
@@ -880,14 +907,15 @@ void dp_mon_filter_setup_mon_mode(struct dp_pdev *pdev)
return;
}
mon_pdev = pdev->monitor_pdev;
filter.valid = true;
dp_mon_filter_set_mon_cmn(pdev, &filter);
dp_mon_filter_show_filter(pdev, mode, &filter);
dp_mon_filter_set_mon_cmn(mon_pdev, &filter);
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
/* Clear the filter as the same filter will be used to set the
* monitor status ring
@@ -896,12 +924,12 @@ void dp_mon_filter_setup_mon_mode(struct dp_pdev *pdev)
/* Enabled the filter */
filter.valid = true;
dp_mon_filter_set_status_cmn(pdev, &filter);
dp_mon_filter_show_filter(pdev, mode, &filter);
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
/* Store the above filter */
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
}
/**
@@ -915,6 +943,7 @@ void dp_mon_filter_reset_mon_mode(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
@@ -927,13 +956,14 @@ void dp_mon_filter_reset_mon_mode(struct dp_pdev *pdev)
return;
}
mon_pdev = pdev->monitor_pdev;
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
}
#ifdef WDI_EVENT_ENABLE
@@ -947,14 +977,17 @@ void dp_mon_filter_setup_rx_pkt_log_full(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
return;
}
mon_pdev = pdev->monitor_pdev;
/* Enabled the filter */
filter.valid = true;
dp_mon_filter_set_status_cmn(pdev, &filter);
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
/* Setup the filter */
filter.tlv_filter.packet_header = 1;
@@ -963,8 +996,8 @@ void dp_mon_filter_setup_rx_pkt_log_full(struct dp_pdev *pdev)
filter.tlv_filter.mpdu_end = 1;
filter.tlv_filter.attention = 1;
dp_mon_filter_show_filter(pdev, mode, &filter);
pdev->filter[mode][srng_type] = filter;
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
mon_pdev->filter[mode][srng_type] = filter;
}
/**
@@ -977,12 +1010,15 @@ void dp_mon_filter_reset_rx_pkt_log_full(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
return;
}
pdev->filter[mode][srng_type] = filter;
mon_pdev = pdev->monitor_pdev;
mon_pdev->filter[mode][srng_type] = filter;
}
/**
@@ -995,35 +1031,39 @@ void dp_mon_filter_setup_rx_pkt_log_lite(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
return;
}
mon_pdev = pdev->monitor_pdev;
/* Enabled the filter */
filter.valid = true;
dp_mon_filter_set_status_cmn(pdev, &filter);
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
dp_mon_filter_show_filter(pdev, mode, &filter);
pdev->filter[mode][srng_type] = filter;
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
mon_pdev->filter[mode][srng_type] = filter;
}
/**
* dp_mon_filter_reset_rx_pkt_log_lite() - Reset the Rx pktlog lite mode filter
* @pdev: DP pdev handle
* @mon_pdev: Monitor pdev handle
*/
void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_pdev *pdev)
void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_mon_pdev *mon_pdev)
{
struct dp_mon_filter filter = {0};
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
if (!mon_pdev) {
dp_mon_filter_err("monitor pdev Context is null");
return;
}
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
}
/**
@@ -1037,6 +1077,7 @@ void dp_mon_filter_setup_rx_pkt_log_cbf(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
@@ -1052,8 +1093,8 @@ void dp_mon_filter_setup_rx_pkt_log_cbf(struct dp_pdev *pdev)
/* Enabled the filter */
filter.valid = true;
dp_mon_filter_set_status_cbf(pdev, &filter);
dp_mon_filter_show_filter(pdev, mode, &filter);
pdev->filter[mode][srng_type] = filter;
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
mon_pdev->filter[mode][srng_type] = filter;
/* Clear the filter as the same filter will be used to set the
* monitor status ring
@@ -1062,12 +1103,12 @@ void dp_mon_filter_setup_rx_pkt_log_cbf(struct dp_pdev *pdev)
filter.valid = true;
dp_mon_filter_set_cbf_cmn(pdev, &filter);
dp_mon_filter_show_filter(pdev, mode, &filter);
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
}
/**
@@ -1081,6 +1122,8 @@ void dp_mon_filter_reset_rx_pktlog_cbf(struct dp_pdev *pdev)
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE;
enum dp_mon_filter_srng_type srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
if (!pdev) {
QDF_TRACE(QDF_MODULE_ID_MON_FILTER, QDF_TRACE_LEVEL_ERROR,
FL("pdev Context is null"));
@@ -1097,10 +1140,10 @@ void dp_mon_filter_reset_rx_pktlog_cbf(struct dp_pdev *pdev)
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
pdev->filter[mode][srng_type] = filter;
mon_pdev->filter[mode][srng_type] = filter;
}
#endif /* WDI_EVENT_ENABLE */
@@ -1121,7 +1164,7 @@ void dp_mon_filter_reset_rx_pktlog_cbf(struct dp_pdev *pdev)
*/
static inline bool dp_mon_should_reset_buf_ring_filter(struct dp_pdev *pdev)
{
return (pdev->monitor_vdev) ? true : false;
return (pdev->monitor_pdev->mvdev) ? true : false;
}
#else
static inline bool dp_mon_should_reset_buf_ring_filter(struct dp_pdev *pdev)
@@ -1145,12 +1188,14 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev)
enum dp_mon_filter_srng_type mon_srng_type =
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF;
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
return QDF_STATUS_E_FAILURE;
}
mon_pdev = pdev->monitor_pdev;
soc = pdev->soc;
if (!soc) {
dp_mon_filter_err("Soc Context is null");
@@ -1184,7 +1229,7 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev)
* reset when monitor mode gets enabled/disabled.
*/
if (soc->wlan_cfg_ctx->rxdma1_enable) {
if (pdev->monitor_configured || mon_mode_set) {
if (mon_pdev->monitor_configured || mon_mode_set) {
status = dp_mon_ht2_rx_ring_cfg(soc, pdev,
mon_srng_type,
&filter.tlv_filter);
@@ -1232,20 +1277,20 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev)
* the radio object.
* @pdev: DP pdev handle
*/
void dp_mon_filter_dealloc(struct dp_pdev *pdev)
void dp_mon_filter_dealloc(struct dp_mon_pdev *mon_pdev)
{
enum dp_mon_filter_mode mode;
struct dp_mon_filter **mon_filter = NULL;
if (!pdev) {
dp_mon_filter_err("pdev Context is null");
if (!mon_pdev) {
dp_mon_filter_err("Monitor pdev Context is null");
return;
}
mon_filter = pdev->filter;
mon_filter = mon_pdev->filter;
/*
* Check if the monitor filters are already allocated to the pdev.
* Check if the monitor filters are already allocated to the mon_pdev.
*/
if (!mon_filter) {
dp_mon_filter_err("Found NULL memmory for the Monitor filter");
@@ -1265,20 +1310,20 @@ void dp_mon_filter_dealloc(struct dp_pdev *pdev)
}
qdf_mem_free(mon_filter);
pdev->filter = NULL;
mon_pdev->filter = NULL;
}
/**
* dp_mon_filter_alloc() - Allocate the filter objects to be stored in
* the radio object.
* @pdev: DP pdev handle
* @mon_pdev: DP pdev handle
*/
struct dp_mon_filter **dp_mon_filter_alloc(struct dp_pdev *pdev)
struct dp_mon_filter **dp_mon_filter_alloc(struct dp_mon_pdev *mon_pdev)
{
struct dp_mon_filter **mon_filter = NULL;
enum dp_mon_filter_mode mode;
if (!pdev) {
if (!mon_pdev) {
dp_mon_filter_err("pdev Context is null");
return NULL;
}
@@ -1303,13 +1348,13 @@ struct dp_mon_filter **dp_mon_filter_alloc(struct dp_pdev *pdev)
/* Assign the mon_filter to the pdev->filter such
* that the dp_mon_filter_dealloc() can free up the filters. */
if (!mon_filter[mode]) {
pdev->filter = mon_filter;
mon_pdev->filter = mon_filter;
goto fail;
}
}
return mon_filter;
fail:
dp_mon_filter_dealloc(pdev);
dp_mon_filter_dealloc(mon_pdev);
return NULL;
}

View File

@@ -155,9 +155,9 @@ enum dp_mon_filter_action {
#ifdef FEATURE_PERPKT_INFO
/**
* dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter
* @pdev: DP pdev handle
* @mon_pdev: Monitor DP pdev handle
*/
void dp_mon_filter_setup_enhanced_stats(struct dp_pdev *pdev);
void dp_mon_filter_setup_enhanced_stats(struct dp_mon_pdev *mon_pdev);
/***
* dp_mon_filter_reset_enhanced_stats() - Reset the enhanced stats filter
@@ -187,9 +187,9 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev);
/**
* dp_mon_filter_reset_smart_monitor() - Reset the smart monitor mode filter
* @pdev: DP pdev handle
* @mon_pdev: monitor pdev handle
*/
void dp_mon_filter_reset_smart_monitor(struct dp_pdev *pdev);
void dp_mon_filter_reset_smart_monitor(struct dp_mon_pdev *mon_pdev);
#endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */
#ifdef WLAN_RX_PKT_CAPTURE_ENH
@@ -240,9 +240,9 @@ void dp_mon_filter_setup_rx_pkt_log_lite(struct dp_pdev *pdev);
/**
* dp_mon_filter_reset_rx_pkt_log_lite() - Reset the Rx pktlog lite mode filter
* @pdev: DP pdev handle
* @mon_pdev: Monitor pdev handle
*/
void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_pdev *pdev);
void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_mon_pdev *mon_pdev);
/**
* dp_mon_filter_setup_rx_pkt_log_cbf() - Setup the Rx pktlog cbf mode filter
@@ -270,14 +270,14 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev);
/**
* dp_mon_filter_dealloc() - Deallocate the filter objects to be stored in
* the radio object.
* @pdev: DP pdev handle
* @mon_pdev: monitor pdev handle
*/
void dp_mon_filter_dealloc(struct dp_pdev *pdev);
void dp_mon_filter_dealloc(struct dp_mon_pdev *mon_pdev);
/**
* dp_mon_filter_alloc() - Allocate the filter objects to be stored in
* the radio object.
* @pdev: DP pdev handle
* @mon_pdev: monitor pdev handle
*/
struct dp_mon_filter **dp_mon_filter_alloc(struct dp_pdev *pdev);
struct dp_mon_filter **dp_mon_filter_alloc(struct dp_mon_pdev *mon_pdev);
#endif /* #ifndef _DP_MON_FILTER_H_ */

View File

@@ -43,9 +43,10 @@ static inline void
dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev,
qdf_nbuf_t mon_mpdu)
{
struct hal_rx_ppdu_info *ppdu_info = &pdev->ppdu_info;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
struct hal_rx_ppdu_info *ppdu_info = &mon_pdev->ppdu_info;
if (pdev->tx_capture_enabled
if (mon_pdev->tx_capture_enabled
== CDP_TX_ENH_CAPTURE_DISABLED)
return;
@@ -59,9 +60,11 @@ dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev,
static void
dp_tx_capture_get_user_id(struct dp_pdev *dp_pdev, void *rx_desc_tlv)
{
if (dp_pdev->tx_capture_enabled
struct dp_mon_pdev *mon_pdev = dp_pdev->monitor_pdev;
if (mon_pdev->tx_capture_enabled
!= CDP_TX_ENH_CAPTURE_DISABLED)
dp_pdev->ppdu_info.rx_info.user_id =
mon_pdev->ppdu_info.rx_info.user_id =
hal_rx_hw_desc_mpdu_user_id(dp_pdev->soc->hal_soc,
rx_desc_tlv);
}
@@ -191,12 +194,14 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
qdf_dma_addr_t buf_paddr = 0;
uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS];
struct cdp_mon_status *rs;
struct dp_mon_pdev *mon_pdev;
if (qdf_unlikely(!dp_pdev)) {
dp_rx_mon_dest_debug("%pK: pdev is null for mac_id = %d", soc, mac_id);
return rx_bufs_used;
}
mon_pdev = dp_pdev->monitor_pdev;
msdu = 0;
last = NULL;
@@ -204,7 +209,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
hal_rx_reo_ent_buf_paddr_get(soc->hal_soc, rxdma_dst_ring_desc,
&buf_info, &msdu_cnt);
rs = &dp_pdev->rx_mon_recv_status;
rs = &mon_pdev->rx_mon_recv_status;
rs->cdp_rs_rxdma_err = false;
if ((hal_rx_reo_ent_rxdma_push_reason_get(rxdma_dst_ring_desc) ==
HAL_RX_WBM_RXDMA_PSH_RSN_ERROR)) {
@@ -214,11 +219,11 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
if (qdf_unlikely((rxdma_err == HAL_RXDMA_ERR_FLUSH_REQUEST) ||
(rxdma_err == HAL_RXDMA_ERR_MPDU_LENGTH) ||
(rxdma_err == HAL_RXDMA_ERR_OVERFLOW) ||
(rxdma_err == HAL_RXDMA_ERR_FCS && dp_pdev->mcopy_mode) ||
(rxdma_err == HAL_RXDMA_ERR_FCS && mon_pdev->mcopy_mode) ||
(rxdma_err == HAL_RXDMA_ERR_FCS &&
dp_pdev->rx_pktlog_cbf))) {
mon_pdev->rx_pktlog_cbf))) {
drop_mpdu = true;
dp_pdev->rx_mon_stats.dest_mpdu_drop++;
mon_pdev->rx_mon_stats.dest_mpdu_drop++;
}
rs->cdp_rs_rxdma_err = true;
}
@@ -228,9 +233,9 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
do {
/* WAR for duplicate link descriptors received from HW */
if (qdf_unlikely(dp_pdev->mon_last_linkdesc_paddr ==
if (qdf_unlikely(mon_pdev->mon_last_linkdesc_paddr ==
buf_info.paddr)) {
dp_pdev->rx_mon_stats.dup_mon_linkdesc_cnt++;
mon_pdev->rx_mon_stats.dup_mon_linkdesc_cnt++;
return rx_bufs_used;
}
@@ -257,7 +262,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
buf_paddr = dp_rx_mon_get_paddr_from_desc(rx_desc);
/* WAR for duplicate buffers received from HW */
if (qdf_unlikely(dp_pdev->mon_last_buf_cookie ==
if (qdf_unlikely(mon_pdev->mon_last_buf_cookie ==
msdu_list.sw_cookie[i] ||
DP_RX_MON_IS_BUFFER_ADDR_NULL(rx_desc) ||
msdu_list.paddr[i] != buf_paddr ||
@@ -266,8 +271,8 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
* buffers in this MPDU
*/
drop_mpdu = true;
dp_pdev->rx_mon_stats.dup_mon_buf_cnt++;
dp_pdev->mon_last_linkdesc_paddr =
mon_pdev->rx_mon_stats.dup_mon_buf_cnt++;
mon_pdev->mon_last_linkdesc_paddr =
buf_info.paddr;
continue;
}
@@ -285,13 +290,13 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
rx_desc->pool_id)) {
drop_mpdu = true;
msdu = NULL;
dp_pdev->mon_last_linkdesc_paddr =
mon_pdev->mon_last_linkdesc_paddr =
buf_info.paddr;
goto next_msdu;
}
if (drop_mpdu) {
dp_pdev->mon_last_linkdesc_paddr =
mon_pdev->mon_last_linkdesc_paddr =
buf_info.paddr;
dp_rx_mon_buffer_free(rx_desc);
msdu = NULL;
@@ -311,7 +316,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
drop_mpdu = true;
dp_rx_mon_buffer_free(rx_desc);
msdu = NULL;
dp_pdev->mon_last_linkdesc_paddr =
mon_pdev->mon_last_linkdesc_paddr =
buf_info.paddr;
goto next_msdu;
}
@@ -346,12 +351,12 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
rx_desc_tlv);
if (*ppdu_id == msdu_ppdu_id)
dp_pdev->rx_mon_stats.ppdu_id_match++;
mon_pdev->rx_mon_stats.ppdu_id_match++;
else
dp_pdev->rx_mon_stats.ppdu_id_mismatch
mon_pdev->rx_mon_stats.ppdu_id_mismatch
++;
dp_pdev->mon_last_linkdesc_paddr =
mon_pdev->mon_last_linkdesc_paddr =
buf_info.paddr;
if (dp_rx_mon_alloc_parent_buffer(head_msdu)
@@ -370,7 +375,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
rx_desc_tlv))
hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc,
rx_desc_tlv,
&(dp_pdev->ppdu_info.rx_status));
&mon_pdev->ppdu_info.rx_status);
dp_rx_mon_parse_desc_buffer(soc,
&(msdu_list.msdu_info[i]),
@@ -430,7 +435,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
}
next_msdu:
dp_pdev->mon_last_buf_cookie = msdu_list.sw_cookie[i];
mon_pdev->mon_last_buf_cookie = msdu_list.sw_cookie[i];
rx_bufs_used++;
dp_rx_add_to_free_desc_list(head,
tail, rx_desc);
@@ -551,11 +556,14 @@ qdf_nbuf_t dp_rx_mon_frag_restitch_mpdu_from_msdus(struct dp_soc *soc,
uint32_t pad_byte_pholder = 0;
qdf_nbuf_t msdu_curr;
uint16_t rx_mon_tlv_size = soc->rx_mon_pkt_tlv_size;
struct dp_mon_pdev *mon_pdev;
if (qdf_unlikely(!dp_pdev)) {
dp_rx_mon_dest_debug("%pK: pdev is null for mac_id = %d", soc, mac_id);
return NULL;
}
mon_pdev = dp_pdev->monitor_pdev;
qdf_mem_zero(&buf_info, sizeof(struct hal_rx_mon_dest_buf_info));
if (!head_msdu || !tail_msdu)
@@ -576,7 +584,7 @@ qdf_nbuf_t dp_rx_mon_frag_restitch_mpdu_from_msdus(struct dp_soc *soc,
rx_mon_tlv_size;
rx_status->cdp_rs_fcs_err = hal_rx_tlv_mpdu_fcs_err_get(soc->hal_soc,
rx_desc);
dp_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err;
mon_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err;
rx_desc = qdf_nbuf_get_frag_addr(head_msdu, 0) - rx_mon_tlv_size;
hal_rx_priv_info_get_from_tlv(soc->hal_soc, rx_desc,
@@ -936,6 +944,7 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc,
struct ieee80211_frame *wh;
struct ieee80211_qoscntl *qos;
struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
struct dp_mon_pdev *mon_pdev;
head_frag_list = NULL;
mpdu_buf = NULL;
@@ -945,6 +954,8 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc,
return NULL;
}
mon_pdev = dp_pdev->monitor_pdev;
/* The nbuf has been pulled just beyond the status and points to the
* payload
*/
@@ -966,7 +977,7 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc,
rx_status->cdp_rs_fcs_err = hal_rx_tlv_mpdu_fcs_err_get(soc->hal_soc,
rx_desc);
dp_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err;
mon_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err;
/* Fill out the rx_status from the PPDU start and end fields */
/* HAL_RX_GET_PPDU_STATUS(soc, mac_id, rx_status); */
@@ -1307,6 +1318,7 @@ static inline QDF_STATUS dp_send_mgmt_packet_to_stack(struct dp_soc *soc,
uint32_t *nbuf_data;
struct ieee80211_frame *wh;
qdf_frag_t addr;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
if (!nbuf)
return QDF_STATUS_E_INVAL;
@@ -1335,7 +1347,7 @@ static inline QDF_STATUS dp_send_mgmt_packet_to_stack(struct dp_soc *soc,
qdf_nbuf_free(nbuf);
return QDF_STATUS_E_INVAL;
}
*nbuf_data = pdev->ppdu_info.com_info.ppdu_id;
*nbuf_data = mon_pdev->ppdu_info.com_info.ppdu_id;
dp_wdi_event_handler(WDI_EVENT_RX_MGMT_CTRL, soc, nbuf,
HTT_INVALID_PEER,
@@ -1443,11 +1455,14 @@ static QDF_STATUS dp_rx_mon_process_dest_pktlog(struct dp_soc *soc,
void *data;
struct ieee80211_frame *wh;
uint8_t type, subtype;
struct dp_mon_pdev *mon_pdev;
if (!pdev)
return QDF_STATUS_E_INVAL;
if (pdev->rx_pktlog_cbf) {
mon_pdev = pdev->monitor_pdev;
if (mon_pdev->rx_pktlog_cbf) {
if (qdf_nbuf_get_nr_frags(mpdu))
data = qdf_nbuf_get_frag_addr(mpdu, 0);
else
@@ -1465,7 +1480,7 @@ static QDF_STATUS dp_rx_mon_process_dest_pktlog(struct dp_soc *soc,
subtype = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
if (type == IEEE80211_FC0_TYPE_MGT &&
subtype == IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK) {
msdu_timestamp = pdev->ppdu_info.rx_status.tsft;
msdu_timestamp = mon_pdev->ppdu_info.rx_status.tsft;
dp_rx_populate_cbf_hdr(soc,
mac_id, event,
mpdu,
@@ -1488,16 +1503,22 @@ QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id,
qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu)
{
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
struct cdp_mon_status *rs = &pdev->rx_mon_recv_status;
struct cdp_mon_status *rs;
qdf_nbuf_t mon_skb, skb_next;
qdf_nbuf_t mon_mpdu = NULL;
struct dp_vdev *vdev;
struct dp_mon_vdev *mon_vdev;
struct dp_mon_pdev *mon_pdev;
if (!pdev || (!pdev->monitor_vdev && !pdev->mcopy_mode &&
!pdev->rx_pktlog_cbf))
if (!pdev)
goto mon_deliver_fail;
mon_pdev = pdev->monitor_pdev;
rs = &mon_pdev->rx_mon_recv_status;
if (!mon_pdev->mvdev && !mon_pdev->mcopy_mode &&
!mon_pdev->rx_pktlog_cbf)
goto mon_deliver_fail;
vdev = pdev->monitor_vdev;
/* restitch mon MPDU for delivery via monitor interface */
mon_mpdu = dp_rx_mon_restitch_mpdu(soc, mac_id, head_msdu,
tail_msdu, rs);
@@ -1513,22 +1534,26 @@ QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id,
/* monitor vap cannot be present when mcopy is enabled
* hence same skb can be consumed
*/
if (pdev->mcopy_mode)
if (mon_pdev->mcopy_mode)
return dp_send_mgmt_packet_to_stack(soc, mon_mpdu, pdev);
if (mon_mpdu && pdev->monitor_vdev && pdev->monitor_vdev->osif_vdev &&
vdev->monitor_vdev->osif_rx_mon) {
pdev->ppdu_info.rx_status.ppdu_id =
pdev->ppdu_info.com_info.ppdu_id;
pdev->ppdu_info.rx_status.device_id = soc->device_id;
pdev->ppdu_info.rx_status.chan_noise_floor =
if (mon_mpdu && mon_pdev->mvdev &&
mon_pdev->mvdev->osif_vdev &&
mon_pdev->mvdev->monitor_vdev &&
mon_pdev->mvdev->monitor_vdev->osif_rx_mon) {
mon_vdev = mon_pdev->mvdev->monitor_vdev;
mon_pdev->ppdu_info.rx_status.ppdu_id =
mon_pdev->ppdu_info.com_info.ppdu_id;
mon_pdev->ppdu_info.rx_status.device_id = soc->device_id;
mon_pdev->ppdu_info.rx_status.chan_noise_floor =
pdev->chan_noise_floor;
/* convert rssi_comb from dBm to positive dB value */
dp_rx_mon_rssi_convert(&pdev->ppdu_info.rx_status);
dp_rx_mon_rssi_convert(&mon_pdev->ppdu_info.rx_status);
dp_handle_tx_capture(soc, pdev, mon_mpdu);
if (!qdf_nbuf_update_radiotap(&pdev->ppdu_info.rx_status,
if (!qdf_nbuf_update_radiotap(&mon_pdev->ppdu_info.rx_status,
mon_mpdu,
qdf_nbuf_headroom(mon_mpdu))) {
DP_STATS_INC(pdev, dropped.mon_radiotap_update_err, 1);
@@ -1536,13 +1561,14 @@ QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id,
}
dp_rx_mon_update_pf_tag_to_buf_headroom(soc, mon_mpdu);
vdev->monitor_vdev->osif_rx_mon(pdev->monitor_vdev->osif_vdev,
mon_vdev->osif_rx_mon(mon_pdev->mvdev->osif_vdev,
mon_mpdu,
&pdev->ppdu_info.rx_status);
&mon_pdev->ppdu_info.rx_status);
} else {
dp_rx_mon_dest_debug("%pK: mon_mpdu=%pK monitor_vdev %pK osif_vdev %pK"
, soc, mon_mpdu, pdev->monitor_vdev,
(pdev->monitor_vdev ? pdev->monitor_vdev->osif_vdev
, soc, mon_mpdu, mon_pdev->mvdev,
(mon_pdev->mvdev ? mon_pdev->mvdev->osif_vdev
: NULL));
goto mon_deliver_fail;
}
@@ -1579,19 +1605,23 @@ QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc,
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
ol_txrx_rx_mon_fp osif_rx_mon;
qdf_nbuf_t dummy_msdu;
struct dp_vdev *vdev;
struct dp_mon_pdev *mon_pdev;
struct dp_mon_vdev *mon_vdev;
/* Sanity checking */
if (!pdev || !pdev->monitor_vdev)
if (!pdev || !pdev->monitor_pdev)
goto mon_deliver_non_std_fail;
vdev = pdev->monitor_vdev;
mon_pdev = pdev->monitor_pdev;
if (!vdev->monitor_vdev->osif_rx_mon)
if (!mon_pdev->mvdev || !mon_pdev->mvdev ||
!mon_pdev->mvdev->monitor_vdev ||
!mon_pdev->mvdev->monitor_vdev->osif_rx_mon)
goto mon_deliver_non_std_fail;
mon_vdev = mon_pdev->mvdev->monitor_vdev;
/* Generate a dummy skb_buff */
osif_rx_mon = vdev->monitor_vdev->osif_rx_mon;
osif_rx_mon = mon_vdev->osif_rx_mon;
dummy_msdu = qdf_nbuf_alloc(soc->osdev, MAX_MONITOR_HEADER,
MAX_MONITOR_HEADER, 4, FALSE);
if (!dummy_msdu)
@@ -1600,11 +1630,12 @@ QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc,
qdf_nbuf_set_pktlen(dummy_msdu, 0);
qdf_nbuf_set_next(dummy_msdu, NULL);
pdev->ppdu_info.rx_status.ppdu_id =
pdev->ppdu_info.com_info.ppdu_id;
mon_pdev->ppdu_info.rx_status.ppdu_id =
mon_pdev->ppdu_info.com_info.ppdu_id;
/* Apply the radio header to this dummy skb */
if (!qdf_nbuf_update_radiotap(&pdev->ppdu_info.rx_status, dummy_msdu,
if (!qdf_nbuf_update_radiotap(&mon_pdev->ppdu_info.rx_status,
dummy_msdu,
qdf_nbuf_headroom(dummy_msdu))) {
DP_STATS_INC(pdev, dropped.mon_radiotap_update_err, 1);
qdf_nbuf_free(dummy_msdu);
@@ -1612,13 +1643,13 @@ QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc,
}
/* deliver to the user layer application */
osif_rx_mon(pdev->monitor_vdev->osif_vdev,
osif_rx_mon(mon_pdev->mvdev->osif_vdev,
dummy_msdu, NULL);
/* Clear rx_status*/
qdf_mem_zero(&pdev->ppdu_info.rx_status,
sizeof(pdev->ppdu_info.rx_status));
pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
qdf_mem_zero(&mon_pdev->ppdu_info.rx_status,
sizeof(mon_pdev->ppdu_info.rx_status));
mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
return QDF_STATUS_SUCCESS;
@@ -1645,12 +1676,14 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx,
uint32_t mpdu_rx_bufs_used;
int mac_for_pdev = mac_id;
struct cdp_pdev_mon_stats *rx_mon_stats;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_rx_mon_dest_debug("%pK: pdev is null for mac_id = %d", soc, mac_id);
return;
}
mon_pdev = pdev->monitor_pdev;
mon_dst_srng = dp_rxdma_get_mon_dst_ring(pdev, mac_for_pdev);
if (!mon_dst_srng || !hal_srng_initialized(mon_dst_srng)) {
@@ -1663,7 +1696,7 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx,
qdf_assert((hal_soc && pdev));
qdf_spin_lock_bh(&pdev->mon_lock);
qdf_spin_lock_bh(&mon_pdev->mon_lock);
if (qdf_unlikely(dp_srng_access_start(int_ctx, soc, mon_dst_srng))) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
@@ -1674,9 +1707,9 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx,
}
pdev_id = pdev->pdev_id;
ppdu_id = pdev->ppdu_info.com_info.ppdu_id;
ppdu_id = mon_pdev->ppdu_info.com_info.ppdu_id;
rx_bufs_used = 0;
rx_mon_stats = &pdev->rx_mon_stats;
rx_mon_stats = &mon_pdev->rx_mon_stats;
while (qdf_likely(rxdma_dst_ring_desc =
hal_srng_dst_peek(hal_soc, mon_dst_srng))) {
@@ -1695,34 +1728,35 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx,
rx_bufs_used += mpdu_rx_bufs_used;
if (mpdu_rx_bufs_used)
pdev->mon_dest_ring_stuck_cnt = 0;
mon_pdev->mon_dest_ring_stuck_cnt = 0;
else
pdev->mon_dest_ring_stuck_cnt++;
mon_pdev->mon_dest_ring_stuck_cnt++;
if (pdev->mon_dest_ring_stuck_cnt >
if (mon_pdev->mon_dest_ring_stuck_cnt >
MON_DEST_RING_STUCK_MAX_CNT) {
dp_info("destination ring stuck");
dp_info("ppdu_id status=%d dest=%d",
pdev->ppdu_info.com_info.ppdu_id, ppdu_id);
mon_pdev->ppdu_info.com_info.ppdu_id, ppdu_id);
rx_mon_stats->mon_rx_dest_stuck++;
pdev->ppdu_info.com_info.ppdu_id = ppdu_id;
mon_pdev->ppdu_info.com_info.ppdu_id = ppdu_id;
continue;
}
if (ppdu_id != pdev->ppdu_info.com_info.ppdu_id) {
if (ppdu_id != mon_pdev->ppdu_info.com_info.ppdu_id) {
rx_mon_stats->stat_ring_ppdu_id_hist[
rx_mon_stats->ppdu_id_hist_idx] =
pdev->ppdu_info.com_info.ppdu_id;
mon_pdev->ppdu_info.com_info.ppdu_id;
rx_mon_stats->dest_ring_ppdu_id_hist[
rx_mon_stats->ppdu_id_hist_idx] = ppdu_id;
rx_mon_stats->ppdu_id_hist_idx =
(rx_mon_stats->ppdu_id_hist_idx + 1) &
(MAX_PPDU_ID_HIST - 1);
pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
qdf_mem_zero(&(pdev->ppdu_info.rx_status),
sizeof(pdev->ppdu_info.rx_status));
mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
qdf_mem_zero(&mon_pdev->ppdu_info.rx_status,
sizeof(mon_pdev->ppdu_info.rx_status));
dp_rx_mon_dest_debug("%pK: ppdu_id %x != ppdu_info.com_info.ppdu_id %x",
soc, ppdu_id, pdev->ppdu_info.com_info.ppdu_id);
soc, ppdu_id,
mon_pdev->ppdu_info.com_info.ppdu_id);
break;
}
@@ -1737,7 +1771,7 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx,
dp_srng_access_end(int_ctx, soc, mon_dst_srng);
qdf_spin_unlock_bh(&pdev->mon_lock);
qdf_spin_unlock_bh(&mon_pdev->mon_lock);
if (rx_bufs_used) {
rx_mon_stats->dest_ppdu_done++;
@@ -1844,6 +1878,7 @@ dp_rx_pdev_mon_buf_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id)
struct rx_desc_pool *rx_desc_pool;
uint32_t rx_desc_pool_size;
struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx = soc->wlan_cfg_ctx;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
mon_buf_ring = &soc->rxdma_mon_buf_ring[mac_id];
@@ -1869,9 +1904,9 @@ dp_rx_pdev_mon_buf_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id)
dp_rx_desc_pool_init(soc, mac_id, rx_desc_pool_size, rx_desc_pool);
pdev->mon_last_linkdesc_paddr = 0;
mon_pdev->mon_last_linkdesc_paddr = 0;
pdev->mon_last_buf_cookie = DP_RX_DESC_COOKIE_MAX + 1;
mon_pdev->mon_last_buf_cookie = DP_RX_DESC_COOKIE_MAX + 1;
/* Attach full monitor mode resources */
dp_full_mon_attach(pdev);
@@ -2084,7 +2119,7 @@ dp_rx_pdev_mon_desc_pool_init(struct dp_pdev *pdev)
int mac_id;
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++)
dp_rx_pdev_mon_cmn_desc_pool_init(pdev, mac_id);
qdf_spinlock_create(&pdev->mon_lock);
qdf_spinlock_create(&pdev->monitor_pdev->mon_lock);
}
void
@@ -2094,7 +2129,7 @@ dp_rx_pdev_mon_desc_pool_deinit(struct dp_pdev *pdev)
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++)
dp_rx_pdev_mon_cmn_desc_pool_deinit(pdev, mac_id);
qdf_spinlock_destroy(&pdev->mon_lock);
qdf_spinlock_destroy(&pdev->monitor_pdev->mon_lock);
}
void dp_rx_pdev_mon_desc_pool_free(struct dp_pdev *pdev)
@@ -2112,7 +2147,7 @@ dp_rx_pdev_mon_buffers_free(struct dp_pdev *pdev)
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++)
dp_rx_pdev_mon_cmn_buffers_free(pdev, mac_id);
pdev->pdev_mon_init = 0;
pdev->monitor_pdev->pdev_mon_init = 0;
}
QDF_STATUS
@@ -2154,6 +2189,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id)
uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS];
struct rx_desc_pool *rx_desc_pool;
uint32_t reap_cnt = 0;
struct dp_mon_pdev *mon_pdev;
if (qdf_unlikely(!soc || !soc->hal_soc))
return reap_cnt;
@@ -2164,11 +2200,12 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id)
return reap_cnt;
hal_soc = soc->hal_soc;
mon_pdev = pdev->monitor_pdev;
qdf_spin_lock_bh(&pdev->mon_lock);
qdf_spin_lock_bh(&mon_pdev->mon_lock);
if (qdf_unlikely(hal_srng_access_start(hal_soc, mon_dst_srng))) {
qdf_spin_unlock_bh(&pdev->mon_lock);
qdf_spin_unlock_bh(&mon_pdev->mon_lock);
return reap_cnt;
}
@@ -2186,7 +2223,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id)
buf_info, mac_id);
if (qdf_unlikely(!rx_msdu_link_desc)) {
pdev->rx_mon_stats.mon_link_desc_invalid++;
mon_pdev->rx_mon_stats.mon_link_desc_invalid++;
goto next_entry;
}
@@ -2201,7 +2238,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id)
msdu_list.sw_cookie[i]);
if (qdf_unlikely(!rx_desc)) {
pdev->rx_mon_stats.
mon_pdev->rx_mon_stats.
mon_rx_desc_invalid++;
continue;
}
@@ -2213,7 +2250,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id)
if (qdf_unlikely(!rx_desc->in_use || !nbuf ||
msdu_list.paddr[i] !=
buf_paddr)) {
pdev->rx_mon_stats.
mon_pdev->rx_mon_stats.
mon_nbuf_sanity_err++;
continue;
}
@@ -2263,7 +2300,7 @@ next_entry:
hal_srng_access_end(hal_soc, mon_dst_srng);
qdf_spin_unlock_bh(&pdev->mon_lock);
qdf_spin_unlock_bh(&mon_pdev->mon_lock);
if (rx_bufs_used) {
dp_rx_buffers_replenish(soc, mac_id,

View File

@@ -24,11 +24,11 @@
#include "qdf_trace.h"
#include "qdf_nbuf.h"
#include "hal_api_mon.h"
#include "dp_rx_mon.h"
#include "dp_internal.h"
#include "qdf_mem.h" /* qdf_mem_malloc,free */
#include "dp_htt.h"
#include "dp_mon.h"
#include "dp_rx_mon.h"
#include "htt.h"
@@ -83,6 +83,7 @@ dp_rx_mon_handle_status_buf_done(struct dp_pdev *pdev,
struct dp_rx_desc *rx_desc;
void *rx_tlv;
QDF_STATUS buf_status;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
hal_soc = soc->hal_soc;
@@ -117,11 +118,11 @@ dp_rx_mon_handle_status_buf_done(struct dp_pdev *pdev,
if (buf_status != QDF_STATUS_SUCCESS) {
dp_err_rl("Monitor status ring: DMA is not done "
"for nbuf: %pK", status_nbuf);
pdev->rx_mon_stats.tlv_tag_status_err++;
mon_pdev->rx_mon_stats.tlv_tag_status_err++;
return DP_MON_STATUS_NO_DMA;
}
pdev->rx_mon_stats.status_buf_done_war++;
mon_pdev->rx_mon_stats.status_buf_done_war++;
return DP_MON_STATUS_REPLENISH;
}
@@ -834,13 +835,15 @@ dp_rx_handle_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
uint16_t size = 0;
struct ieee80211_frame *wh;
uint32_t *nbuf_data;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
if (!ppdu_info->ppdu_msdu_info[fcs_ok_mpdu_cnt].first_msdu_payload)
return QDF_STATUS_SUCCESS;
/* For M_COPY mode only one msdu per ppdu is sent to upper layer*/
if (pdev->mcopy_mode == M_COPY) {
if (pdev->m_copy_id.rx_ppdu_id == ppdu_info->com_info.ppdu_id)
if (mon_pdev->mcopy_mode == M_COPY) {
if (mon_pdev->m_copy_id.rx_ppdu_id ==
ppdu_info->com_info.ppdu_id)
return QDF_STATUS_SUCCESS;
}
@@ -860,11 +863,11 @@ dp_rx_handle_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
}
nbuf_data = (uint32_t *)qdf_nbuf_data(nbuf);
*nbuf_data = pdev->ppdu_info.com_info.ppdu_id;
*nbuf_data = mon_pdev->ppdu_info.com_info.ppdu_id;
/* only retain RX MSDU payload in the skb */
qdf_nbuf_trim_tail(nbuf, qdf_nbuf_len(nbuf) - ppdu_info->ppdu_msdu_info[fcs_ok_mpdu_cnt].payload_len);
if (deliver_frame) {
pdev->m_copy_id.rx_ppdu_id = ppdu_info->com_info.ppdu_id;
mon_pdev->m_copy_id.rx_ppdu_id = ppdu_info->com_info.ppdu_id;
dp_wdi_event_handler(WDI_EVENT_RX_DATA, soc,
nbuf, HTT_INVALID_PEER,
WDI_NO_VAL, pdev->pdev_id);
@@ -899,19 +902,22 @@ dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev,
{
QDF_STATUS mcopy_status;
qdf_nbuf_t nbuf_clone = NULL;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
/* If the MPDU end tlv and RX header are received in different buffers,
* process the RX header based on fcs status.
*/
if (pdev->mcopy_status_nbuf) {
if (mon_pdev->mcopy_status_nbuf) {
/* For M_COPY mode only one msdu per ppdu is sent to upper layer*/
if (pdev->mcopy_mode == M_COPY) {
if (pdev->m_copy_id.rx_ppdu_id ==
if (mon_pdev->mcopy_mode == M_COPY) {
if (mon_pdev->m_copy_id.rx_ppdu_id ==
ppdu_info->com_info.ppdu_id)
goto end1;
}
if (ppdu_info->is_fcs_passed) {
nbuf_clone = qdf_nbuf_clone(pdev->mcopy_status_nbuf);
nbuf_clone =
qdf_nbuf_clone(mon_pdev->mcopy_status_nbuf);
if (!nbuf_clone) {
QDF_TRACE(QDF_MODULE_ID_TXRX,
QDF_TRACE_LEVEL_ERROR,
@@ -919,7 +925,8 @@ dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev,
goto end1;
}
pdev->m_copy_id.rx_ppdu_id = ppdu_info->com_info.ppdu_id;
mon_pdev->m_copy_id.rx_ppdu_id =
ppdu_info->com_info.ppdu_id;
dp_wdi_event_handler(WDI_EVENT_RX_DATA, soc,
nbuf_clone,
HTT_INVALID_PEER,
@@ -927,8 +934,8 @@ dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev,
ppdu_info->is_fcs_passed = false;
}
end1:
qdf_nbuf_free(pdev->mcopy_status_nbuf);
pdev->mcopy_status_nbuf = NULL;
qdf_nbuf_free(mon_pdev->mcopy_status_nbuf);
mon_pdev->mcopy_status_nbuf = NULL;
}
/* If the MPDU end tlv and RX header are received in different buffers,
@@ -938,17 +945,17 @@ end1:
*/
if ((ppdu_info->fcs_ok_cnt + ppdu_info->fcs_err_cnt) !=
ppdu_info->com_info.mpdu_cnt) {
pdev->mcopy_status_nbuf = qdf_nbuf_clone(status_nbuf);
if (pdev->mcopy_status_nbuf) {
mcopy_status = dp_rx_handle_mcopy_mode(
soc, pdev,
mon_pdev->mcopy_status_nbuf = qdf_nbuf_clone(status_nbuf);
if (mon_pdev->mcopy_status_nbuf) {
mcopy_status =
dp_rx_handle_mcopy_mode(soc, pdev,
ppdu_info,
pdev->mcopy_status_nbuf,
mon_pdev->mcopy_status_nbuf,
ppdu_info->fcs_ok_cnt,
false);
if (mcopy_status == QDF_STATUS_SUCCESS) {
qdf_nbuf_free(pdev->mcopy_status_nbuf);
pdev->mcopy_status_nbuf = NULL;
qdf_nbuf_free(mon_pdev->mcopy_status_nbuf);
mon_pdev->mcopy_status_nbuf = NULL;
}
}
}
@@ -975,7 +982,9 @@ dp_rx_mcopy_process_ppdu_info(struct dp_pdev *pdev,
struct hal_rx_ppdu_info *ppdu_info,
uint32_t tlv_status)
{
if (!pdev->mcopy_mode)
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
if (!mon_pdev->mcopy_mode)
return;
/* The fcs status is received in MPDU end tlv. If the RX header
@@ -1025,6 +1034,7 @@ dp_rx_process_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
QDF_STATUS mcopy_status;
qdf_nbuf_t nbuf_clone = NULL;
uint8_t fcs_ok_mpdu_cnt = 0;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
dp_rx_mcopy_handle_last_mpdu(soc, pdev, ppdu_info, status_nbuf);
@@ -1035,7 +1045,7 @@ dp_rx_process_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
goto end;
/* For M_COPY mode only one msdu per ppdu is sent to upper layer*/
if (pdev->mcopy_mode == M_COPY)
if (mon_pdev->mcopy_mode == M_COPY)
ppdu_info->fcs_ok_cnt = 1;
while (fcs_ok_mpdu_cnt < ppdu_info->fcs_ok_cnt) {
@@ -1092,16 +1102,17 @@ dp_rx_handle_smart_mesh_mode(struct dp_soc *soc, struct dp_pdev *pdev,
qdf_nbuf_t nbuf)
{
uint8_t size = 0;
struct dp_vdev *vdev;
struct dp_mon_vdev *mon_vdev;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
if (!pdev->monitor_vdev) {
if (!mon_pdev->mvdev) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
"[%s]:[%d] Monitor vdev is NULL !!",
__func__, __LINE__);
return 1;
}
vdev = pdev->monitor_vdev;
mon_vdev = mon_pdev->mvdev->monitor_vdev;
if (!ppdu_info->msdu_info.first_msdu_payload) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
@@ -1125,15 +1136,15 @@ dp_rx_handle_smart_mesh_mode(struct dp_soc *soc, struct dp_pdev *pdev,
/* Only retain RX MSDU payload in the skb */
qdf_nbuf_trim_tail(nbuf, qdf_nbuf_len(nbuf) -
ppdu_info->msdu_info.payload_len);
if (!qdf_nbuf_update_radiotap(&pdev->ppdu_info.rx_status, nbuf,
if (!qdf_nbuf_update_radiotap(&mon_pdev->ppdu_info.rx_status, nbuf,
qdf_nbuf_headroom(nbuf))) {
DP_STATS_INC(pdev, dropped.mon_radiotap_update_err, 1);
return 1;
}
vdev->monitor_vdev->osif_rx_mon(pdev->monitor_vdev->osif_vdev,
mon_vdev->osif_rx_mon(mon_pdev->mvdev->osif_vdev,
nbuf, NULL);
pdev->ppdu_info.rx_status.monitor_direct_used = 0;
mon_pdev->ppdu_info.rx_status.monitor_direct_used = 0;
return 0;
}
@@ -1488,6 +1499,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
{
qdf_nbuf_t ppdu_nbuf;
struct cdp_rx_indication_ppdu *cdp_rx_ppdu;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
/*
* Do not allocate if fcs error,
@@ -1504,9 +1516,9 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
struct dp_neighbour_peer *peer = NULL;
uint8_t rssi = ppdu_info->rx_status.rssi_comb;
qdf_spin_lock_bh(&pdev->neighbour_peer_mutex);
if (pdev->neighbour_peers_added) {
TAILQ_FOREACH(peer, &pdev->neighbour_peers_list,
qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex);
if (mon_pdev->neighbour_peers_added) {
TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list,
neighbour_peer_list_elem) {
if (!qdf_mem_cmp(&peer->neighbour_peers_macaddr,
&ppdu_info->nac_info.mac_addr2,
@@ -1516,7 +1528,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
}
}
}
qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex);
qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex);
} else {
dp_info("Neighbour peers RSSI update failed! fc_valid = %d, to_ds_flag = %d and mac_addr2_valid = %d",
ppdu_info->nac_info.fc_valid,
@@ -1527,7 +1539,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
/* need not generate wdi event when mcopy, cfr rcc mode and
* enhanced stats are not enabled
*/
if (!pdev->mcopy_mode && !pdev->enhanced_stats_en &&
if (!mon_pdev->mcopy_mode && !mon_pdev->enhanced_stats_en &&
!dp_cfr_rcc_mode_status(pdev))
return;
@@ -1536,7 +1548,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
if (!ppdu_info->rx_status.frame_control_info_valid ||
(ppdu_info->rx_status.ast_index == HAL_AST_IDX_INVALID)) {
if (!(pdev->mcopy_mode ||
if (!(mon_pdev->mcopy_mode ||
(dp_bb_captured_chan_status(pdev, ppdu_info) ==
QDF_STATUS_SUCCESS)))
return;
@@ -1563,7 +1575,8 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
soc, ppdu_nbuf,
cdp_rx_ppdu->peer_id,
WDI_NO_VAL, pdev->pdev_id);
} else if (pdev->mcopy_mode || dp_cfr_rcc_mode_status(pdev)) {
} else if (mon_pdev->mcopy_mode ||
dp_cfr_rcc_mode_status(pdev)) {
dp_wdi_event_handler(WDI_EVENT_RX_PPDU_DESC, soc,
ppdu_nbuf, HTT_INVALID_PEER,
WDI_NO_VAL, pdev->pdev_id);
@@ -1742,6 +1755,8 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
enum WDI_EVENT pktlog_mode = WDI_NO_VAL;
bool nbuf_used;
uint32_t rx_enh_capture_mode;
struct dp_mon_soc *mon_soc = soc->monitor_soc;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_rx_mon_status_debug("%pK: pdev is null for mac_id = %d", soc,
@@ -1749,24 +1764,25 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
return;
}
ppdu_info = &pdev->ppdu_info;
rx_mon_stats = &pdev->rx_mon_stats;
mon_pdev = pdev->monitor_pdev;
ppdu_info = &mon_pdev->ppdu_info;
rx_mon_stats = &mon_pdev->rx_mon_stats;
if (pdev->mon_ppdu_status != DP_PPDU_STATUS_START)
if (mon_pdev->mon_ppdu_status != DP_PPDU_STATUS_START)
return;
rx_enh_capture_mode = pdev->rx_enh_capture_mode;
rx_enh_capture_mode = mon_pdev->rx_enh_capture_mode;
while (!qdf_nbuf_is_queue_empty(&pdev->rx_status_q)) {
while (!qdf_nbuf_is_queue_empty(&mon_pdev->rx_status_q)) {
status_nbuf = qdf_nbuf_queue_remove(&pdev->rx_status_q);
status_nbuf = qdf_nbuf_queue_remove(&mon_pdev->rx_status_q);
rx_tlv = qdf_nbuf_data(status_nbuf);
rx_tlv_start = rx_tlv;
nbuf_used = false;
if ((pdev->monitor_vdev) || (pdev->enhanced_stats_en) ||
(pdev->mcopy_mode) || (dp_cfr_rcc_mode_status(pdev)) ||
if ((mon_pdev->mvdev) || (mon_pdev->enhanced_stats_en) ||
(mon_pdev->mcopy_mode) || (dp_cfr_rcc_mode_status(pdev)) ||
(rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED)) {
do {
tlv_status = hal_rx_status_get_tlv_info(rx_tlv,
@@ -1795,14 +1811,14 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
(tlv_status == HAL_TLV_STATUS_MPDU_END) ||
(tlv_status == HAL_TLV_STATUS_MSDU_END));
}
if (pdev->dp_peer_based_pktlog) {
if (mon_pdev->dp_peer_based_pktlog) {
dp_rx_process_peer_based_pktlog(soc, ppdu_info,
status_nbuf,
pdev->pdev_id);
} else {
if (pdev->rx_pktlog_mode == DP_RX_PKTLOG_FULL)
if (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_FULL)
pktlog_mode = WDI_EVENT_RX_DESC;
else if (pdev->rx_pktlog_mode == DP_RX_PKTLOG_LITE)
else if (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_LITE)
pktlog_mode = WDI_EVENT_LITE_RX;
if (pktlog_mode != WDI_NO_VAL)
@@ -1813,13 +1829,14 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
}
/* smart monitor vap and m_copy cannot co-exist */
if (ppdu_info->rx_status.monitor_direct_used && pdev->neighbour_peers_added
&& pdev->monitor_vdev) {
if (ppdu_info->rx_status.monitor_direct_used &&
mon_pdev->neighbour_peers_added &&
mon_pdev->mvdev) {
smart_mesh_status = dp_rx_handle_smart_mesh_mode(soc,
pdev, ppdu_info, status_nbuf);
if (smart_mesh_status)
qdf_nbuf_free(status_nbuf);
} else if (qdf_unlikely(pdev->mcopy_mode)) {
} else if (qdf_unlikely(mon_pdev->mcopy_mode)) {
dp_rx_process_mcopy_mode(soc, pdev,
ppdu_info, tlv_status,
status_nbuf);
@@ -1841,39 +1858,41 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
rx_mon_stats->status_ppdu_done++;
dp_rx_mon_handle_mu_ul_info(ppdu_info);
if (pdev->tx_capture_enabled
if (mon_pdev->tx_capture_enabled
!= CDP_TX_ENH_CAPTURE_DISABLED)
dp_send_ack_frame_to_stack(soc, pdev,
ppdu_info);
if (pdev->enhanced_stats_en ||
pdev->mcopy_mode || pdev->neighbour_peers_added)
if (mon_pdev->enhanced_stats_en ||
mon_pdev->mcopy_mode ||
mon_pdev->neighbour_peers_added)
dp_rx_handle_ppdu_stats(soc, pdev, ppdu_info);
else if (dp_cfr_rcc_mode_status(pdev))
dp_rx_handle_cfr(soc, pdev, ppdu_info);
pdev->mon_ppdu_status = DP_PPDU_STATUS_DONE;
mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_DONE;
/*
* if chan_num is not fetched correctly from ppdu RX TLV,
* get it from pdev saved.
*/
if (qdf_unlikely(pdev->ppdu_info.rx_status.chan_num == 0))
pdev->ppdu_info.rx_status.chan_num = pdev->mon_chan_num;
if (qdf_unlikely(mon_pdev->ppdu_info.rx_status.chan_num == 0))
mon_pdev->ppdu_info.rx_status.chan_num =
mon_pdev->mon_chan_num;
/*
* if chan_freq is not fetched correctly from ppdu RX TLV,
* get it from pdev saved.
*/
if (qdf_unlikely(pdev->ppdu_info.rx_status.chan_freq == 0)) {
pdev->ppdu_info.rx_status.chan_freq =
pdev->mon_chan_freq;
if (qdf_unlikely(mon_pdev->ppdu_info.rx_status.chan_freq == 0)) {
mon_pdev->ppdu_info.rx_status.chan_freq =
mon_pdev->mon_chan_freq;
}
if (!soc->full_mon_mode)
if (!mon_soc->full_mon_mode)
dp_rx_mon_dest_process(soc, int_ctx, mac_id,
quota);
pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
}
}
return;
@@ -1960,6 +1979,7 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx,
QDF_STATUS status;
enum dp_mon_reap_status reap_status;
uint32_t work_done = 0;
struct dp_mon_pdev *mon_pdev;
if (!pdev) {
dp_rx_mon_status_debug("%pK: pdev is null for mac_id = %d",
@@ -1967,6 +1987,8 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx,
return work_done;
}
mon_pdev = pdev->monitor_pdev;
mon_status_srng = soc->rxdma_mon_status_ring[mac_id].hal_srng;
qdf_assert(mon_status_srng);
@@ -2074,7 +2096,7 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx,
}
/* Put the status_nbuf to queue */
qdf_nbuf_queue_add(&pdev->rx_status_q, status_nbuf);
qdf_nbuf_queue_add(&mon_pdev->rx_status_q, status_nbuf);
} else {
union dp_rx_desc_list_elem_t *desc_list = NULL;
@@ -2169,7 +2191,9 @@ uint32_t
dp_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx,
uint32_t mac_id, uint32_t quota)
{
if (qdf_unlikely(soc->full_mon_mode))
struct dp_mon_soc *mon_soc = soc->monitor_soc;
if (qdf_unlikely(mon_soc->full_mon_mode))
return dp_rx_mon_process(soc, int_ctx, mac_id, quota);
return dp_rx_mon_status_process(soc, int_ctx, mac_id, quota);
@@ -2244,6 +2268,7 @@ dp_rx_pdev_mon_status_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id)
uint32_t num_entries;
struct rx_desc_pool *rx_desc_pool;
struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
soc_cfg_ctx = soc->wlan_cfg_ctx;
mon_status_ring = &soc->rxdma_mon_status_ring[mac_id];
@@ -2263,31 +2288,32 @@ dp_rx_pdev_mon_status_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id)
dp_rx_desc_pool_init(soc, mac_id, num_entries + 1, rx_desc_pool);
qdf_nbuf_queue_init(&pdev->rx_status_q);
qdf_nbuf_queue_init(&mon_pdev->rx_status_q);
pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
qdf_mem_zero(&pdev->ppdu_info, sizeof(pdev->ppdu_info));
qdf_mem_zero(&mon_pdev->ppdu_info, sizeof(mon_pdev->ppdu_info));
/*
* Set last_ppdu_id to HAL_INVALID_PPDU_ID in order to avoid ppdu_id
* match with '0' ppdu_id from monitor status ring
*/
pdev->ppdu_info.com_info.last_ppdu_id = HAL_INVALID_PPDU_ID;
mon_pdev->ppdu_info.com_info.last_ppdu_id = HAL_INVALID_PPDU_ID;
qdf_mem_zero(&pdev->rx_mon_stats, sizeof(pdev->rx_mon_stats));
qdf_mem_zero(&mon_pdev->rx_mon_stats, sizeof(mon_pdev->rx_mon_stats));
dp_rx_mon_init_dbg_ppdu_stats(&pdev->ppdu_info,
&pdev->rx_mon_stats);
dp_rx_mon_init_dbg_ppdu_stats(&mon_pdev->ppdu_info,
&mon_pdev->rx_mon_stats);
for (i = 0; i < MAX_MU_USERS; i++) {
qdf_nbuf_queue_init(&pdev->mpdu_q[i]);
pdev->is_mpdu_hdr[i] = true;
qdf_nbuf_queue_init(&mon_pdev->mpdu_q[i]);
mon_pdev->is_mpdu_hdr[i] = true;
}
qdf_mem_zero(pdev->msdu_list, sizeof(pdev->msdu_list[MAX_MU_USERS]));
qdf_mem_zero(mon_pdev->msdu_list,
sizeof(mon_pdev->msdu_list[MAX_MU_USERS]));
pdev->rx_enh_capture_mode = CDP_RX_ENH_CAPTURE_DISABLED;
mon_pdev->rx_enh_capture_mode = CDP_RX_ENH_CAPTURE_DISABLED;
}
void