qcacmn: Handle FPMO filter configuration

Handle FPMO mode filter settings configured
from lite_mon tool.

Change-Id: I9bfe70101bae7c8f55c6db95d9c36f4c1d308e95
CRs-Fixed: 3235935
This commit is contained in:
Jeevan Kukkalli
2022-05-30 19:30:38 +05:30
committed by Madan Koyyalamudi
parent 7d3197b9a5
commit 2b76805c5a
8 changed files with 269 additions and 0 deletions

View File

@@ -1672,6 +1672,14 @@ int htt_h2t_rx_ring_cfg(struct htt_soc *htt_soc, int pdev_id,
dp_mon_rx_wmask_subscribe(soc->dp_soc, msg_word, htt_tlv_filter);
#ifdef FW_SUPPORT_NOT_YET
/* word 17*/
msg_word += 3;
*msg_word = 0;
dp_mon_rx_enable_fpmo(soc->dp_soc, msg_word, htt_tlv_filter);
#endif/* FW_SUPPORT_NOT_YET */
/* "response_required" field should be set if a HTT response message is
* required after setting up the ring.
*/

View File

@@ -618,6 +618,10 @@ struct htt_tx_ring_tlv_filter {
* @ctrl_mpdu_log: enable ctrl mpdu level logging
* @data_mpdu_log: enable data mpdu level logging
* @enable: enable rx monitor
* @enable_fpmo: enable/disable FPMO packet
* @fpmo_data_filter: FPMO mode data filter
* @fpmo_mgmt_filter: FPMO mode mgmt filter
* @fpmo_ctrl_filter: FPMO mode ctrl filter
*
* NOTE: Do not change the layout of this structure
*/
@@ -677,6 +681,10 @@ struct htt_rx_ring_tlv_filter {
ctrl_mpdu_log:1,
data_mpdu_log:1,
enable:1;
u_int16_t enable_fpmo:1;
u_int16_t fpmo_data_filter;
u_int16_t fpmo_mgmt_filter;
u_int16_t fpmo_ctrl_filter;
#endif
};

View File

@@ -1201,6 +1201,7 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc)
mon_ops->rx_mon_enable = NULL;
mon_ops->rx_wmask_subscribe = NULL;
mon_ops->rx_enable_mpdu_logging = NULL;
mon_ops->rx_enable_fpmo = NULL;
mon_ops->mon_neighbour_peers_detach = dp_neighbour_peers_detach;
mon_ops->mon_vdev_set_monitor_mode_buf_rings =
dp_vdev_set_monitor_mode_buf_rings;

View File

@@ -1388,6 +1388,7 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc)
mon_ops->mon_filter_reset_undecoded_metadata_capture =
dp_mon_filter_reset_undecoded_metadata_capture_2_0;
#endif
mon_ops->rx_enable_fpmo = dp_rx_mon_enable_fpmo;
}
struct dp_mon_ops monitor_ops_2_0 = {

View File

@@ -205,6 +205,182 @@ dp_rx_mon_word_mask_subscribe(uint32_t *msg_word,
}
}
void
dp_rx_mon_enable_fpmo(uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter)
{
#ifdef FW_SUPPORT_NOT_YET
if (!msg_word || !tlv_filter)
return;
if (tlv_filter->enable_fpmo) {
/* TYPE: MGMT */
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 0000,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_ASSOC_REQ) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 0001,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_ASSOC_RES) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 0010,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_REASSOC_REQ) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 0011,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_REASSOC_RES) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 0100,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_PROBE_REQ) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 0101,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_PROBE_RES) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 0110,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_TIM_ADVT) ? 1 : 0);
/* reserved */
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 0111,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_RESERVED_7) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 1000,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_BEACON) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 1001,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_ATIM) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 1010,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_DISASSOC) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 1011,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_AUTH) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 1100,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_DEAUTH) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 1101,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_ACTION) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 1110,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_ACT_NO_ACK) ? 1 : 0);
/* reserved*/
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, MGMT, 1111,
(tlv_filter->fpmo_mgmt_filter &
FILTER_MGMT_RESERVED_15) ? 1 : 0);
/* TYPE: CTRL */
/* reserved */
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 0000,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_RESERVED_1) ? 1 : 0);
/* reserved */
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 0001,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_RESERVED_2) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 0010,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_TRIGGER) ? 1 : 0);
/* reserved */
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 0011,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_RESERVED_4) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 0100,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_BF_REP_POLL) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 0101,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_VHT_NDP) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 0110,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_FRAME_EXT) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 0111,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_CTRLWRAP) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 1000,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_BA_REQ) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 1001,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_BA) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 1010,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_PSPOLL) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 1011,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_RTS) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 1100,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_CTS) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 1101,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_ACK) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 1110,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_CFEND) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
FPMO, CTRL, 1111,
(tlv_filter->fpmo_ctrl_filter &
FILTER_CTRL_CFEND_CFACK) ? 1 : 0);
/* word 18 */
msg_word++;
*msg_word = 0;
/* TYPE: DATA */
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG1,
FPMO, DATA, MCAST,
(tlv_filter->fpmo_data_filter &
FILTER_DATA_MCAST) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG1,
FPMO, DATA, UCAST,
(tlv_filter->fpmo_data_filter &
FILTER_DATA_UCAST) ? 1 : 0);
htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG1,
FPMO, DATA, NULL,
(tlv_filter->fpmo_data_filter &
FILTER_DATA_NULL) ? 1 : 0);
} else {
/* clear word 18 if fpmo is disabled
* word 17 is already cleared by caller
*/
/* word 18 */
msg_word++;
*msg_word = 0;
}
#endif
}
static void
htt_tx_tlv_filter_mask_set_in0(uint32_t *msg_word,
struct htt_tx_ring_tlv_filter *htt_tlv_filter)
@@ -1325,6 +1501,7 @@ static void dp_mon_filter_set_mon_2_0(struct dp_mon_pdev *mon_pdev,
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.enable_md = 0;
filter->tlv_filter.enable_fpmo = 0;
filter->tlv_filter.offset_valid = false;
filter->tlv_filter.mgmt_dma_length = DEFAULT_DMA_LENGTH;
filter->tlv_filter.data_dma_length = DEFAULT_DMA_LENGTH;
@@ -1452,6 +1629,7 @@ static void dp_rx_mon_filter_show_filter(struct dp_mon_filter_be *filter)
DP_MON_FILTER_PRINT("enable_fp: %d", rx_tlv_filter->enable_fp);
DP_MON_FILTER_PRINT("enable_md: %d", rx_tlv_filter->enable_md);
DP_MON_FILTER_PRINT("enable_mo: %d", rx_tlv_filter->enable_mo);
DP_MON_FILTER_PRINT("enable_fpmo: %d", rx_tlv_filter->enable_fpmo);
DP_MON_FILTER_PRINT("fp_mgmt_filter: 0x%x",
rx_tlv_filter->fp_mgmt_filter);
DP_MON_FILTER_PRINT("mo_mgmt_filter: 0x%x",
@@ -1470,6 +1648,12 @@ static void dp_rx_mon_filter_show_filter(struct dp_mon_filter_be *filter)
rx_tlv_filter->md_mgmt_filter);
DP_MON_FILTER_PRINT("md_ctrl_filter: 0x%x",
rx_tlv_filter->md_ctrl_filter);
DP_MON_FILTER_PRINT("fpmo_data_filter: 0x%x",
rx_tlv_filter->fpmo_data_filter);
DP_MON_FILTER_PRINT("fpmo_mgmt_filter: 0x%x",
rx_tlv_filter->fpmo_mgmt_filter);
DP_MON_FILTER_PRINT("fpmo_ctrl_filter: 0x%x",
rx_tlv_filter->fpmo_ctrl_filter);
DP_MON_FILTER_PRINT("mgmt_dma_length: %d",
rx_tlv_filter->mgmt_dma_length);
DP_MON_FILTER_PRINT("ctrl_dma_length: %d",
@@ -2304,6 +2488,21 @@ dp_rx_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev,
tlv_filter->rx_pkt_tlv_offset =
src_tlv_filter->rx_pkt_tlv_offset;
/*
* set fpmo filter settings
*/
if (src_tlv_filter->enable_fpmo &&
!tlv_filter->enable_fpmo) {
tlv_filter->enable_fpmo =
src_tlv_filter->enable_fpmo;
tlv_filter->fpmo_data_filter =
src_tlv_filter->fpmo_data_filter;
tlv_filter->fpmo_mgmt_filter =
src_tlv_filter->fpmo_mgmt_filter;
tlv_filter->fpmo_ctrl_filter =
src_tlv_filter->fpmo_ctrl_filter;
}
dp_mon_filter_show_rx_filter_be(current_mode, mon_filter);
}
}
@@ -2779,6 +2978,17 @@ dp_mon_filter_setup_rx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev)
config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_MO];
}
/* configure fpmo filters if enabled */
if (config->rx_config.fpmo_enabled) {
rx_tlv_filter->tlv_filter.enable_fpmo = 1;
rx_tlv_filter->tlv_filter.fpmo_mgmt_filter =
config->rx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP_MO];
rx_tlv_filter->tlv_filter.fpmo_ctrl_filter =
config->rx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP_MO];
rx_tlv_filter->tlv_filter.fpmo_data_filter =
config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP_MO];
}
mgmt_len = config->rx_config.len[WLAN_FC0_TYPE_MGMT];
ctrl_len = config->rx_config.len[WLAN_FC0_TYPE_CTRL];
data_len = config->rx_config.len[WLAN_FC0_TYPE_DATA];

View File

@@ -85,6 +85,15 @@ void
dp_rx_mon_enable_mpdu_logging(uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter);
/**
* dp_rx_mon_enable_fpmo() - Setup rx monitor fpmo mode type/subtype filters
* @msg_word: msg word
* @htt_tlv_filter: rx ring filter configuration
*/
void
dp_rx_mon_enable_fpmo(uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter);
#ifdef QCA_ENHANCED_STATS_SUPPORT
/**
* dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter

View File

@@ -6028,6 +6028,7 @@ void dp_mon_feature_ops_deregister(struct dp_soc *soc)
mon_ops->rx_packet_length_set = NULL;
mon_ops->rx_wmask_subscribe = NULL;
mon_ops->rx_enable_mpdu_logging = NULL;
mon_ops->rx_enable_fpmo = NULL;
mon_ops->mon_neighbour_peers_detach = NULL;
mon_ops->mon_vdev_set_monitor_mode_buf_rings = NULL;
mon_ops->mon_vdev_set_monitor_mode_rings = NULL;

View File

@@ -787,6 +787,8 @@ struct dp_mon_ops {
struct htt_rx_ring_tlv_filter *tlv_filter);
void (*rx_enable_mpdu_logging)(uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter);
void (*rx_enable_fpmo)(uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter);
#ifndef DISABLE_MON_CONFIG
void (*mon_register_intr_ops)(struct dp_soc *soc);
#endif
@@ -3727,6 +3729,35 @@ dp_mon_rx_enable_mpdu_logging(struct dp_soc *soc, uint32_t *msg_word,
monitor_ops->rx_enable_mpdu_logging(msg_word, tlv_filter);
}
/*
* dp_mon_rx_enable_fpmo() - set fpmo filters
* @soc: dp soc handle
* @msg_word: msg word
* @tlv_filter: rx fing filter config
*
* Return: void
*/
static inline void
dp_mon_rx_enable_fpmo(struct dp_soc *soc, uint32_t *msg_word,
struct htt_rx_ring_tlv_filter *tlv_filter)
{
struct dp_mon_soc *mon_soc = soc->monitor_soc;
struct dp_mon_ops *monitor_ops;
if (!mon_soc) {
dp_mon_debug("mon soc is NULL");
return;
}
monitor_ops = mon_soc->mon_ops;
if (!monitor_ops || !monitor_ops->rx_enable_fpmo) {
dp_mon_debug("callback not registered");
return;
}
monitor_ops->rx_enable_fpmo(msg_word, tlv_filter);
}
/*
* dp_mon_rx_hdr_length_set() - set rx hdr tlv length
* @soc: dp soc handle