From b4cc9a28bb396cb7cf7943af8eda91e122cd9fe3 Mon Sep 17 00:00:00 2001 From: Wu Gao Date: Mon, 22 Aug 2016 17:45:01 +0800 Subject: [PATCH] qcacmn: Set mac id based on the working band FW requires to receive WMI_CFR_CAPTURE_FILTER_CMDID with the pdev id which is based on the working band. It requires srng id when looking up or releasing DMA address. So add this change to check working band and set mac id. This is MCL only change. Change-Id: I763a25b4989607128b2b4c75186eb5bdcd204077 CRs-Fixed: 2641268 --- target_if/cfr/inc/target_if_cfr_6490.h | 5 ++ target_if/cfr/src/target_if_cfr.c | 64 +++++++++++++++++++- target_if/cfr/src/target_if_cfr_6018.c | 13 ++-- umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h | 5 ++ umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c | 3 + 5 files changed, 85 insertions(+), 5 deletions(-) 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.