Selaa lähdekoodia

qcacmn: Support CFR capture_count and MO marking requirement

Support a new capture_interval_mode: capture_count, where after
capture_count+1 number of frames, MAC stops channel capture and
waits for capture_interval duration before enabling again.

Add nob(capture_intervalmode_sel) to switch to capture_count or
capture_duration mode in wlanconfig application, where
capture_intervalmode_sel=0 indicates the old capture_durarion
mode where MAC stops channel capture after capture_duration
instead of capture_count. capture_intervalmode_sel=1 indicates
the capture_count mode.

Support MO marking: Current ENH CFR uses the existing MD/MO,
type/subtype filters to filterin the packets with programmed
type/subtype as either MD/MO. But for m_TARA it is also required
to consider the bw/nss/ta/ra setting. Therefore, it is possible
that not all the filtered-in PPDUs have channel capture and lead
to processing of packets which does not have captured data.
To overcome this issue, from QCN9000 onwards, MAC has MO marking
feature added for M_TARA filter mode, where MAC will consider
all TARA group configuration as filterin criteria & provides
an option to HOST to choose either filterin mode as FP or MO.
en_ta_ra_filter_in_as_fp is added to support MO marking.
Based on the discussion between HOST, FW & MAC teams, 0 is the
recommended & default setting for en_ta_ra_filter_in_as_fp.
Add nob to configure en_ta_ra_filter_in_as_fp but do not expose
to user.

Change-Id: I790d7ce500a7d779ea571635690f73dbc582cf33
Shwetha G K 5 vuotta sitten
vanhempi
sitoutus
282b71f640

+ 23 - 0
target_if/cfr/inc/target_if_cfr.h

@@ -131,6 +131,29 @@ int target_if_cfr_get_target_type(struct wlan_objmgr_psoc *psoc);
 void target_if_cfr_set_cfr_support(struct wlan_objmgr_psoc *psoc,
 				   uint8_t value);
 
+/**
+ * target_if_cfr_set_capture_count_support() - Function to set capture count
+ *					       support.
+ * @psoc: pointer to psoc object
+ * @value: value to be set
+ *
+ * Return: success/failure
+ */
+QDF_STATUS
+target_if_cfr_set_capture_count_support(struct wlan_objmgr_psoc *psoc,
+					uint8_t value);
+
+/**
+ * target_if_cfr_set_mo_marking_support() - Function to set MO marking support
+ * @psoc: pointer to psoc object
+ * @value: value to be set
+ *
+ * Return: success/failure
+ */
+QDF_STATUS
+target_if_cfr_set_mo_marking_support(struct wlan_objmgr_psoc *psoc,
+				     uint8_t value);
+
 /**
  * target_if_cfr_info_send() - Function to send cfr info to upper layers
  * @pdev: pointer to pdev object

+ 38 - 0
target_if/cfr/src/target_if_cfr.c

@@ -509,6 +509,44 @@ void target_if_cfr_set_cfr_support(struct wlan_objmgr_psoc *psoc,
 		rx_ops->cfr_rx_ops.cfr_support_set(psoc, value);
 }
 
+QDF_STATUS
+target_if_cfr_set_capture_count_support(struct wlan_objmgr_psoc *psoc,
+					uint8_t value)
+{
+	struct wlan_lmac_if_rx_ops *rx_ops;
+
+	rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
+	if (!rx_ops) {
+		cfr_err("rx_ops is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (rx_ops->cfr_rx_ops.cfr_capture_count_support_set)
+		return rx_ops->cfr_rx_ops.cfr_capture_count_support_set(
+						psoc, value);
+
+	return QDF_STATUS_E_INVAL;
+}
+
+QDF_STATUS
+target_if_cfr_set_mo_marking_support(struct wlan_objmgr_psoc *psoc,
+				     uint8_t value)
+{
+	struct wlan_lmac_if_rx_ops *rx_ops;
+
+	rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
+	if (!rx_ops) {
+		cfr_err("rx_ops is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (rx_ops->cfr_rx_ops.cfr_mo_marking_support_set)
+		return rx_ops->cfr_rx_ops.cfr_mo_marking_support_set(
+						psoc, value);
+
+	return QDF_STATUS_E_INVAL;
+}
+
 void target_if_cfr_info_send(struct wlan_objmgr_pdev *pdev, void *head,
 			     size_t hlen, void *data, size_t dlen, void *tail,
 			     size_t tlen)

+ 12 - 0
target_if/cfr/src/target_if_cfr_enh.c

@@ -1642,6 +1642,7 @@ QDF_STATUS cfr_enh_init_pdev(struct wlan_objmgr_psoc *psoc,
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	struct pdev_cfr *pcfr;
 	uint32_t target_type;
+	struct psoc_cfr *cfr_sc;
 
 	if (!pdev) {
 		cfr_err("PDEV is NULL!");
@@ -1660,6 +1661,14 @@ QDF_STATUS cfr_enh_init_pdev(struct wlan_objmgr_psoc *psoc,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
+	cfr_sc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
+						       WLAN_UMAC_COMP_CFR);
+
+	if (!cfr_sc) {
+		cfr_err("cfr_sc is NULL");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
 	target_type = target_if_cfr_get_target_type(psoc);
 
 #if DIRECT_BUF_RX_ENABLE
@@ -1682,6 +1691,9 @@ QDF_STATUS cfr_enh_init_pdev(struct wlan_objmgr_psoc *psoc,
 	pcfr->rcc_param.num_grp_tlvs = MAX_TA_RA_ENTRIES;
 	pcfr->rcc_param.vdev_id = CFR_INVALID_VDEV_ID;
 	pcfr->rcc_param.srng_id = DEFAULT_SRNGID_CFR;
+	pcfr->is_cap_interval_mode_sel_support =
+				cfr_sc->is_cap_interval_mode_sel_support;
+	pcfr->is_mo_marking_support = cfr_sc->is_mo_marking_support;
 
 	target_if_cfr_default_ta_ra_config(&pcfr->rcc_param,
 					   true, MAX_RESET_CFG_ENTRY);