From 282b71f64016f6369720864a4a236a4c7a82a417 Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Wed, 22 Jul 2020 21:24:39 +0530 Subject: [PATCH] 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 --- target_if/cfr/inc/target_if_cfr.h | 23 ++++++++++++++++ target_if/cfr/src/target_if_cfr.c | 38 +++++++++++++++++++++++++++ target_if/cfr/src/target_if_cfr_enh.c | 12 +++++++++ 3 files changed, 73 insertions(+) diff --git a/target_if/cfr/inc/target_if_cfr.h b/target_if/cfr/inc/target_if_cfr.h index 0f4ebddfef5b..237aaee8dfc5 100644 --- a/target_if/cfr/inc/target_if_cfr.h +++ b/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 diff --git a/target_if/cfr/src/target_if_cfr.c b/target_if/cfr/src/target_if_cfr.c index 17bd5d5b6fdb..09b7dedcc8d6 100644 --- a/target_if/cfr/src/target_if_cfr.c +++ b/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) diff --git a/target_if/cfr/src/target_if_cfr_enh.c b/target_if/cfr/src/target_if_cfr_enh.c index adc3df8392e3..9cd0cd8b82fd 100644 --- a/target_if/cfr/src/target_if_cfr_enh.c +++ b/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);