qcacmn: Add RxMON filter config support
Add RxMON filter config support for WKK Change-Id: I2f2972d1bc6f6d0b5c8db69bdf21b22854f35fa4
This commit is contained in:

committed by
Madan Koyyalamudi

parent
2219ac036c
commit
76c23ddc4b
@@ -27,204 +27,6 @@
|
|||||||
#include <dp_rx_mon_1.0.h>
|
#include <dp_rx_mon_1.0.h>
|
||||||
#include <dp_mon_filter_1.0.h>
|
#include <dp_mon_filter_1.0.h>
|
||||||
|
|
||||||
/**
|
|
||||||
* dp_mon_filter_mode_type_to_str
|
|
||||||
* Monitor Filter mode to string
|
|
||||||
*/
|
|
||||||
int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = {
|
|
||||||
#ifdef QCA_ENHANCED_STATS_SUPPORT
|
|
||||||
"DP MON FILTER ENHACHED STATS MODE",
|
|
||||||
#endif /* QCA_ENHANCED_STATS_SUPPORT */
|
|
||||||
#ifdef QCA_MCOPY_SUPPORT
|
|
||||||
"DP MON FILTER MCOPY MODE",
|
|
||||||
#endif /* QCA_MCOPY_SUPPORT */
|
|
||||||
#if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
|
|
||||||
"DP MON FILTER SMART MONITOR MODE",
|
|
||||||
#endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */
|
|
||||||
"DP_MON FILTER MONITOR MODE",
|
|
||||||
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
|
||||||
"DP MON FILTER RX CAPTURE MODE",
|
|
||||||
#endif /* WLAN_RX_PKT_CAPTURE_ENH */
|
|
||||||
#ifdef WDI_EVENT_ENABLE
|
|
||||||
"DP MON FILTER PKT LOG FULL MODE",
|
|
||||||
"DP MON FILTER PKT LOG LITE MODE",
|
|
||||||
"DP MON FILTER PKT LOG CBF MODE",
|
|
||||||
#ifdef QCA_WIFI_QCN9224
|
|
||||||
"DP MON FILTER PKT LOG HYBRID MODE",
|
|
||||||
#endif
|
|
||||||
#endif /* WDI_EVENT_ENABLE */
|
|
||||||
};
|
|
||||||
|
|
||||||
void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev,
|
|
||||||
enum dp_mon_filter_mode mode,
|
|
||||||
struct dp_mon_filter *filter)
|
|
||||||
{
|
|
||||||
struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter;
|
|
||||||
|
|
||||||
DP_MON_FILTER_PRINT("[%s]: Valid: %d",
|
|
||||||
dp_mon_filter_mode_type_to_str[mode],
|
|
||||||
filter->valid);
|
|
||||||
DP_MON_FILTER_PRINT("mpdu_start: %d", tlv_filter->mpdu_start);
|
|
||||||
DP_MON_FILTER_PRINT("msdu_start: %d", tlv_filter->msdu_start);
|
|
||||||
DP_MON_FILTER_PRINT("packet: %d", tlv_filter->packet);
|
|
||||||
DP_MON_FILTER_PRINT("msdu_end: %d", tlv_filter->msdu_end);
|
|
||||||
DP_MON_FILTER_PRINT("mpdu_end: %d", tlv_filter->mpdu_end);
|
|
||||||
DP_MON_FILTER_PRINT("packet_header: %d",
|
|
||||||
tlv_filter->packet_header);
|
|
||||||
DP_MON_FILTER_PRINT("attention: %d", tlv_filter->attention);
|
|
||||||
DP_MON_FILTER_PRINT("ppdu_start: %d", tlv_filter->ppdu_start);
|
|
||||||
DP_MON_FILTER_PRINT("ppdu_end: %d", tlv_filter->ppdu_end);
|
|
||||||
DP_MON_FILTER_PRINT("ppdu_end_user_stats: %d",
|
|
||||||
tlv_filter->ppdu_end_user_stats);
|
|
||||||
DP_MON_FILTER_PRINT("ppdu_end_user_stats_ext: %d",
|
|
||||||
tlv_filter->ppdu_end_user_stats_ext);
|
|
||||||
DP_MON_FILTER_PRINT("ppdu_end_status_done: %d",
|
|
||||||
tlv_filter->ppdu_end_status_done);
|
|
||||||
DP_MON_FILTER_PRINT("header_per_msdu: %d", tlv_filter->header_per_msdu);
|
|
||||||
DP_MON_FILTER_PRINT("enable_fp: %d", tlv_filter->enable_fp);
|
|
||||||
DP_MON_FILTER_PRINT("enable_md: %d", tlv_filter->enable_md);
|
|
||||||
DP_MON_FILTER_PRINT("enable_mo: %d", tlv_filter->enable_mo);
|
|
||||||
DP_MON_FILTER_PRINT("fp_mgmt_filter: 0x%x", tlv_filter->fp_mgmt_filter);
|
|
||||||
DP_MON_FILTER_PRINT("mo_mgmt_filter: 0x%x", tlv_filter->mo_mgmt_filter);
|
|
||||||
DP_MON_FILTER_PRINT("fp_ctrl_filter: 0x%x", tlv_filter->fp_ctrl_filter);
|
|
||||||
DP_MON_FILTER_PRINT("mo_ctrl_filter: 0x%x", tlv_filter->mo_ctrl_filter);
|
|
||||||
DP_MON_FILTER_PRINT("fp_data_filter: 0x%x", tlv_filter->fp_data_filter);
|
|
||||||
DP_MON_FILTER_PRINT("mo_data_filter: 0x%x", tlv_filter->mo_data_filter);
|
|
||||||
DP_MON_FILTER_PRINT("md_data_filter: 0x%x", tlv_filter->md_data_filter);
|
|
||||||
DP_MON_FILTER_PRINT("md_mgmt_filter: 0x%x", tlv_filter->md_mgmt_filter);
|
|
||||||
DP_MON_FILTER_PRINT("md_ctrl_filter: 0x%x", tlv_filter->md_ctrl_filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* dp_mon_filter_h2t_setup() - Setup the filter for the Target setup
|
|
||||||
* @soc: DP soc handle
|
|
||||||
* @pdev: DP pdev handle
|
|
||||||
* @srng_type: The srng type for which filter wll be set
|
|
||||||
* @tlv_filter: tlv filter
|
|
||||||
*/
|
|
||||||
static void dp_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev,
|
|
||||||
enum dp_mon_filter_srng_type srng_type,
|
|
||||||
struct dp_mon_filter *filter)
|
|
||||||
{
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE;
|
|
||||||
current_mode++) {
|
|
||||||
struct dp_mon_filter *mon_filter =
|
|
||||||
&mon_pdev->filter[current_mode][srng_type];
|
|
||||||
uint32_t src_filter = 0, dst_filter = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check if the correct mode is enabled or not.
|
|
||||||
*/
|
|
||||||
if (!mon_filter->valid)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
filter->valid = true;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the super bit fields
|
|
||||||
*/
|
|
||||||
src_filter =
|
|
||||||
DP_MON_FILTER_GET(&mon_filter->tlv_filter, FILTER_TLV);
|
|
||||||
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_TLV);
|
|
||||||
dst_filter |= src_filter;
|
|
||||||
DP_MON_FILTER_SET(tlv_filter, FILTER_TLV, dst_filter);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the filter management filter.
|
|
||||||
*/
|
|
||||||
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
|
||||||
FILTER_FP_MGMT);
|
|
||||||
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_MGMT);
|
|
||||||
dst_filter |= src_filter;
|
|
||||||
DP_MON_FILTER_SET(tlv_filter, FILTER_FP_MGMT, dst_filter);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the monitor other management filter.
|
|
||||||
*/
|
|
||||||
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
|
||||||
FILTER_MO_MGMT);
|
|
||||||
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_MGMT);
|
|
||||||
dst_filter |= src_filter;
|
|
||||||
DP_MON_FILTER_SET(tlv_filter, FILTER_MO_MGMT, dst_filter);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the filter pass control filter.
|
|
||||||
*/
|
|
||||||
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
|
||||||
FILTER_FP_CTRL);
|
|
||||||
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_CTRL);
|
|
||||||
dst_filter |= src_filter;
|
|
||||||
DP_MON_FILTER_SET(tlv_filter, FILTER_FP_CTRL, dst_filter);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the monitor other control filter.
|
|
||||||
*/
|
|
||||||
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
|
||||||
FILTER_MO_CTRL);
|
|
||||||
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_CTRL);
|
|
||||||
dst_filter |= src_filter;
|
|
||||||
DP_MON_FILTER_SET(tlv_filter, FILTER_MO_CTRL, dst_filter);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the filter pass data filter.
|
|
||||||
*/
|
|
||||||
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
|
||||||
FILTER_FP_DATA);
|
|
||||||
dst_filter = DP_MON_FILTER_GET(tlv_filter,
|
|
||||||
FILTER_FP_DATA);
|
|
||||||
dst_filter |= src_filter;
|
|
||||||
DP_MON_FILTER_SET(tlv_filter,
|
|
||||||
FILTER_FP_DATA, dst_filter);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the monitor other data filter.
|
|
||||||
*/
|
|
||||||
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
|
||||||
FILTER_MO_DATA);
|
|
||||||
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_DATA);
|
|
||||||
dst_filter |= src_filter;
|
|
||||||
DP_MON_FILTER_SET(tlv_filter, FILTER_MO_DATA, dst_filter);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the monitor direct data filter.
|
|
||||||
*/
|
|
||||||
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
|
||||||
FILTER_MD_DATA);
|
|
||||||
dst_filter = DP_MON_FILTER_GET(tlv_filter,
|
|
||||||
FILTER_MD_DATA);
|
|
||||||
dst_filter |= src_filter;
|
|
||||||
DP_MON_FILTER_SET(tlv_filter,
|
|
||||||
FILTER_MD_DATA, dst_filter);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the monitor direct management filter.
|
|
||||||
*/
|
|
||||||
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
|
||||||
FILTER_MD_MGMT);
|
|
||||||
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_MGMT);
|
|
||||||
dst_filter |= src_filter;
|
|
||||||
DP_MON_FILTER_SET(tlv_filter, FILTER_MD_MGMT, dst_filter);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the monitor direct management filter.
|
|
||||||
*/
|
|
||||||
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
|
||||||
FILTER_MD_CTRL);
|
|
||||||
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_CTRL);
|
|
||||||
dst_filter |= src_filter;
|
|
||||||
DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
dp_mon_filter_show_filter(mon_pdev, 0, filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(QCA_MCOPY_SUPPORT) || defined(ATH_SUPPORT_NAC_RSSI) \
|
#if defined(QCA_MCOPY_SUPPORT) || defined(ATH_SUPPORT_NAC_RSSI) \
|
||||||
|| defined(ATH_SUPPORT_NAC) || defined(WLAN_RX_PKT_CAPTURE_ENH)
|
|| defined(ATH_SUPPORT_NAC) || defined(WLAN_RX_PKT_CAPTURE_ENH)
|
||||||
/**
|
/**
|
||||||
|
@@ -17,50 +17,6 @@
|
|||||||
#ifndef _DP_MON_FILTER_1_0_H_
|
#ifndef _DP_MON_FILTER_1_0_H_
|
||||||
#define _DP_MON_FILTER_1_0_H_
|
#define _DP_MON_FILTER_1_0_H_
|
||||||
|
|
||||||
/**
|
|
||||||
* Accessor Macros to access the software
|
|
||||||
* defined HTT filter htt_rx_ring_tlv_filter.
|
|
||||||
*/
|
|
||||||
#define DP_MON_FILTER_TLV_OFFSET 0x00000000
|
|
||||||
#define DP_MON_FILTER_TLV_MASK 0xffffffff
|
|
||||||
#define DP_MON_FILTER_TLV_LSB 0
|
|
||||||
|
|
||||||
#define DP_MON_FILTER_FP_MGMT_OFFSET 0x00000004
|
|
||||||
#define DP_MON_FILTER_FP_MGMT_MASK 0x0000ffff
|
|
||||||
#define DP_MON_FILTER_FP_MGMT_LSB 0
|
|
||||||
|
|
||||||
#define DP_MON_FILTER_MO_MGMT_OFFSET 0x00000004
|
|
||||||
#define DP_MON_FILTER_MO_MGMT_MASK 0xffff0000
|
|
||||||
#define DP_MON_FILTER_MO_MGMT_LSB 16
|
|
||||||
|
|
||||||
#define DP_MON_FILTER_FP_CTRL_OFFSET 0x00000008
|
|
||||||
#define DP_MON_FILTER_FP_CTRL_MASK 0x0000ffff
|
|
||||||
#define DP_MON_FILTER_FP_CTRL_LSB 0
|
|
||||||
|
|
||||||
#define DP_MON_FILTER_MO_CTRL_OFFSET 0x00000008
|
|
||||||
#define DP_MON_FILTER_MO_CTRL_MASK 0xffff0000
|
|
||||||
#define DP_MON_FILTER_MO_CTRL_LSB 16
|
|
||||||
|
|
||||||
#define DP_MON_FILTER_FP_DATA_OFFSET 0x0000000c
|
|
||||||
#define DP_MON_FILTER_FP_DATA_MASK 0x0000ffff
|
|
||||||
#define DP_MON_FILTER_FP_DATA_LSB 0
|
|
||||||
|
|
||||||
#define DP_MON_FILTER_MO_DATA_OFFSET 0x0000000c
|
|
||||||
#define DP_MON_FILTER_MO_DATA_MASK 0xffff0000
|
|
||||||
#define DP_MON_FILTER_MO_DATA_LSB 16
|
|
||||||
|
|
||||||
#define DP_MON_FILTER_MD_DATA_OFFSET 0x00000010
|
|
||||||
#define DP_MON_FILTER_MD_DATA_MASK 0x0000ffff
|
|
||||||
#define DP_MON_FILTER_MD_DATA_LSB 0
|
|
||||||
|
|
||||||
#define DP_MON_FILTER_MD_MGMT_OFFSET 0x00000010
|
|
||||||
#define DP_MON_FILTER_MD_MGMT_MASK 0xffff0000
|
|
||||||
#define DP_MON_FILTER_MD_MGMT_LSB 16
|
|
||||||
|
|
||||||
#define DP_MON_FILTER_MD_CTRL_OFFSET 0x00000014
|
|
||||||
#define DP_MON_FILTER_MD_CTRL_MASK 0x0000ffff
|
|
||||||
#define DP_MON_FILTER_MD_CTRL_LSB 0
|
|
||||||
|
|
||||||
#ifdef QCA_ENHANCED_STATS_SUPPORT
|
#ifdef QCA_ENHANCED_STATS_SUPPORT
|
||||||
/**
|
/**
|
||||||
* dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter
|
* dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter
|
||||||
|
@@ -1062,7 +1062,6 @@ void dp_mon_filter_reset_tx_mon_mode_2_0(struct dp_pdev *pdev)
|
|||||||
struct dp_mon_soc *mon_soc;
|
struct dp_mon_soc *mon_soc;
|
||||||
struct dp_mon_pdev_be *mon_pdev_be;
|
struct dp_mon_pdev_be *mon_pdev_be;
|
||||||
struct dp_mon_soc_be *mon_soc_be = NULL;
|
struct dp_mon_soc_be *mon_soc_be = NULL;
|
||||||
struct dp_mon_pdev_be *mon_pdev_be = NULL;
|
|
||||||
|
|
||||||
if (!pdev) {
|
if (!pdev) {
|
||||||
dp_mon_filter_err("pdev Context is null");
|
dp_mon_filter_err("pdev Context is null");
|
||||||
@@ -1089,11 +1088,12 @@ void dp_mon_filter_setup_rx_mon_mode_2_0(struct dp_pdev *pdev)
|
|||||||
{
|
{
|
||||||
struct dp_mon_filter_be filter = {0};
|
struct dp_mon_filter_be filter = {0};
|
||||||
struct dp_mon_filter *rx_tlv_filter;
|
struct dp_mon_filter *rx_tlv_filter;
|
||||||
struct dp_soc *soc = NULL;
|
struct dp_soc *soc;
|
||||||
//enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
|
enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
|
||||||
//enum dp_mon_filter_srng_type srng_type =
|
enum dp_mon_filter_srng_type srng_type =
|
||||||
// DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
|
||||||
struct dp_mon_pdev *mon_pdev;
|
struct dp_mon_pdev *mon_pdev;
|
||||||
|
struct dp_mon_pdev_be *mon_pdev_be;
|
||||||
|
|
||||||
if (!pdev) {
|
if (!pdev) {
|
||||||
dp_mon_filter_err("pdev Context is null");
|
dp_mon_filter_err("pdev Context is null");
|
||||||
@@ -1107,16 +1107,59 @@ void dp_mon_filter_setup_rx_mon_mode_2_0(struct dp_pdev *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mon_pdev = pdev->monitor_pdev;
|
mon_pdev = pdev->monitor_pdev;
|
||||||
|
if (!mon_pdev) {
|
||||||
|
dp_mon_filter_err("mon_pdev Context is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
|
||||||
|
|
||||||
rx_tlv_filter = &filter.rx_tlv_filter;
|
rx_tlv_filter = &filter.rx_tlv_filter;
|
||||||
rx_tlv_filter->valid = true;
|
rx_tlv_filter->valid = true;
|
||||||
|
|
||||||
/* Update for RxMon: Enabled the filter */
|
dp_mon_filter_set_status_cmn(mon_pdev, rx_tlv_filter);
|
||||||
|
dp_mon_filter_show_filter(mon_pdev, mode, rx_tlv_filter);
|
||||||
|
|
||||||
/* Update for Rxmon: Store the above filter */
|
/* Store the above filter */
|
||||||
|
mon_pdev_be->filter_be[mode][srng_type] = filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dp_mon_filter_reset_rx_mon_mode_2_0(struct dp_pdev *pdev)
|
void dp_mon_filter_reset_rx_mon_mode_2_0(struct dp_pdev *pdev)
|
||||||
{
|
{
|
||||||
|
struct dp_mon_filter_be filter = {0};
|
||||||
|
struct dp_mon_filter *rx_tlv_filter;
|
||||||
|
struct dp_soc *soc = NULL;
|
||||||
|
|
||||||
|
enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
|
||||||
|
enum dp_mon_filter_srng_type srng_type =
|
||||||
|
DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
|
||||||
|
struct dp_mon_pdev *mon_pdev;
|
||||||
|
struct dp_mon_pdev_be *mon_pdev_be;
|
||||||
|
|
||||||
|
if (!pdev) {
|
||||||
|
dp_mon_filter_err("pdev Context is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
soc = pdev->soc;
|
||||||
|
if (!soc) {
|
||||||
|
dp_mon_filter_err("Soc Context is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mon_pdev = pdev->monitor_pdev;
|
||||||
|
if (!mon_pdev) {
|
||||||
|
dp_mon_filter_err("mon_pdev Context is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
|
||||||
|
|
||||||
|
rx_tlv_filter = &filter.rx_tlv_filter;
|
||||||
|
rx_tlv_filter->valid = true;
|
||||||
|
|
||||||
|
qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter));
|
||||||
|
/* Store the above filter */
|
||||||
|
srng_type = DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
|
||||||
|
mon_pdev_be->filter_be[mode][srng_type] = filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dp_mon_filter_show_filter_be(struct dp_mon_pdev_be *mon_pdev,
|
void dp_mon_filter_show_filter_be(struct dp_mon_pdev_be *mon_pdev,
|
||||||
@@ -1670,7 +1713,31 @@ QDF_STATUS dp_tx_mon_filter_update_2_0(struct dp_pdev *pdev)
|
|||||||
|
|
||||||
QDF_STATUS dp_rx_mon_filter_update_2_0(struct dp_pdev *pdev)
|
QDF_STATUS dp_rx_mon_filter_update_2_0(struct dp_pdev *pdev)
|
||||||
{
|
{
|
||||||
/* set filters */
|
struct dp_soc *soc = pdev->soc;
|
||||||
/* call htt_h2t_rx_ring_cfg */
|
struct dp_mon_filter_be filter = {0};
|
||||||
|
struct dp_mon_filter_be *filter_ptr;
|
||||||
|
struct htt_rx_ring_tlv_filter *rx_tlv_filter;
|
||||||
|
enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
|
||||||
|
enum dp_mon_filter_srng_type srng_type =
|
||||||
|
DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
|
||||||
|
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||||
|
struct dp_mon_pdev_be *mon_pdev_be =
|
||||||
|
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
|
||||||
|
|
||||||
|
if (!pdev) {
|
||||||
|
dp_mon_filter_err("pdev Context is null");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
filter_ptr = &mon_pdev_be->filter_be[mode][srng_type];
|
||||||
|
if (!filter_ptr) {
|
||||||
|
dp_mon_filter_err("Filter not allocated");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rx_tlv_filter = &filter.rx_tlv_filter.tlv_filter;
|
||||||
|
dp_mon_filter_h2t_setup(soc, pdev, srng_type, &filter.rx_tlv_filter);
|
||||||
|
dp_mon_ht2_rx_ring_cfg(soc, pdev, srng_type,
|
||||||
|
&filter.rx_tlv_filter.tlv_filter);
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@@ -23,6 +23,204 @@
|
|||||||
#include <dp_mon_filter.h>
|
#include <dp_mon_filter.h>
|
||||||
#include <dp_mon.h>
|
#include <dp_mon.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_mon_filter_mode_type_to_str
|
||||||
|
* Monitor Filter mode to string
|
||||||
|
*/
|
||||||
|
int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = {
|
||||||
|
#ifdef QCA_ENHANCED_STATS_SUPPORT
|
||||||
|
"DP MON FILTER ENHACHED STATS MODE",
|
||||||
|
#endif /* QCA_ENHANCED_STATS_SUPPORT */
|
||||||
|
#ifdef QCA_MCOPY_SUPPORT
|
||||||
|
"DP MON FILTER MCOPY MODE",
|
||||||
|
#endif /* QCA_MCOPY_SUPPORT */
|
||||||
|
#if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
|
||||||
|
"DP MON FILTER SMART MONITOR MODE",
|
||||||
|
#endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */
|
||||||
|
"DP_MON FILTER MONITOR MODE",
|
||||||
|
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
||||||
|
"DP MON FILTER RX CAPTURE MODE",
|
||||||
|
#endif /* WLAN_RX_PKT_CAPTURE_ENH */
|
||||||
|
#ifdef WDI_EVENT_ENABLE
|
||||||
|
"DP MON FILTER PKT LOG FULL MODE",
|
||||||
|
"DP MON FILTER PKT LOG LITE MODE",
|
||||||
|
"DP MON FILTER PKT LOG CBF MODE",
|
||||||
|
#ifdef QCA_WIFI_QCN9224
|
||||||
|
"DP MON FILTER PKT LOG HYBRID MODE",
|
||||||
|
#endif
|
||||||
|
#endif /* WDI_EVENT_ENABLE */
|
||||||
|
};
|
||||||
|
|
||||||
|
void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev,
|
||||||
|
enum dp_mon_filter_mode mode,
|
||||||
|
struct dp_mon_filter *filter)
|
||||||
|
{
|
||||||
|
struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter;
|
||||||
|
|
||||||
|
DP_MON_FILTER_PRINT("[%s]: Valid: %d",
|
||||||
|
dp_mon_filter_mode_type_to_str[mode],
|
||||||
|
filter->valid);
|
||||||
|
DP_MON_FILTER_PRINT("mpdu_start: %d", tlv_filter->mpdu_start);
|
||||||
|
DP_MON_FILTER_PRINT("msdu_start: %d", tlv_filter->msdu_start);
|
||||||
|
DP_MON_FILTER_PRINT("packet: %d", tlv_filter->packet);
|
||||||
|
DP_MON_FILTER_PRINT("msdu_end: %d", tlv_filter->msdu_end);
|
||||||
|
DP_MON_FILTER_PRINT("mpdu_end: %d", tlv_filter->mpdu_end);
|
||||||
|
DP_MON_FILTER_PRINT("packet_header: %d",
|
||||||
|
tlv_filter->packet_header);
|
||||||
|
DP_MON_FILTER_PRINT("attention: %d", tlv_filter->attention);
|
||||||
|
DP_MON_FILTER_PRINT("ppdu_start: %d", tlv_filter->ppdu_start);
|
||||||
|
DP_MON_FILTER_PRINT("ppdu_end: %d", tlv_filter->ppdu_end);
|
||||||
|
DP_MON_FILTER_PRINT("ppdu_end_user_stats: %d",
|
||||||
|
tlv_filter->ppdu_end_user_stats);
|
||||||
|
DP_MON_FILTER_PRINT("ppdu_end_user_stats_ext: %d",
|
||||||
|
tlv_filter->ppdu_end_user_stats_ext);
|
||||||
|
DP_MON_FILTER_PRINT("ppdu_end_status_done: %d",
|
||||||
|
tlv_filter->ppdu_end_status_done);
|
||||||
|
DP_MON_FILTER_PRINT("header_per_msdu: %d", tlv_filter->header_per_msdu);
|
||||||
|
DP_MON_FILTER_PRINT("enable_fp: %d", tlv_filter->enable_fp);
|
||||||
|
DP_MON_FILTER_PRINT("enable_md: %d", tlv_filter->enable_md);
|
||||||
|
DP_MON_FILTER_PRINT("enable_mo: %d", tlv_filter->enable_mo);
|
||||||
|
DP_MON_FILTER_PRINT("fp_mgmt_filter: 0x%x", tlv_filter->fp_mgmt_filter);
|
||||||
|
DP_MON_FILTER_PRINT("mo_mgmt_filter: 0x%x", tlv_filter->mo_mgmt_filter);
|
||||||
|
DP_MON_FILTER_PRINT("fp_ctrl_filter: 0x%x", tlv_filter->fp_ctrl_filter);
|
||||||
|
DP_MON_FILTER_PRINT("mo_ctrl_filter: 0x%x", tlv_filter->mo_ctrl_filter);
|
||||||
|
DP_MON_FILTER_PRINT("fp_data_filter: 0x%x", tlv_filter->fp_data_filter);
|
||||||
|
DP_MON_FILTER_PRINT("mo_data_filter: 0x%x", tlv_filter->mo_data_filter);
|
||||||
|
DP_MON_FILTER_PRINT("md_data_filter: 0x%x", tlv_filter->md_data_filter);
|
||||||
|
DP_MON_FILTER_PRINT("md_mgmt_filter: 0x%x", tlv_filter->md_mgmt_filter);
|
||||||
|
DP_MON_FILTER_PRINT("md_ctrl_filter: 0x%x", tlv_filter->md_ctrl_filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_mon_filter_h2t_setup() - Setup the filter for the Target setup
|
||||||
|
* @soc: DP soc handle
|
||||||
|
* @pdev: DP pdev handle
|
||||||
|
* @srng_type: The srng type for which filter wll be set
|
||||||
|
* @tlv_filter: tlv filter
|
||||||
|
*/
|
||||||
|
void dp_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||||
|
enum dp_mon_filter_srng_type srng_type,
|
||||||
|
struct dp_mon_filter *filter)
|
||||||
|
{
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE;
|
||||||
|
current_mode++) {
|
||||||
|
struct dp_mon_filter *mon_filter =
|
||||||
|
&mon_pdev->filter[current_mode][srng_type];
|
||||||
|
uint32_t src_filter = 0, dst_filter = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if the correct mode is enabled or not.
|
||||||
|
*/
|
||||||
|
if (!mon_filter->valid)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
filter->valid = true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the super bit fields
|
||||||
|
*/
|
||||||
|
src_filter =
|
||||||
|
DP_MON_FILTER_GET(&mon_filter->tlv_filter, FILTER_TLV);
|
||||||
|
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_TLV);
|
||||||
|
dst_filter |= src_filter;
|
||||||
|
DP_MON_FILTER_SET(tlv_filter, FILTER_TLV, dst_filter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the filter management filter.
|
||||||
|
*/
|
||||||
|
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
||||||
|
FILTER_FP_MGMT);
|
||||||
|
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_MGMT);
|
||||||
|
dst_filter |= src_filter;
|
||||||
|
DP_MON_FILTER_SET(tlv_filter, FILTER_FP_MGMT, dst_filter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the monitor other management filter.
|
||||||
|
*/
|
||||||
|
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
||||||
|
FILTER_MO_MGMT);
|
||||||
|
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_MGMT);
|
||||||
|
dst_filter |= src_filter;
|
||||||
|
DP_MON_FILTER_SET(tlv_filter, FILTER_MO_MGMT, dst_filter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the filter pass control filter.
|
||||||
|
*/
|
||||||
|
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
||||||
|
FILTER_FP_CTRL);
|
||||||
|
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_CTRL);
|
||||||
|
dst_filter |= src_filter;
|
||||||
|
DP_MON_FILTER_SET(tlv_filter, FILTER_FP_CTRL, dst_filter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the monitor other control filter.
|
||||||
|
*/
|
||||||
|
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
||||||
|
FILTER_MO_CTRL);
|
||||||
|
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_CTRL);
|
||||||
|
dst_filter |= src_filter;
|
||||||
|
DP_MON_FILTER_SET(tlv_filter, FILTER_MO_CTRL, dst_filter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the filter pass data filter.
|
||||||
|
*/
|
||||||
|
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
||||||
|
FILTER_FP_DATA);
|
||||||
|
dst_filter = DP_MON_FILTER_GET(tlv_filter,
|
||||||
|
FILTER_FP_DATA);
|
||||||
|
dst_filter |= src_filter;
|
||||||
|
DP_MON_FILTER_SET(tlv_filter,
|
||||||
|
FILTER_FP_DATA, dst_filter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the monitor other data filter.
|
||||||
|
*/
|
||||||
|
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
||||||
|
FILTER_MO_DATA);
|
||||||
|
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_DATA);
|
||||||
|
dst_filter |= src_filter;
|
||||||
|
DP_MON_FILTER_SET(tlv_filter, FILTER_MO_DATA, dst_filter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the monitor direct data filter.
|
||||||
|
*/
|
||||||
|
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
||||||
|
FILTER_MD_DATA);
|
||||||
|
dst_filter = DP_MON_FILTER_GET(tlv_filter,
|
||||||
|
FILTER_MD_DATA);
|
||||||
|
dst_filter |= src_filter;
|
||||||
|
DP_MON_FILTER_SET(tlv_filter,
|
||||||
|
FILTER_MD_DATA, dst_filter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the monitor direct management filter.
|
||||||
|
*/
|
||||||
|
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
||||||
|
FILTER_MD_MGMT);
|
||||||
|
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_MGMT);
|
||||||
|
dst_filter |= src_filter;
|
||||||
|
DP_MON_FILTER_SET(tlv_filter, FILTER_MD_MGMT, dst_filter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the monitor direct management filter.
|
||||||
|
*/
|
||||||
|
src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
|
||||||
|
FILTER_MD_CTRL);
|
||||||
|
dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_CTRL);
|
||||||
|
dst_filter |= src_filter;
|
||||||
|
DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
dp_mon_filter_show_filter(mon_pdev, 0, filter);
|
||||||
|
}
|
||||||
|
|
||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc,
|
dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc,
|
||||||
struct dp_pdev *pdev,
|
struct dp_pdev *pdev,
|
||||||
@@ -88,6 +286,11 @@ dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc,
|
|||||||
ring_buf_size = RX_DATA_BUFFER_SIZE;
|
ring_buf_size = RX_DATA_BUFFER_SIZE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DP_MON_FILTER_SRNG_TYPE_RXMON_DEST:
|
||||||
|
hal_ring_hdl =
|
||||||
|
soc->rxdma_mon_dst_ring[lmac_id].hal_srng;
|
||||||
|
hal_ring_type = RXDMA_MONITOR_DST;
|
||||||
|
ring_buf_size = RX_DATA_BUFFER_SIZE;
|
||||||
default:
|
default:
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
}
|
}
|
||||||
|
@@ -20,6 +20,50 @@
|
|||||||
#ifndef _DP_MON_FILTER_H_
|
#ifndef _DP_MON_FILTER_H_
|
||||||
#define _DP_MON_FILTER_H_
|
#define _DP_MON_FILTER_H_
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accessor Macros to access the software
|
||||||
|
* defined HTT filter htt_rx_ring_tlv_filter.
|
||||||
|
*/
|
||||||
|
#define DP_MON_FILTER_TLV_OFFSET 0x00000000
|
||||||
|
#define DP_MON_FILTER_TLV_MASK 0xffffffff
|
||||||
|
#define DP_MON_FILTER_TLV_LSB 0
|
||||||
|
|
||||||
|
#define DP_MON_FILTER_FP_MGMT_OFFSET 0x00000004
|
||||||
|
#define DP_MON_FILTER_FP_MGMT_MASK 0x0000ffff
|
||||||
|
#define DP_MON_FILTER_FP_MGMT_LSB 0
|
||||||
|
|
||||||
|
#define DP_MON_FILTER_MO_MGMT_OFFSET 0x00000004
|
||||||
|
#define DP_MON_FILTER_MO_MGMT_MASK 0xffff0000
|
||||||
|
#define DP_MON_FILTER_MO_MGMT_LSB 16
|
||||||
|
|
||||||
|
#define DP_MON_FILTER_FP_CTRL_OFFSET 0x00000008
|
||||||
|
#define DP_MON_FILTER_FP_CTRL_MASK 0x0000ffff
|
||||||
|
#define DP_MON_FILTER_FP_CTRL_LSB 0
|
||||||
|
|
||||||
|
#define DP_MON_FILTER_MO_CTRL_OFFSET 0x00000008
|
||||||
|
#define DP_MON_FILTER_MO_CTRL_MASK 0xffff0000
|
||||||
|
#define DP_MON_FILTER_MO_CTRL_LSB 16
|
||||||
|
|
||||||
|
#define DP_MON_FILTER_FP_DATA_OFFSET 0x0000000c
|
||||||
|
#define DP_MON_FILTER_FP_DATA_MASK 0x0000ffff
|
||||||
|
#define DP_MON_FILTER_FP_DATA_LSB 0
|
||||||
|
|
||||||
|
#define DP_MON_FILTER_MO_DATA_OFFSET 0x0000000c
|
||||||
|
#define DP_MON_FILTER_MO_DATA_MASK 0xffff0000
|
||||||
|
#define DP_MON_FILTER_MO_DATA_LSB 16
|
||||||
|
|
||||||
|
#define DP_MON_FILTER_MD_DATA_OFFSET 0x00000010
|
||||||
|
#define DP_MON_FILTER_MD_DATA_MASK 0x0000ffff
|
||||||
|
#define DP_MON_FILTER_MD_DATA_LSB 0
|
||||||
|
|
||||||
|
#define DP_MON_FILTER_MD_MGMT_OFFSET 0x00000010
|
||||||
|
#define DP_MON_FILTER_MD_MGMT_MASK 0xffff0000
|
||||||
|
#define DP_MON_FILTER_MD_MGMT_LSB 16
|
||||||
|
|
||||||
|
#define DP_MON_FILTER_MD_CTRL_OFFSET 0x00000014
|
||||||
|
#define DP_MON_FILTER_MD_CTRL_MASK 0x0000ffff
|
||||||
|
#define DP_MON_FILTER_MD_CTRL_LSB 0
|
||||||
|
|
||||||
#define DP_MON_FILTER_GET(src, field) \
|
#define DP_MON_FILTER_GET(src, field) \
|
||||||
((*((uint32_t *)((uint8_t *)(src) + DP_MON_ ## field ## _OFFSET)) & \
|
((*((uint32_t *)((uint8_t *)(src) + DP_MON_ ## field ## _OFFSET)) & \
|
||||||
(DP_MON_ ## field ## _MASK)) >> DP_MON_ ## field ## _LSB) \
|
(DP_MON_ ## field ## _MASK)) >> DP_MON_ ## field ## _LSB) \
|
||||||
@@ -381,4 +425,27 @@ void dp_mon_filter_dealloc(struct dp_mon_pdev *mon_pdev);
|
|||||||
*/
|
*/
|
||||||
struct dp_mon_filter **dp_mon_filter_alloc(struct dp_mon_pdev *mon_pdev);
|
struct dp_mon_filter **dp_mon_filter_alloc(struct dp_mon_pdev *mon_pdev);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* dp_mon_filter_h2t_setup () - Setup filter
|
||||||
|
* @soc: Dp soc handle
|
||||||
|
* @pdev: pdev handle
|
||||||
|
* @srng_type: srng type
|
||||||
|
* @filter: filter
|
||||||
|
*/
|
||||||
|
void dp_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||||
|
enum dp_mon_filter_srng_type srng_type,
|
||||||
|
struct dp_mon_filter *filter);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_mon_ht2_rx_ring_cfg () - Configure filter to HW
|
||||||
|
* @soc: Dp soc handle
|
||||||
|
* @pdev: Dp pdev handle
|
||||||
|
* @srng_type: SRNG type
|
||||||
|
* @tlv_filter: filter
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc,
|
||||||
|
struct dp_pdev *pdev,
|
||||||
|
enum dp_mon_filter_srng_type srng_type,
|
||||||
|
struct htt_rx_ring_tlv_filter *tlv_filter);
|
||||||
#endif /* #ifndef _DP_MON_FILTER_H_ */
|
#endif /* #ifndef _DP_MON_FILTER_H_ */
|
||||||
|
Reference in New Issue
Block a user