qcacmn: Add RxMON filter config support

Add RxMON filter config support for WKK

Change-Id: I2f2972d1bc6f6d0b5c8db69bdf21b22854f35fa4
This commit is contained in:
Amir Patel
2021-12-23 11:07:56 +05:30
committed by Madan Koyyalamudi
parent 2219ac036c
commit 76c23ddc4b
5 changed files with 346 additions and 251 deletions

View File

@@ -27,204 +27,6 @@
#include <dp_rx_mon_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) \
|| defined(ATH_SUPPORT_NAC) || defined(WLAN_RX_PKT_CAPTURE_ENH)
/**

View File

@@ -17,50 +17,6 @@
#ifndef _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
/**
* dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter

View File

@@ -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_pdev_be *mon_pdev_be;
struct dp_mon_soc_be *mon_soc_be = NULL;
struct dp_mon_pdev_be *mon_pdev_be = NULL;
if (!pdev) {
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 *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_RXDMA_MONITOR_STATUS;
struct dp_soc *soc;
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");
@@ -1107,16 +1107,59 @@ void dp_mon_filter_setup_rx_mon_mode_2_0(struct dp_pdev *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->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)
{
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,
@@ -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)
{
/* set filters */
/* call htt_h2t_rx_ring_cfg */
struct dp_soc *soc = pdev->soc;
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;
}

View File

@@ -23,6 +23,204 @@
#include <dp_mon_filter.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
dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc,
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;
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:
return QDF_STATUS_E_FAILURE;
}

View File

@@ -20,6 +20,50 @@
#ifndef _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) \
((*((uint32_t *)((uint8_t *)(src) + DP_MON_ ## field ## _OFFSET)) & \
(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);
/*
* 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_ */