From 2b76805c5ac933e4d6f1425167a1b87e215e83bd Mon Sep 17 00:00:00 2001 From: Jeevan Kukkalli Date: Mon, 30 May 2022 19:30:38 +0530 Subject: [PATCH] qcacmn: Handle FPMO filter configuration Handle FPMO mode filter settings configured from lite_mon tool. Change-Id: I9bfe70101bae7c8f55c6db95d9c36f4c1d308e95 CRs-Fixed: 3235935 --- dp/wifi3.0/dp_htt.c | 8 + dp/wifi3.0/dp_htt.h | 8 + dp/wifi3.0/monitor/1.0/dp_mon_1.0.c | 1 + dp/wifi3.0/monitor/2.0/dp_mon_2.0.c | 1 + dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c | 210 +++++++++++++++++++++ dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h | 9 + dp/wifi3.0/monitor/dp_mon.c | 1 + dp/wifi3.0/monitor/dp_mon.h | 31 +++ 8 files changed, 269 insertions(+) diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index db373b0d6e..0d11b692c0 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -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. */ diff --git a/dp/wifi3.0/dp_htt.h b/dp/wifi3.0/dp_htt.h index 975345a0c8..ee1b66aa03 100644 --- a/dp/wifi3.0/dp_htt.h +++ b/dp/wifi3.0/dp_htt.h @@ -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 }; diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c index f86542e551..ecd656c5db 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c @@ -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; diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c index be18b616d1..5db456bc72 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c @@ -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 = { diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c index ba4855d914..dadaebe1e6 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c @@ -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]; diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h index 531de9b3a3..68feeefb24 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h @@ -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 diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index 1dc0c3c9cb..0af6b572f5 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -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; diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index 0265ce9d76..b8411cdeb7 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -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