diff --git a/target_if/cfr/inc/target_if_cfr_6490.h b/target_if/cfr/inc/target_if_cfr_6490.h index b995d292ffc7..94b149c84a7a 100644 --- a/target_if/cfr/inc/target_if_cfr_6490.h +++ b/target_if/cfr/inc/target_if_cfr_6490.h @@ -26,6 +26,11 @@ #ifndef _TARGET_IF_CFR_6490_H #define _TARGET_IF_CFR_6490_H +#ifdef QCA_WIFI_QCA6490 +#define CFR_MAC_ID_24G 1 +#define CFR_MAC_ID_5G 0 +#endif /* QCA_WIFI_QCA6490 */ + /** * target_if_cfr_subscribe_ppdu_desc() - subscribe ppdu description * for CFR component diff --git a/target_if/cfr/src/target_if_cfr.c b/target_if/cfr/src/target_if_cfr.c index 9c95256e6b5d..f6f0628723b7 100644 --- a/target_if/cfr/src/target_if_cfr.c +++ b/target_if/cfr/src/target_if_cfr.c @@ -29,6 +29,7 @@ #include #ifdef CFR_USE_FIXED_FOLDER #include "target_if_cfr_6490.h" +#include "wlan_reg_services_api.h" #else #include #endif @@ -269,6 +270,67 @@ int target_if_cfr_deinit_pdev(struct wlan_objmgr_psoc *psoc, #endif #ifdef WLAN_ENH_CFR_ENABLE +#ifdef QCA_WIFI_QCA6490 +static uint8_t target_if_cfr_get_mac_id(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_channel *bss_chan; + struct pdev_cfr *pcfr; + uint8_t mac_id = 0; + + if (!pdev) { + cfr_err("null pdev"); + return mac_id; + } + + mac_id = wlan_objmgr_pdev_get_pdev_id(pdev); + pcfr = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR); + if (!pcfr) { + cfr_err("null pcfr"); + return mac_id; + } + + if (pcfr->rcc_param.vdev_id == CFR_INVALID_VDEV_ID) + return mac_id; + + vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, + pcfr->rcc_param.vdev_id, + WLAN_CFR_ID); + if (!vdev) { + cfr_err("null vdev"); + return mac_id; + } + + bss_chan = wlan_vdev_mlme_get_bss_chan(vdev); + if (!bss_chan) { + cfr_info("null bss chan"); + wlan_objmgr_vdev_release_ref(vdev, WLAN_CFR_ID); + return mac_id; + } + + cfr_debug("bss freq %d", bss_chan->ch_freq); + if (wlan_reg_is_24ghz_ch_freq(bss_chan->ch_freq)) + mac_id = CFR_MAC_ID_24G; + else + mac_id = CFR_MAC_ID_5G; + + pcfr->rcc_param.srng_id = mac_id; + wlan_objmgr_vdev_release_ref(vdev, WLAN_CFR_ID); + + return mac_id; +} + +static uint8_t target_if_cfr_get_pdev_id(struct wlan_objmgr_pdev *pdev) +{ + return target_if_cfr_get_mac_id(pdev); +} +#else +static uint8_t target_if_cfr_get_pdev_id(struct wlan_objmgr_pdev *pdev) +{ + return wlan_objmgr_pdev_get_pdev_id(pdev); +} +#endif /* QCA_WIFI_QCA6490 */ + QDF_STATUS target_if_cfr_config_rcc(struct wlan_objmgr_pdev *pdev, struct cfr_rcc_param *rcc_info) { @@ -281,7 +343,7 @@ QDF_STATUS target_if_cfr_config_rcc(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_E_NULL_VALUE; } - rcc_info->pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); + rcc_info->pdev_id = target_if_cfr_get_pdev_id(pdev); rcc_info->num_grp_tlvs = count_set_bits(rcc_info->modified_in_curr_session); diff --git a/target_if/cfr/src/target_if_cfr_6018.c b/target_if/cfr/src/target_if_cfr_6018.c index e11b12592b53..ba5526c30acc 100644 --- a/target_if/cfr/src/target_if_cfr_6018.c +++ b/target_if/cfr/src/target_if_cfr_6018.c @@ -602,6 +602,7 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) QDF_STATUS retval = 0; struct wlan_lmac_if_cfr_rx_ops *cfr_rx_ops = NULL; struct cfr_metadata_version_3 *meta = NULL; + uint8_t srng_id = 0; if (qdf_unlikely(!pdev)) { cfr_err("pdev is null\n"); @@ -640,9 +641,9 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) buf_addr = (cfr_info->rtt_che_buffer_pointer_low32 | ((uint64_t)buf_addr_extn << 32)); - + srng_id = pcfr->rcc_param.srng_id; if (target_if_dbr_cookie_lookup(pdev, DBR_MODULE_CFR, buf_addr, - &cookie, 0)) { + &cookie, srng_id)) { cfr_debug("Cookie lookup failure for addr: 0x%pK", (void *)((uintptr_t)buf_addr)); goto relref; @@ -741,7 +742,7 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) dump_metadata(header, cookie); release_lut_entry_enh(pdev, lut); target_if_dbr_buf_release(pdev, DBR_MODULE_CFR, buf_addr, - cookie, 0); + cookie, srng_id); cfr_debug("Data sent to upper layers, release look up table"); } else if (status == STATUS_HOLD) { cfr_debug("HOLD for buffer address: 0x%pK cookie: %u", @@ -1364,6 +1365,7 @@ static os_timer_func(lut_ageout_timer_task) struct wlan_objmgr_pdev *pdev = NULL; struct look_up_table *lut = NULL; uint64_t diff, cur_tstamp; + uint8_t srng_id = 0; OS_GET_TIMER_ARG(pcfr, struct pdev_cfr*); @@ -1378,6 +1380,7 @@ static os_timer_func(lut_ageout_timer_task) return; } + srng_id = pcfr->rcc_param.srng_id; if (wlan_objmgr_pdev_try_get_ref(pdev, WLAN_CFR_ID) != QDF_STATUS_SUCCESS) { cfr_err("failed to get pdev reference"); @@ -1402,7 +1405,7 @@ static os_timer_func(lut_ageout_timer_task) (void *)((uintptr_t)lut->dbr_address)); target_if_dbr_buf_release(pdev, DBR_MODULE_CFR, lut->dbr_address, - i, 0); + i, srng_id); pcfr->flush_timeout_dbr_cnt++; release_lut_entry_enh(pdev, lut); } @@ -1560,6 +1563,8 @@ QDF_STATUS cfr_6018_init_pdev(struct wlan_objmgr_psoc *psoc, pcfr->rcc_param.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); pcfr->rcc_param.modified_in_curr_session = MAX_RESET_CFG_ENTRY; pcfr->rcc_param.num_grp_tlvs = MAX_TA_RA_ENTRIES; + pcfr->rcc_param.vdev_id = CFR_INVALID_VDEV_ID; + pcfr->rcc_param.srng_id = 0; target_if_cfr_default_ta_ra_config(&pcfr->rcc_param, true, MAX_RESET_CFG_ENTRY); diff --git a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h index 7e40b74d4bab..cf5922e26762 100644 --- a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h +++ b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h @@ -49,6 +49,7 @@ #define NUM_CHAN_CAPTURE_REASON 6 #define MAX_TA_RA_ENTRIES 16 #define MAX_RESET_CFG_ENTRY 0xFFFF +#define CFR_INVALID_VDEV_ID 0xff #endif enum cfrmetaversion { @@ -373,6 +374,8 @@ struct ta_ra_cfr_cfg { /** * struct cfr_rcc_param - structure to store cfr config param * pdev_id: pdev_id for identifying the MAC + * vdev_id: vdev_id of current rcc configures + * srng_id: srng id of current rcc configures * capture_duration: Capture Duration field for which CFR capture has to happen, * in microsecond units * capture_interval: Capture interval field which is time in between @@ -400,6 +403,8 @@ struct ta_ra_cfr_cfg { */ struct cfr_rcc_param { uint8_t pdev_id; + uint8_t vdev_id; + uint8_t srng_id; uint32_t capture_duration; uint32_t capture_interval; uint32_t ul_mu_user_mask_lower; diff --git a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c b/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c index 00e5b50b0d9e..cb9eee2627d9 100644 --- a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c +++ b/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c @@ -970,6 +970,9 @@ QDF_STATUS ucfg_cfr_committed_rcc_config(struct wlan_objmgr_vdev *vdev) wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID); return QDF_STATUS_E_NULL_VALUE; } + + pcfr->rcc_param.vdev_id = wlan_vdev_get_id(vdev); + /* * If capture mode is valid, then Host: * Subscribes for PPDU status TLVs in monitor status ring.