Browse Source

qcacmn: Fix monitor filter config

For beryllium target in monitor mode host only subscribe
to MSDU end and MPDU start tlvs, but during monitor mode
up as part of monitor filter reset host is subscribing to
all the tlvs.

To fix the issue only subscribe to MSDU end and MPDU start tlvs
on target basis

Change-Id: I1599559b1af0b5121a7c361db403da857988cc01
CRs-Fixed: 3429044
Amit Mehta 2 years ago
parent
commit
4a4820f85a

+ 3 - 3
dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c

@@ -265,7 +265,7 @@ static void dp_mon_filter_set_reset_mcopy_dest(struct dp_pdev *pdev,
 
 	/* Set the filter */
 	if (pfilter->valid) {
-		dp_mon_filter_set_mon_cmn(mon_pdev, pfilter);
+		dp_mon_filter_set_mon_cmn(pdev, pfilter);
 
 		pfilter->tlv_filter.fp_data_filter = 0;
 		pfilter->tlv_filter.mo_data_filter = 0;
@@ -438,7 +438,7 @@ void dp_mon_filter_set_reset_rx_enh_capture_dest(struct dp_pdev *pdev,
 
 	/* Set the filter */
 	if (pfilter->valid) {
-		dp_mon_filter_set_mon_cmn(mon_pdev, pfilter);
+		dp_mon_filter_set_mon_cmn(pdev, pfilter);
 
 		pfilter->tlv_filter.fp_mgmt_filter = 0;
 		pfilter->tlv_filter.fp_ctrl_filter = 0;
@@ -563,7 +563,7 @@ static void dp_mon_filter_set_reset_mon_dest(struct dp_pdev *pdev,
 
 	/* set the filter */
 	if (pfilter->valid) {
-		dp_mon_filter_set_mon_cmn(mon_pdev, pfilter);
+		dp_mon_filter_set_mon_cmn(pdev, pfilter);
 
 		dp_mon_filter_show_filter(mon_pdev, mode, pfilter);
 		mon_pdev->filter[mode][srng_type] = *pfilter;

+ 30 - 1
dp/wifi3.0/monitor/dp_mon_filter.c

@@ -622,9 +622,37 @@ dp_mon_filter_reset_mon_srng(struct dp_soc *soc, struct dp_pdev *pdev,
 	}
 }
 
-void dp_mon_filter_set_mon_cmn(struct dp_mon_pdev *mon_pdev,
+/**
+ * dp_mon_filter_adjust() - adjust the mon filters per target basis
+ * @pdev: DP pdev handle
+ * @filter: DP mon filter
+ *
+ * Return: None
+ */
+static inline
+void dp_mon_filter_adjust(struct dp_pdev *pdev, struct dp_mon_filter *filter)
+{
+	struct dp_soc *soc = pdev->soc;
+
+	switch (hal_get_target_type(soc->hal_soc)) {
+	case TARGET_TYPE_KIWI:
+	case TARGET_TYPE_MANGO:
+	case TARGET_TYPE_PEACH:
+		filter->tlv_filter.msdu_start = 0;
+		filter->tlv_filter.mpdu_end = 0;
+		filter->tlv_filter.packet_header = 0;
+		filter->tlv_filter.attention = 0;
+		break;
+	default:
+		break;
+	}
+}
+
+void dp_mon_filter_set_mon_cmn(struct dp_pdev *pdev,
 			       struct dp_mon_filter *filter)
 {
+	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
+
 	filter->tlv_filter.mpdu_start = 1;
 	filter->tlv_filter.msdu_start = 1;
 	filter->tlv_filter.packet = 1;
@@ -650,6 +678,7 @@ void dp_mon_filter_set_mon_cmn(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.offset_valid = false;
+	dp_mon_filter_adjust(pdev, filter);
 }
 
 void dp_mon_filter_set_status_cmn(struct dp_mon_pdev *mon_pdev,

+ 3 - 3
dp/wifi3.0/monitor/dp_mon_filter.h

@@ -434,12 +434,12 @@ dp_mon_filter_reset_mon_srng(struct dp_soc *soc, struct dp_pdev *pdev,
 
 /**
  * dp_mon_filter_set_mon_cmn() - Setp the common mon filters
- * @mon_pdev: DP pdev handle
+ * @pdev: DP pdev handle
  * @filter: DP mon filter
  *
- * Return: QDF_STATUS
+ * Return: None
  */
-void dp_mon_filter_set_mon_cmn(struct dp_mon_pdev *mon_pdev,
+void dp_mon_filter_set_mon_cmn(struct dp_pdev *pdev,
 			       struct dp_mon_filter *filter);
 
 /**