浏览代码

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
Wu Gao 9 年之前
父节点
当前提交
b4cc9a28bb

+ 5 - 0
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

+ 63 - 1
target_if/cfr/src/target_if_cfr.c

@@ -29,6 +29,7 @@
 #include <target_if_cfr_6018.h>
 #ifdef CFR_USE_FIXED_FOLDER
 #include "target_if_cfr_6490.h"
+#include "wlan_reg_services_api.h"
 #else
 #include <target_if_cfr_8074v2.h>
 #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);
 

+ 9 - 4
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);

+ 5 - 0
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;

+ 3 - 0
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.