瀏覽代碼

qcacmn: Handle FPMO filter configuration

Handle FPMO mode filter settings configured
from lite_mon tool.

Change-Id: I9bfe70101bae7c8f55c6db95d9c36f4c1d308e95
CRs-Fixed: 3235935
Jeevan Kukkalli 3 年之前
父節點
當前提交
2b76805c5a

+ 8 - 0
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.
 	 */

+ 8 - 0
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
 };
 

+ 1 - 0
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;

+ 1 - 0
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 = {

+ 210 - 0
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];

+ 9 - 0
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

+ 1 - 0
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;

+ 31 - 0
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