xref: /wlan-driver/qca-wifi-host-cmn/target_if/cfr/src/target_if_cfr.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #include <target_if_cfr.h>
21*5113495bSYour Name #include <wlan_tgt_def_config.h>
22*5113495bSYour Name #include <target_type.h>
23*5113495bSYour Name #include <hif_hw_version.h>
24*5113495bSYour Name #include <target_if.h>
25*5113495bSYour Name #include <wlan_lmac_if_def.h>
26*5113495bSYour Name #include <wlan_osif_priv.h>
27*5113495bSYour Name #include <init_deinit_lmac.h>
28*5113495bSYour Name #include <wlan_cfr_utils_api.h>
29*5113495bSYour Name #include <wlan_objmgr_pdev_obj.h>
30*5113495bSYour Name #include <target_if_cfr_enh.h>
31*5113495bSYour Name #ifdef CFR_USE_FIXED_FOLDER
32*5113495bSYour Name #include "target_if_cfr_6490.h"
33*5113495bSYour Name #include "target_if_cfr_adrastea.h"
34*5113495bSYour Name #include "wlan_reg_services_api.h"
35*5113495bSYour Name #else
36*5113495bSYour Name #include <target_if_cfr_dbr.h>
37*5113495bSYour Name #endif
38*5113495bSYour Name 
target_if_cfr_stop_capture(struct wlan_objmgr_pdev * pdev,struct wlan_objmgr_peer * peer)39*5113495bSYour Name int target_if_cfr_stop_capture(struct wlan_objmgr_pdev *pdev,
40*5113495bSYour Name 			       struct wlan_objmgr_peer *peer)
41*5113495bSYour Name {
42*5113495bSYour Name 	struct peer_cfr *pe;
43*5113495bSYour Name 	struct peer_cfr_params param = {0};
44*5113495bSYour Name 	struct wmi_unified *pdev_wmi_handle = NULL;
45*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev = {0};
46*5113495bSYour Name 	struct pdev_cfr *pdev_cfrobj;
47*5113495bSYour Name 	int retv = 0;
48*5113495bSYour Name 
49*5113495bSYour Name 	pe = wlan_objmgr_peer_get_comp_private_obj(peer, WLAN_UMAC_COMP_CFR);
50*5113495bSYour Name 	if (pe == NULL)
51*5113495bSYour Name 		return -EINVAL;
52*5113495bSYour Name 
53*5113495bSYour Name 	pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
54*5113495bSYour Name 	if (!pdev_wmi_handle) {
55*5113495bSYour Name 		cfr_err("pdev wmi handle NULL");
56*5113495bSYour Name 		return -EINVAL;
57*5113495bSYour Name 	}
58*5113495bSYour Name 	vdev = wlan_peer_get_vdev(peer);
59*5113495bSYour Name 
60*5113495bSYour Name 	qdf_mem_set(&param, sizeof(param), 0);
61*5113495bSYour Name 
62*5113495bSYour Name 	param.request = PEER_CFR_CAPTURE_DISABLE;
63*5113495bSYour Name 	param.macaddr = wlan_peer_get_macaddr(peer);
64*5113495bSYour Name 	param.vdev_id = wlan_vdev_get_id(vdev);
65*5113495bSYour Name 
66*5113495bSYour Name 	param.periodicity = pe->period;
67*5113495bSYour Name 	param.bandwidth = pe->bandwidth;
68*5113495bSYour Name 	param.capture_method = pe->capture_method;
69*5113495bSYour Name 
70*5113495bSYour Name 	retv = wmi_unified_send_peer_cfr_capture_cmd(pdev_wmi_handle, &param);
71*5113495bSYour Name 
72*5113495bSYour Name 	pdev_cfrobj = wlan_objmgr_pdev_get_comp_private_obj(pdev,
73*5113495bSYour Name 							    WLAN_UMAC_COMP_CFR);
74*5113495bSYour Name 	if (!pdev_cfrobj) {
75*5113495bSYour Name 		cfr_err("pdev object for CFR is null");
76*5113495bSYour Name 		return -EINVAL;
77*5113495bSYour Name 	}
78*5113495bSYour Name 	cfr_err("CFR capture stats for this capture:");
79*5113495bSYour Name 	cfr_err("DBR event count = %llu, Tx event count = %llu "
80*5113495bSYour Name 		"Release count = %llu",
81*5113495bSYour Name 		pdev_cfrobj->dbr_evt_cnt, pdev_cfrobj->tx_evt_cnt,
82*5113495bSYour Name 		pdev_cfrobj->release_cnt);
83*5113495bSYour Name 	cfr_err("tx_peer_status_cfr_fail = %llu",
84*5113495bSYour Name 		pdev_cfrobj->tx_peer_status_cfr_fail = 0);
85*5113495bSYour Name 	cfr_err("tx_evt_status_cfr_fail = %llu",
86*5113495bSYour Name 		pdev_cfrobj->tx_evt_status_cfr_fail);
87*5113495bSYour Name 	cfr_err("tx_dbr_cookie_lookup_fail = %llu",
88*5113495bSYour Name 		pdev_cfrobj->tx_dbr_cookie_lookup_fail);
89*5113495bSYour Name 
90*5113495bSYour Name 	pdev_cfrobj->dbr_evt_cnt = 0;
91*5113495bSYour Name 	pdev_cfrobj->tx_evt_cnt  = 0;
92*5113495bSYour Name 	pdev_cfrobj->release_cnt = 0;
93*5113495bSYour Name 	pdev_cfrobj->tx_peer_status_cfr_fail = 0;
94*5113495bSYour Name 	pdev_cfrobj->tx_evt_status_cfr_fail = 0;
95*5113495bSYour Name 	pdev_cfrobj->tx_dbr_cookie_lookup_fail = 0;
96*5113495bSYour Name 
97*5113495bSYour Name 	return retv;
98*5113495bSYour Name }
99*5113495bSYour Name 
target_if_cfr_start_capture(struct wlan_objmgr_pdev * pdev,struct wlan_objmgr_peer * peer,struct cfr_capture_params * cfr_params)100*5113495bSYour Name int target_if_cfr_start_capture(struct wlan_objmgr_pdev *pdev,
101*5113495bSYour Name 				struct wlan_objmgr_peer *peer,
102*5113495bSYour Name 				struct cfr_capture_params *cfr_params)
103*5113495bSYour Name {
104*5113495bSYour Name 	struct peer_cfr_params param = {0};
105*5113495bSYour Name 	struct wmi_unified *pdev_wmi_handle = NULL;
106*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
107*5113495bSYour Name 	int retv = 0;
108*5113495bSYour Name 
109*5113495bSYour Name 	pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
110*5113495bSYour Name 	if (!pdev_wmi_handle) {
111*5113495bSYour Name 		cfr_err("pdev wmi handle NULL");
112*5113495bSYour Name 		return -EINVAL;
113*5113495bSYour Name 	}
114*5113495bSYour Name 	vdev = wlan_peer_get_vdev(peer);
115*5113495bSYour Name 	qdf_mem_set(&param, sizeof(param), 0);
116*5113495bSYour Name 
117*5113495bSYour Name 	param.request = PEER_CFR_CAPTURE_ENABLE;
118*5113495bSYour Name 	param.macaddr = wlan_peer_get_macaddr(peer);
119*5113495bSYour Name 	param.vdev_id = wlan_vdev_get_id(vdev);
120*5113495bSYour Name 
121*5113495bSYour Name 	param.periodicity = cfr_params->period;
122*5113495bSYour Name 	param.bandwidth = cfr_params->bandwidth;
123*5113495bSYour Name 	param.capture_method = cfr_params->method;
124*5113495bSYour Name 
125*5113495bSYour Name 	retv = wmi_unified_send_peer_cfr_capture_cmd(pdev_wmi_handle, &param);
126*5113495bSYour Name 	return retv;
127*5113495bSYour Name }
128*5113495bSYour Name 
target_if_cfr_periodic_peer_cfr_enable(struct wlan_objmgr_pdev * pdev,uint32_t param_value)129*5113495bSYour Name int target_if_cfr_periodic_peer_cfr_enable(struct wlan_objmgr_pdev *pdev,
130*5113495bSYour Name 					   uint32_t param_value)
131*5113495bSYour Name {
132*5113495bSYour Name 	struct pdev_params pparam;
133*5113495bSYour Name 	uint32_t pdev_id;
134*5113495bSYour Name 	struct wmi_unified *pdev_wmi_handle = NULL;
135*5113495bSYour Name 
136*5113495bSYour Name 	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
137*5113495bSYour Name 	if (pdev_id < 0)
138*5113495bSYour Name 		return -EINVAL;
139*5113495bSYour Name 
140*5113495bSYour Name 	pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
141*5113495bSYour Name 	if (!pdev_wmi_handle) {
142*5113495bSYour Name 		cfr_err("pdev wmi handle NULL");
143*5113495bSYour Name 		return -EINVAL;
144*5113495bSYour Name 	}
145*5113495bSYour Name 	qdf_mem_set(&pparam, sizeof(pparam), 0);
146*5113495bSYour Name 	pparam.param_id = wmi_pdev_param_per_peer_prd_cfr_enable;
147*5113495bSYour Name 	pparam.param_value = param_value;
148*5113495bSYour Name 
149*5113495bSYour Name 	return wmi_unified_pdev_param_send(pdev_wmi_handle,
150*5113495bSYour Name 					   &pparam, pdev_id);
151*5113495bSYour Name }
152*5113495bSYour Name 
target_if_cfr_enable_cfr_timer(struct wlan_objmgr_pdev * pdev,uint32_t cfr_timer)153*5113495bSYour Name int target_if_cfr_enable_cfr_timer(struct wlan_objmgr_pdev *pdev,
154*5113495bSYour Name 				   uint32_t cfr_timer)
155*5113495bSYour Name {
156*5113495bSYour Name 	struct pdev_cfr *pa;
157*5113495bSYour Name 	int retval;
158*5113495bSYour Name 
159*5113495bSYour Name 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
160*5113495bSYour Name 	if (pa == NULL)
161*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
162*5113495bSYour Name 
163*5113495bSYour Name 	if (!cfr_timer) {
164*5113495bSYour Name 	     /* disable periodic cfr capture */
165*5113495bSYour Name 		retval =
166*5113495bSYour Name 	target_if_cfr_periodic_peer_cfr_enable(pdev,
167*5113495bSYour Name 					       WMI_HOST_PEER_CFR_TIMER_DISABLE);
168*5113495bSYour Name 
169*5113495bSYour Name 		if (retval == QDF_STATUS_SUCCESS)
170*5113495bSYour Name 			pa->cfr_timer_enable = 0;
171*5113495bSYour Name 	} else {
172*5113495bSYour Name 	    /* enable periodic cfr capture (default base timer is 10ms ) */
173*5113495bSYour Name 		retval =
174*5113495bSYour Name 	target_if_cfr_periodic_peer_cfr_enable(pdev,
175*5113495bSYour Name 					       WMI_HOST_PEER_CFR_TIMER_ENABLE);
176*5113495bSYour Name 
177*5113495bSYour Name 		if (retval == QDF_STATUS_SUCCESS)
178*5113495bSYour Name 			pa->cfr_timer_enable = 1;
179*5113495bSYour Name 	}
180*5113495bSYour Name 
181*5113495bSYour Name 	return retval;
182*5113495bSYour Name }
183*5113495bSYour Name 
target_if_cfr_get_target_type(struct wlan_objmgr_psoc * psoc)184*5113495bSYour Name int target_if_cfr_get_target_type(struct wlan_objmgr_psoc *psoc)
185*5113495bSYour Name {
186*5113495bSYour Name 	uint32_t target_type = 0;
187*5113495bSYour Name 	struct wlan_lmac_if_target_tx_ops *target_type_tx_ops;
188*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
189*5113495bSYour Name 
190*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
191*5113495bSYour Name 	if (!tx_ops) {
192*5113495bSYour Name 		cfr_err("tx_ops is NULL");
193*5113495bSYour Name 		return target_type;
194*5113495bSYour Name 	}
195*5113495bSYour Name 	target_type_tx_ops = &tx_ops->target_tx_ops;
196*5113495bSYour Name 
197*5113495bSYour Name 	if (target_type_tx_ops->tgt_get_tgt_type)
198*5113495bSYour Name 		target_type = target_type_tx_ops->tgt_get_tgt_type(psoc);
199*5113495bSYour Name 
200*5113495bSYour Name 	return target_type;
201*5113495bSYour Name }
202*5113495bSYour Name 
target_if_cfr_fill_header(struct csi_cfr_header * hdr,bool is_wifi_2_0,uint32_t target_type,bool is_rcc)203*5113495bSYour Name void target_if_cfr_fill_header(struct csi_cfr_header *hdr,
204*5113495bSYour Name 			       bool is_wifi_2_0,
205*5113495bSYour Name 			       uint32_t target_type,
206*5113495bSYour Name 			       bool is_rcc)
207*5113495bSYour Name {
208*5113495bSYour Name 	hdr->cmn.start_magic_num = 0xDEADBEAF;
209*5113495bSYour Name 	hdr->cmn.vendorid = 0x8cfdf0;
210*5113495bSYour Name 	hdr->cmn.pltform_type = CFR_PLATFORM_TYPE_ARM;
211*5113495bSYour Name 	hdr->cmn.cfr_metadata_len = CFR_META_DATA_LEN;
212*5113495bSYour Name 	hdr->cmn.cfr_data_version = CFR_DATA_VERSION_1;
213*5113495bSYour Name 	hdr->cmn.host_real_ts = qdf_ktime_to_ns(qdf_ktime_real_get());
214*5113495bSYour Name 
215*5113495bSYour Name 	if (target_type == TARGET_TYPE_QCA8074V2) {
216*5113495bSYour Name 		hdr->cmn.cfr_metadata_version = CFR_META_VERSION_8;
217*5113495bSYour Name 		hdr->cmn.chip_type = CFR_CAPTURE_RADIO_HKV2;
218*5113495bSYour Name 	} else if (target_type == TARGET_TYPE_QCA9574) {
219*5113495bSYour Name 		hdr->cmn.cfr_metadata_version = CFR_META_VERSION_8;
220*5113495bSYour Name 		hdr->cmn.chip_type = CFR_CAPTURE_RADIO_ALDER;
221*5113495bSYour Name 	} else {
222*5113495bSYour Name 		if ((target_type == TARGET_TYPE_QCN9000) ||
223*5113495bSYour Name 		    (target_type == TARGET_TYPE_QCN9160) ||
224*5113495bSYour Name 		    (target_type == TARGET_TYPE_QCN9224))
225*5113495bSYour Name 			hdr->cmn.cfr_metadata_version = CFR_META_VERSION_9;
226*5113495bSYour Name 		else if (target_type == TARGET_TYPE_QCA5332 ||
227*5113495bSYour Name 			 target_type == TARGET_TYPE_QCN6432 ||
228*5113495bSYour Name 			 target_type == TARGET_TYPE_QCA6490 ||
229*5113495bSYour Name 			 target_type == TARGET_TYPE_QCA6750 ||
230*5113495bSYour Name 			 target_type == TARGET_TYPE_KIWI ||
231*5113495bSYour Name 			 target_type == TARGET_TYPE_MANGO ||
232*5113495bSYour Name 			 target_type == TARGET_TYPE_PEACH ||
233*5113495bSYour Name 			 target_type == TARGET_TYPE_WCN6450)
234*5113495bSYour Name 			hdr->cmn.cfr_metadata_version = CFR_META_VERSION_7;
235*5113495bSYour Name 		else if ((target_type == TARGET_TYPE_QCA6018) ||
236*5113495bSYour Name 			 ((target_type == TARGET_TYPE_QCA5018) && (!is_rcc)))
237*5113495bSYour Name 			hdr->cmn.cfr_metadata_version = CFR_META_VERSION_5;
238*5113495bSYour Name 		else
239*5113495bSYour Name 			hdr->cmn.cfr_metadata_version = CFR_META_VERSION_3;
240*5113495bSYour Name 
241*5113495bSYour Name 		if (target_type == TARGET_TYPE_QCN9000)
242*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_PINE;
243*5113495bSYour Name 		else if (target_type == TARGET_TYPE_QCA5018)
244*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_MAPLE;
245*5113495bSYour Name 		else if (target_type == TARGET_TYPE_QCN6122)
246*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_SPRUCE;
247*5113495bSYour Name 		else if (target_type == TARGET_TYPE_QCN9160)
248*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_YORK;
249*5113495bSYour Name 		else if (target_type == TARGET_TYPE_QCN6432)
250*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_PEBBLE;
251*5113495bSYour Name 		else if (target_type == TARGET_TYPE_QCN9224)
252*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_WAIKIKI;
253*5113495bSYour Name 		else if (target_type == TARGET_TYPE_QCA5332)
254*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_MIAMI;
255*5113495bSYour Name 		else if (target_type == TARGET_TYPE_QCA6490)
256*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_HSP;
257*5113495bSYour Name 		else if (target_type == TARGET_TYPE_QCA6750)
258*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_MOSELLE;
259*5113495bSYour Name 		else if (target_type == TARGET_TYPE_KIWI)
260*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_KIWI;
261*5113495bSYour Name 		else if (target_type == TARGET_TYPE_MANGO)
262*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_MANGO;
263*5113495bSYour Name 		else if (target_type == TARGET_TYPE_PEACH)
264*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_PEACH;
265*5113495bSYour Name 		else if (target_type == TARGET_TYPE_WCN6450)
266*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_EVROS;
267*5113495bSYour Name 		else
268*5113495bSYour Name 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_CYP;
269*5113495bSYour Name 	}
270*5113495bSYour Name }
271*5113495bSYour Name 
272*5113495bSYour Name #ifdef CFR_USE_FIXED_FOLDER
target_if_cfr_init_target(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev,uint32_t target)273*5113495bSYour Name static QDF_STATUS target_if_cfr_init_target(struct wlan_objmgr_psoc *psoc,
274*5113495bSYour Name 					    struct wlan_objmgr_pdev *pdev,
275*5113495bSYour Name 					    uint32_t target)
276*5113495bSYour Name {
277*5113495bSYour Name 	struct pdev_cfr *cfr_pdev;
278*5113495bSYour Name 	struct psoc_cfr *cfr_psoc;
279*5113495bSYour Name 	struct wmi_unified *wmi_handle = NULL;
280*5113495bSYour Name 	bool cfr_capable;
281*5113495bSYour Name 	QDF_STATUS status;
282*5113495bSYour Name 
283*5113495bSYour Name 	if (!psoc || !pdev) {
284*5113495bSYour Name 		cfr_err("null pdev or psoc");
285*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
286*5113495bSYour Name 	}
287*5113495bSYour Name 
288*5113495bSYour Name 	cfr_pdev = wlan_objmgr_pdev_get_comp_private_obj(pdev,
289*5113495bSYour Name 							 WLAN_UMAC_COMP_CFR);
290*5113495bSYour Name 	if (!cfr_pdev) {
291*5113495bSYour Name 		cfr_err("null pdev cfr");
292*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
293*5113495bSYour Name 	}
294*5113495bSYour Name 
295*5113495bSYour Name 	cfr_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
296*5113495bSYour Name 							 WLAN_UMAC_COMP_CFR);
297*5113495bSYour Name 
298*5113495bSYour Name 	if (!cfr_psoc) {
299*5113495bSYour Name 		cfr_err("null psoc cfr");
300*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
301*5113495bSYour Name 	}
302*5113495bSYour Name 
303*5113495bSYour Name 	wmi_handle = lmac_get_pdev_wmi_handle(pdev);
304*5113495bSYour Name 	if (!wmi_handle) {
305*5113495bSYour Name 		cfr_err("null wmi handle");
306*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
307*5113495bSYour Name 	}
308*5113495bSYour Name 
309*5113495bSYour Name 	if (wlan_cfr_is_feature_disabled(pdev)) {
310*5113495bSYour Name 		cfr_pdev->is_cfr_capable = 0;
311*5113495bSYour Name 		cfr_psoc->is_cfr_capable = 0;
312*5113495bSYour Name 		cfr_info("cfr disabled");
313*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
314*5113495bSYour Name 	}
315*5113495bSYour Name 
316*5113495bSYour Name 	cfr_capable = wmi_service_enabled(wmi_handle,
317*5113495bSYour Name 					  wmi_service_cfr_capture_support);
318*5113495bSYour Name 	cfr_pdev->is_cfr_capable = cfr_capable;
319*5113495bSYour Name 	cfr_psoc->is_cfr_capable = cfr_capable;
320*5113495bSYour Name 	if (!cfr_capable) {
321*5113495bSYour Name 		cfr_err("FW doesn't support CFR");
322*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
323*5113495bSYour Name 	}
324*5113495bSYour Name 
325*5113495bSYour Name 	cfr_psoc->is_cfr_pdev_id_soc =
326*5113495bSYour Name 		wmi_service_enabled(wmi_handle,
327*5113495bSYour Name 				    wmi_service_cfr_capture_pdev_id_soc);
328*5113495bSYour Name 	cfr_debug("is_cfr_pdev_id_soc %d", cfr_psoc->is_cfr_pdev_id_soc);
329*5113495bSYour Name 
330*5113495bSYour Name 	status = cfr_enh_init_pdev(psoc, pdev);
331*5113495bSYour Name 	if (target == TARGET_TYPE_QCA6490)
332*5113495bSYour Name 		cfr_pdev->chip_type = CFR_CAPTURE_RADIO_HSP;
333*5113495bSYour Name 	else if (target == TARGET_TYPE_QCA6750)
334*5113495bSYour Name 		cfr_pdev->chip_type = CFR_CAPTURE_RADIO_MOSELLE;
335*5113495bSYour Name 	else if (target == TARGET_TYPE_KIWI)
336*5113495bSYour Name 		cfr_pdev->chip_type = CFR_CAPTURE_RADIO_KIWI;
337*5113495bSYour Name 	else if (target == TARGET_TYPE_MANGO)
338*5113495bSYour Name 		cfr_pdev->chip_type = CFR_CAPTURE_RADIO_MANGO;
339*5113495bSYour Name 	else if (target == TARGET_TYPE_PEACH)
340*5113495bSYour Name 		cfr_pdev->chip_type = CFR_CAPTURE_RADIO_PEACH;
341*5113495bSYour Name 	else if (target == TARGET_TYPE_WCN6450)
342*5113495bSYour Name 		cfr_pdev->chip_type = CFR_CAPTURE_RADIO_EVROS;
343*5113495bSYour Name 
344*5113495bSYour Name 	return status;
345*5113495bSYour Name }
346*5113495bSYour Name 
target_if_cfr_deinit_target(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)347*5113495bSYour Name static QDF_STATUS target_if_cfr_deinit_target(struct wlan_objmgr_psoc *psoc,
348*5113495bSYour Name 					      struct wlan_objmgr_pdev *pdev)
349*5113495bSYour Name {
350*5113495bSYour Name 	struct pdev_cfr *pcfr;
351*5113495bSYour Name 
352*5113495bSYour Name 	if (!psoc || !pdev) {
353*5113495bSYour Name 		cfr_err("null pdev or psoc");
354*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
355*5113495bSYour Name 	}
356*5113495bSYour Name 
357*5113495bSYour Name 	pcfr = wlan_objmgr_pdev_get_comp_private_obj(pdev,
358*5113495bSYour Name 						     WLAN_UMAC_COMP_CFR);
359*5113495bSYour Name 	if (!pcfr) {
360*5113495bSYour Name 		cfr_err("null pdev cfr");
361*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
362*5113495bSYour Name 	}
363*5113495bSYour Name 
364*5113495bSYour Name 	if (!pcfr->is_cfr_capable) {
365*5113495bSYour Name 		cfr_info("cfr disabled or FW not support");
366*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
367*5113495bSYour Name 	}
368*5113495bSYour Name 
369*5113495bSYour Name 	return cfr_enh_deinit_pdev(psoc, pdev);
370*5113495bSYour Name }
371*5113495bSYour Name 
372*5113495bSYour Name QDF_STATUS
target_if_cfr_init_pdev(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)373*5113495bSYour Name target_if_cfr_init_pdev(struct wlan_objmgr_psoc *psoc,
374*5113495bSYour Name 			struct wlan_objmgr_pdev *pdev)
375*5113495bSYour Name {
376*5113495bSYour Name 	uint32_t target_type;
377*5113495bSYour Name 	QDF_STATUS status;
378*5113495bSYour Name 
379*5113495bSYour Name 	target_type = target_if_cfr_get_target_type(psoc);
380*5113495bSYour Name 
381*5113495bSYour Name 	if (target_type == TARGET_TYPE_QCA6490 ||
382*5113495bSYour Name 	    target_type == TARGET_TYPE_QCA6750 ||
383*5113495bSYour Name 	    target_type == TARGET_TYPE_KIWI ||
384*5113495bSYour Name 	    target_type == TARGET_TYPE_MANGO ||
385*5113495bSYour Name 	    target_type == TARGET_TYPE_PEACH ||
386*5113495bSYour Name 	    target_type == TARGET_TYPE_WCN6450) {
387*5113495bSYour Name 		status = target_if_cfr_init_target(psoc,
388*5113495bSYour Name 						   pdev, target_type);
389*5113495bSYour Name 	} else if (target_type == TARGET_TYPE_ADRASTEA) {
390*5113495bSYour Name 		status = cfr_adrastea_init_pdev(psoc, pdev);
391*5113495bSYour Name 	} else {
392*5113495bSYour Name 		cfr_info("unsupported chip");
393*5113495bSYour Name 		status = QDF_STATUS_SUCCESS;
394*5113495bSYour Name 	}
395*5113495bSYour Name 
396*5113495bSYour Name 	return status;
397*5113495bSYour Name }
398*5113495bSYour Name 
399*5113495bSYour Name QDF_STATUS
target_if_cfr_deinit_pdev(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)400*5113495bSYour Name target_if_cfr_deinit_pdev(struct wlan_objmgr_psoc *psoc,
401*5113495bSYour Name 			  struct wlan_objmgr_pdev *pdev)
402*5113495bSYour Name {
403*5113495bSYour Name 	uint32_t target_type;
404*5113495bSYour Name 	QDF_STATUS status;
405*5113495bSYour Name 
406*5113495bSYour Name 	target_type = target_if_cfr_get_target_type(psoc);
407*5113495bSYour Name 
408*5113495bSYour Name 	if (target_type == TARGET_TYPE_QCA6490 ||
409*5113495bSYour Name 	    target_type == TARGET_TYPE_QCA6750 ||
410*5113495bSYour Name 	    target_type == TARGET_TYPE_KIWI ||
411*5113495bSYour Name 	    target_type == TARGET_TYPE_MANGO ||
412*5113495bSYour Name 	    target_type == TARGET_TYPE_PEACH ||
413*5113495bSYour Name 	    target_type == TARGET_TYPE_WCN6450) {
414*5113495bSYour Name 		status = target_if_cfr_deinit_target(psoc, pdev);
415*5113495bSYour Name 	} else if (target_type == TARGET_TYPE_ADRASTEA) {
416*5113495bSYour Name 		status = cfr_adrastea_deinit_pdev(psoc, pdev);
417*5113495bSYour Name 	} else {
418*5113495bSYour Name 		cfr_info("unsupported chip");
419*5113495bSYour Name 		status = QDF_STATUS_SUCCESS;
420*5113495bSYour Name 	}
421*5113495bSYour Name 
422*5113495bSYour Name 	return status;
423*5113495bSYour Name }
424*5113495bSYour Name #else
425*5113495bSYour Name QDF_STATUS
target_if_cfr_init_pdev(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)426*5113495bSYour Name target_if_cfr_init_pdev(struct wlan_objmgr_psoc *psoc,
427*5113495bSYour Name 			struct wlan_objmgr_pdev *pdev)
428*5113495bSYour Name {
429*5113495bSYour Name 	uint32_t target_type;
430*5113495bSYour Name 	struct pdev_cfr *pa;
431*5113495bSYour Name 	struct psoc_cfr *cfr_sc;
432*5113495bSYour Name 
433*5113495bSYour Name 	if (wlan_cfr_is_feature_disabled(pdev)) {
434*5113495bSYour Name 		cfr_err("cfr is disabled");
435*5113495bSYour Name 		return QDF_STATUS_E_NOSUPPORT;
436*5113495bSYour Name 	}
437*5113495bSYour Name 
438*5113495bSYour Name 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
439*5113495bSYour Name 	if (pa == NULL)
440*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
441*5113495bSYour Name 
442*5113495bSYour Name 	/* Reset unassociated entries for every init */
443*5113495bSYour Name 	qdf_mem_zero(&pa->unassoc_pool[0], MAX_CFR_ENABLED_CLIENTS *
444*5113495bSYour Name 		     sizeof(struct unassoc_pool_entry));
445*5113495bSYour Name 
446*5113495bSYour Name 	cfr_sc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
447*5113495bSYour Name 						       WLAN_UMAC_COMP_CFR);
448*5113495bSYour Name 
449*5113495bSYour Name 	if (cfr_sc == NULL)
450*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
451*5113495bSYour Name 
452*5113495bSYour Name 	target_type = target_if_cfr_get_target_type(psoc);
453*5113495bSYour Name 
454*5113495bSYour Name 	if ((target_type == TARGET_TYPE_QCA8074V2) ||
455*5113495bSYour Name 	    (target_type == TARGET_TYPE_QCA9574)) {
456*5113495bSYour Name 		pa->is_cfr_capable = cfr_sc->is_cfr_capable;
457*5113495bSYour Name 		return cfr_dbr_init_pdev(psoc, pdev);
458*5113495bSYour Name 	} else if ((target_type == TARGET_TYPE_QCA6018) ||
459*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCN9000) ||
460*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCN6122) ||
461*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCA5018) ||
462*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCA5332) ||
463*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCN9224) ||
464*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCN9160) ||
465*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCN6432)) {
466*5113495bSYour Name 		pa->is_cfr_capable = cfr_sc->is_cfr_capable;
467*5113495bSYour Name 		return cfr_enh_init_pdev(psoc, pdev);
468*5113495bSYour Name 	} else
469*5113495bSYour Name 		return QDF_STATUS_E_NOSUPPORT;
470*5113495bSYour Name }
471*5113495bSYour Name 
472*5113495bSYour Name QDF_STATUS
target_if_cfr_deinit_pdev(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)473*5113495bSYour Name target_if_cfr_deinit_pdev(struct wlan_objmgr_psoc *psoc,
474*5113495bSYour Name 			  struct wlan_objmgr_pdev *pdev)
475*5113495bSYour Name {
476*5113495bSYour Name 	uint32_t target_type;
477*5113495bSYour Name 
478*5113495bSYour Name 	if (wlan_cfr_is_feature_disabled(pdev)) {
479*5113495bSYour Name 		cfr_err("cfr is disabled");
480*5113495bSYour Name 		return QDF_STATUS_E_NOSUPPORT;
481*5113495bSYour Name 	}
482*5113495bSYour Name 
483*5113495bSYour Name 	target_type = target_if_cfr_get_target_type(psoc);
484*5113495bSYour Name 
485*5113495bSYour Name 	if ((target_type == TARGET_TYPE_QCA8074V2) ||
486*5113495bSYour Name 	    (target_type == TARGET_TYPE_QCA9574)) {
487*5113495bSYour Name 		return cfr_dbr_deinit_pdev(psoc, pdev);
488*5113495bSYour Name 	} else if ((target_type == TARGET_TYPE_QCA6018) ||
489*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCN9000) ||
490*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCN6122) ||
491*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCA5018) ||
492*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCA5332) ||
493*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCN9224) ||
494*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCN9160) ||
495*5113495bSYour Name 		   (target_type == TARGET_TYPE_QCN6432)) {
496*5113495bSYour Name 		return cfr_enh_deinit_pdev(psoc, pdev);
497*5113495bSYour Name 	} else
498*5113495bSYour Name 		return QDF_STATUS_E_NOSUPPORT;
499*5113495bSYour Name }
500*5113495bSYour Name #endif
501*5113495bSYour Name 
502*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
503*5113495bSYour Name #if defined(QCA_WIFI_QCA6490) || defined(QCA_WIFI_KIWI)
target_if_cfr_get_mac_id(struct wlan_objmgr_pdev * pdev)504*5113495bSYour Name static uint8_t target_if_cfr_get_mac_id(struct wlan_objmgr_pdev *pdev)
505*5113495bSYour Name {
506*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
507*5113495bSYour Name 	struct wlan_channel *bss_chan;
508*5113495bSYour Name 	struct pdev_cfr *pcfr;
509*5113495bSYour Name 	uint8_t mac_id = 0;
510*5113495bSYour Name 
511*5113495bSYour Name 	if (!pdev) {
512*5113495bSYour Name 		cfr_err("null pdev");
513*5113495bSYour Name 		return mac_id;
514*5113495bSYour Name 	}
515*5113495bSYour Name 
516*5113495bSYour Name 	mac_id = wlan_objmgr_pdev_get_pdev_id(pdev);
517*5113495bSYour Name 	pcfr = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
518*5113495bSYour Name 	if (!pcfr)  {
519*5113495bSYour Name 		cfr_err("null pcfr");
520*5113495bSYour Name 		return mac_id;
521*5113495bSYour Name 	}
522*5113495bSYour Name 
523*5113495bSYour Name 	if (pcfr->rcc_param.vdev_id == CFR_INVALID_VDEV_ID)
524*5113495bSYour Name 		return mac_id;
525*5113495bSYour Name 
526*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev,
527*5113495bSYour Name 						    pcfr->rcc_param.vdev_id,
528*5113495bSYour Name 						    WLAN_CFR_ID);
529*5113495bSYour Name 	if (!vdev) {
530*5113495bSYour Name 		cfr_err("null vdev");
531*5113495bSYour Name 		return mac_id;
532*5113495bSYour Name 	}
533*5113495bSYour Name 
534*5113495bSYour Name 	bss_chan = wlan_vdev_mlme_get_bss_chan(vdev);
535*5113495bSYour Name 	if (!bss_chan) {
536*5113495bSYour Name 		cfr_info("null bss chan");
537*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_CFR_ID);
538*5113495bSYour Name 		return mac_id;
539*5113495bSYour Name 	}
540*5113495bSYour Name 
541*5113495bSYour Name 	cfr_debug("bss freq %d", bss_chan->ch_freq);
542*5113495bSYour Name 	if (wlan_reg_is_24ghz_ch_freq(bss_chan->ch_freq))
543*5113495bSYour Name 		mac_id = CFR_MAC_ID_24G;
544*5113495bSYour Name 	else
545*5113495bSYour Name 		mac_id = CFR_MAC_ID_5G;
546*5113495bSYour Name 
547*5113495bSYour Name 	pcfr->rcc_param.srng_id = mac_id;
548*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_CFR_ID);
549*5113495bSYour Name 
550*5113495bSYour Name 	return mac_id;
551*5113495bSYour Name }
552*5113495bSYour Name 
target_if_cfr_get_pdev_id_soc(struct wlan_objmgr_pdev * pdev)553*5113495bSYour Name static uint8_t target_if_cfr_get_pdev_id_soc(struct wlan_objmgr_pdev *pdev)
554*5113495bSYour Name {
555*5113495bSYour Name 	/* Host and FW have agreement about using fixed pdev id for
556*5113495bSYour Name 	 * CFR on HMT, FW will get correct mac id if host pass soc
557*5113495bSYour Name 	 * pdev id when start CFR. Since mac id in FW side is
558*5113495bSYour Name 	 * different to legacy chip if it's concurrency case or 2.4GHz
559*5113495bSYour Name 	 * band only case or 5/6GHz band only case.
560*5113495bSYour Name 	 */
561*5113495bSYour Name 	return WMI_HOST_PDEV_ID_SOC;
562*5113495bSYour Name }
563*5113495bSYour Name 
target_if_cfr_get_pdev_id(struct wlan_objmgr_pdev * pdev)564*5113495bSYour Name static uint8_t target_if_cfr_get_pdev_id(struct wlan_objmgr_pdev *pdev)
565*5113495bSYour Name {
566*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
567*5113495bSYour Name 	struct psoc_cfr *cfr_psoc;
568*5113495bSYour Name 	uint8_t pdev_id = 0;
569*5113495bSYour Name 
570*5113495bSYour Name 	if (!pdev) {
571*5113495bSYour Name 		cfr_err("null pdev");
572*5113495bSYour Name 		return pdev_id;
573*5113495bSYour Name 	}
574*5113495bSYour Name 
575*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
576*5113495bSYour Name 	if (!psoc) {
577*5113495bSYour Name 		cfr_err("null psoc");
578*5113495bSYour Name 		return pdev_id;
579*5113495bSYour Name 	}
580*5113495bSYour Name 
581*5113495bSYour Name 	cfr_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
582*5113495bSYour Name 							 WLAN_UMAC_COMP_CFR);
583*5113495bSYour Name 
584*5113495bSYour Name 	if (!cfr_psoc) {
585*5113495bSYour Name 		cfr_err("null psoc cfr");
586*5113495bSYour Name 		return pdev_id;
587*5113495bSYour Name 	}
588*5113495bSYour Name 
589*5113495bSYour Name 	if (cfr_psoc->is_cfr_pdev_id_soc)
590*5113495bSYour Name 		pdev_id = target_if_cfr_get_pdev_id_soc(pdev);
591*5113495bSYour Name 	else
592*5113495bSYour Name 		pdev_id = target_if_cfr_get_mac_id(pdev);
593*5113495bSYour Name 
594*5113495bSYour Name 	cfr_debug("is_cfr_pdev_id_soc %d, pdev_id %d",
595*5113495bSYour Name 		  cfr_psoc->is_cfr_pdev_id_soc, pdev_id);
596*5113495bSYour Name 
597*5113495bSYour Name 	return pdev_id;
598*5113495bSYour Name }
599*5113495bSYour Name #else
target_if_cfr_get_pdev_id(struct wlan_objmgr_pdev * pdev)600*5113495bSYour Name static uint8_t target_if_cfr_get_pdev_id(struct wlan_objmgr_pdev *pdev)
601*5113495bSYour Name {
602*5113495bSYour Name 	return wlan_objmgr_pdev_get_pdev_id(pdev);
603*5113495bSYour Name }
604*5113495bSYour Name #endif /* QCA_WIFI_QCA6490 || QCA_WIFI_KIWI */
605*5113495bSYour Name 
target_if_cfr_config_rcc(struct wlan_objmgr_pdev * pdev,struct cfr_rcc_param * rcc_info)606*5113495bSYour Name QDF_STATUS target_if_cfr_config_rcc(struct wlan_objmgr_pdev *pdev,
607*5113495bSYour Name 				    struct cfr_rcc_param *rcc_info)
608*5113495bSYour Name {
609*5113495bSYour Name 	QDF_STATUS status;
610*5113495bSYour Name 	struct wmi_unified *pdev_wmi_handle = NULL;
611*5113495bSYour Name 
612*5113495bSYour Name 	pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
613*5113495bSYour Name 	if (!pdev_wmi_handle) {
614*5113495bSYour Name 		cfr_err("pdev_wmi_handle is null");
615*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
616*5113495bSYour Name 	}
617*5113495bSYour Name 
618*5113495bSYour Name 	rcc_info->pdev_id = target_if_cfr_get_pdev_id(pdev);
619*5113495bSYour Name 	rcc_info->num_grp_tlvs =
620*5113495bSYour Name 		count_set_bits(rcc_info->modified_in_curr_session);
621*5113495bSYour Name 
622*5113495bSYour Name 	status = wmi_unified_send_cfr_rcc_cmd(pdev_wmi_handle, rcc_info);
623*5113495bSYour Name 	return status;
624*5113495bSYour Name }
625*5113495bSYour Name 
target_if_cfr_default_ta_ra_config(struct cfr_rcc_param * rcc_info,bool allvalid,uint16_t reset_cfg)626*5113495bSYour Name void target_if_cfr_default_ta_ra_config(struct cfr_rcc_param *rcc_info,
627*5113495bSYour Name 					bool allvalid, uint16_t reset_cfg)
628*5113495bSYour Name {
629*5113495bSYour Name 	struct ta_ra_cfr_cfg *curr_cfg = NULL;
630*5113495bSYour Name 	int grp_id;
631*5113495bSYour Name 	unsigned long bitmap = reset_cfg;
632*5113495bSYour Name 	uint8_t def_mac[QDF_MAC_ADDR_SIZE] = {0xFF, 0xFF, 0xFF,
633*5113495bSYour Name 		0xFF, 0xFF, 0xFF};
634*5113495bSYour Name 	uint8_t null_mac[QDF_MAC_ADDR_SIZE] = {0x00, 0x00, 0x00,
635*5113495bSYour Name 		0x00, 0x00, 0x00};
636*5113495bSYour Name 
637*5113495bSYour Name 	for (grp_id = 0; grp_id < MAX_TA_RA_ENTRIES; grp_id++) {
638*5113495bSYour Name 		if (qdf_test_bit(grp_id, &bitmap)) {
639*5113495bSYour Name 			curr_cfg = &rcc_info->curr[grp_id];
640*5113495bSYour Name 			qdf_mem_copy(curr_cfg->tx_addr,
641*5113495bSYour Name 				     null_mac, QDF_MAC_ADDR_SIZE);
642*5113495bSYour Name 			qdf_mem_copy(curr_cfg->tx_addr_mask,
643*5113495bSYour Name 				     def_mac, QDF_MAC_ADDR_SIZE);
644*5113495bSYour Name 			qdf_mem_copy(curr_cfg->rx_addr,
645*5113495bSYour Name 				     null_mac, QDF_MAC_ADDR_SIZE);
646*5113495bSYour Name 			qdf_mem_copy(curr_cfg->rx_addr_mask,
647*5113495bSYour Name 				     def_mac, QDF_MAC_ADDR_SIZE);
648*5113495bSYour Name 			curr_cfg->bw = 0xf;
649*5113495bSYour Name 			curr_cfg->nss = 0xff;
650*5113495bSYour Name 			curr_cfg->mgmt_subtype_filter = 0;
651*5113495bSYour Name 			curr_cfg->ctrl_subtype_filter = 0;
652*5113495bSYour Name 			curr_cfg->data_subtype_filter = 0;
653*5113495bSYour Name 			if (!allvalid) {
654*5113495bSYour Name 				curr_cfg->valid_ta = 0;
655*5113495bSYour Name 				curr_cfg->valid_ta_mask = 0;
656*5113495bSYour Name 				curr_cfg->valid_ra = 0;
657*5113495bSYour Name 				curr_cfg->valid_ra_mask = 0;
658*5113495bSYour Name 				curr_cfg->valid_bw_mask = 0;
659*5113495bSYour Name 				curr_cfg->valid_nss_mask = 0;
660*5113495bSYour Name 				curr_cfg->valid_mgmt_subtype = 0;
661*5113495bSYour Name 				curr_cfg->valid_ctrl_subtype = 0;
662*5113495bSYour Name 				curr_cfg->valid_data_subtype = 0;
663*5113495bSYour Name 			} else {
664*5113495bSYour Name 				curr_cfg->valid_ta = 1;
665*5113495bSYour Name 				curr_cfg->valid_ta_mask = 1;
666*5113495bSYour Name 				curr_cfg->valid_ra = 1;
667*5113495bSYour Name 				curr_cfg->valid_ra_mask = 1;
668*5113495bSYour Name 				curr_cfg->valid_bw_mask = 1;
669*5113495bSYour Name 				curr_cfg->valid_nss_mask = 1;
670*5113495bSYour Name 				curr_cfg->valid_mgmt_subtype = 1;
671*5113495bSYour Name 				curr_cfg->valid_ctrl_subtype = 1;
672*5113495bSYour Name 				curr_cfg->valid_data_subtype = 1;
673*5113495bSYour Name 			}
674*5113495bSYour Name 		}
675*5113495bSYour Name 	}
676*5113495bSYour Name }
677*5113495bSYour Name #endif
678*5113495bSYour Name 
679*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
680*5113495bSYour Name #ifdef CFR_USE_FIXED_FOLDER
target_if_enh_cfr_add_ops(struct wlan_lmac_if_tx_ops * tx_ops)681*5113495bSYour Name static void target_if_enh_cfr_add_ops(struct wlan_lmac_if_tx_ops *tx_ops)
682*5113495bSYour Name {
683*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_subscribe_ppdu_desc =
684*5113495bSYour Name 				target_if_cfr_subscribe_ppdu_desc;
685*5113495bSYour Name }
686*5113495bSYour Name #else
target_if_enh_cfr_add_ops(struct wlan_lmac_if_tx_ops * tx_ops)687*5113495bSYour Name static void target_if_enh_cfr_add_ops(struct wlan_lmac_if_tx_ops *tx_ops)
688*5113495bSYour Name {
689*5113495bSYour Name }
690*5113495bSYour Name #endif /* CFR_USE_FIXED_FOLDER */
target_if_enh_cfr_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)691*5113495bSYour Name static void target_if_enh_cfr_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
692*5113495bSYour Name {
693*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_config_rcc =
694*5113495bSYour Name 		target_if_cfr_config_rcc;
695*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_start_lut_timer =
696*5113495bSYour Name 		target_if_cfr_start_lut_age_timer;
697*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_stop_lut_timer =
698*5113495bSYour Name 		target_if_cfr_stop_lut_age_timer;
699*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_default_ta_ra_cfg =
700*5113495bSYour Name 		target_if_cfr_default_ta_ra_config;
701*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_dump_lut_enh =
702*5113495bSYour Name 		target_if_cfr_dump_lut_enh;
703*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_rx_tlv_process =
704*5113495bSYour Name 		target_if_cfr_rx_tlv_process;
705*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_update_global_cfg =
706*5113495bSYour Name 		target_if_cfr_update_global_cfg;
707*5113495bSYour Name 	target_if_enh_cfr_add_ops(tx_ops);
708*5113495bSYour Name }
709*5113495bSYour Name #else
target_if_enh_cfr_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)710*5113495bSYour Name static void target_if_enh_cfr_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
711*5113495bSYour Name {
712*5113495bSYour Name }
713*5113495bSYour Name #endif
714*5113495bSYour Name 
target_if_cfr_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)715*5113495bSYour Name void target_if_cfr_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
716*5113495bSYour Name {
717*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_init_pdev =
718*5113495bSYour Name 		target_if_cfr_init_pdev;
719*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_deinit_pdev =
720*5113495bSYour Name 		target_if_cfr_deinit_pdev;
721*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_enable_cfr_timer =
722*5113495bSYour Name 		target_if_cfr_enable_cfr_timer;
723*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_start_capture =
724*5113495bSYour Name 		target_if_cfr_start_capture;
725*5113495bSYour Name 	tx_ops->cfr_tx_ops.cfr_stop_capture =
726*5113495bSYour Name 		target_if_cfr_stop_capture;
727*5113495bSYour Name 	target_if_enh_cfr_tx_ops(tx_ops);
728*5113495bSYour Name }
729*5113495bSYour Name 
target_if_cfr_set_cfr_support(struct wlan_objmgr_psoc * psoc,uint8_t value)730*5113495bSYour Name void target_if_cfr_set_cfr_support(struct wlan_objmgr_psoc *psoc,
731*5113495bSYour Name 				   uint8_t value)
732*5113495bSYour Name {
733*5113495bSYour Name 	struct wlan_lmac_if_rx_ops *rx_ops;
734*5113495bSYour Name 
735*5113495bSYour Name 	rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
736*5113495bSYour Name 	if (!rx_ops) {
737*5113495bSYour Name 		cfr_err("rx_ops is NULL");
738*5113495bSYour Name 		return;
739*5113495bSYour Name 	}
740*5113495bSYour Name 	if (rx_ops->cfr_rx_ops.cfr_support_set)
741*5113495bSYour Name 		rx_ops->cfr_rx_ops.cfr_support_set(psoc, value);
742*5113495bSYour Name }
743*5113495bSYour Name 
744*5113495bSYour Name QDF_STATUS
target_if_cfr_set_capture_count_support(struct wlan_objmgr_psoc * psoc,uint8_t value)745*5113495bSYour Name target_if_cfr_set_capture_count_support(struct wlan_objmgr_psoc *psoc,
746*5113495bSYour Name 					uint8_t value)
747*5113495bSYour Name {
748*5113495bSYour Name 	struct wlan_lmac_if_rx_ops *rx_ops;
749*5113495bSYour Name 
750*5113495bSYour Name 	rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
751*5113495bSYour Name 	if (!rx_ops) {
752*5113495bSYour Name 		cfr_err("rx_ops is NULL");
753*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
754*5113495bSYour Name 	}
755*5113495bSYour Name 
756*5113495bSYour Name 	if (rx_ops->cfr_rx_ops.cfr_capture_count_support_set)
757*5113495bSYour Name 		return rx_ops->cfr_rx_ops.cfr_capture_count_support_set(
758*5113495bSYour Name 						psoc, value);
759*5113495bSYour Name 
760*5113495bSYour Name 	return QDF_STATUS_E_INVAL;
761*5113495bSYour Name }
762*5113495bSYour Name 
763*5113495bSYour Name QDF_STATUS
target_if_cfr_set_mo_marking_support(struct wlan_objmgr_psoc * psoc,uint8_t value)764*5113495bSYour Name target_if_cfr_set_mo_marking_support(struct wlan_objmgr_psoc *psoc,
765*5113495bSYour Name 				     uint8_t value)
766*5113495bSYour Name {
767*5113495bSYour Name 	struct wlan_lmac_if_rx_ops *rx_ops;
768*5113495bSYour Name 
769*5113495bSYour Name 	rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
770*5113495bSYour Name 	if (!rx_ops) {
771*5113495bSYour Name 		cfr_err("rx_ops is NULL");
772*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
773*5113495bSYour Name 	}
774*5113495bSYour Name 
775*5113495bSYour Name 	if (rx_ops->cfr_rx_ops.cfr_mo_marking_support_set)
776*5113495bSYour Name 		return rx_ops->cfr_rx_ops.cfr_mo_marking_support_set(
777*5113495bSYour Name 						psoc, value);
778*5113495bSYour Name 
779*5113495bSYour Name 	return QDF_STATUS_E_INVAL;
780*5113495bSYour Name }
781*5113495bSYour Name 
782*5113495bSYour Name QDF_STATUS
target_if_cfr_set_aoa_for_rcc_support(struct wlan_objmgr_psoc * psoc,uint8_t value)783*5113495bSYour Name target_if_cfr_set_aoa_for_rcc_support(struct wlan_objmgr_psoc *psoc,
784*5113495bSYour Name 				      uint8_t value)
785*5113495bSYour Name {
786*5113495bSYour Name 	struct wlan_lmac_if_rx_ops *rx_ops;
787*5113495bSYour Name 
788*5113495bSYour Name 	rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
789*5113495bSYour Name 	if (!rx_ops) {
790*5113495bSYour Name 		cfr_err("rx_ops is NULL");
791*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
792*5113495bSYour Name 	}
793*5113495bSYour Name 
794*5113495bSYour Name 	if (rx_ops->cfr_rx_ops.cfr_aoa_for_rcc_support_set)
795*5113495bSYour Name 		return rx_ops->cfr_rx_ops.cfr_aoa_for_rcc_support_set(
796*5113495bSYour Name 						psoc, value);
797*5113495bSYour Name 
798*5113495bSYour Name 	return QDF_STATUS_E_INVAL;
799*5113495bSYour Name }
800*5113495bSYour Name 
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)801*5113495bSYour Name void target_if_cfr_info_send(struct wlan_objmgr_pdev *pdev, void *head,
802*5113495bSYour Name 			     size_t hlen, void *data, size_t dlen, void *tail,
803*5113495bSYour Name 			     size_t tlen)
804*5113495bSYour Name {
805*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
806*5113495bSYour Name 	struct wlan_lmac_if_rx_ops *rx_ops;
807*5113495bSYour Name 
808*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
809*5113495bSYour Name 
810*5113495bSYour Name 	rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
811*5113495bSYour Name 	if (!rx_ops) {
812*5113495bSYour Name 		cfr_err("rx_ops is NULL");
813*5113495bSYour Name 		return;
814*5113495bSYour Name 	}
815*5113495bSYour Name 	if (rx_ops->cfr_rx_ops.cfr_info_send)
816*5113495bSYour Name 		rx_ops->cfr_rx_ops.cfr_info_send(pdev, head, hlen, data, dlen,
817*5113495bSYour Name 						 tail, tlen);
818*5113495bSYour Name }
819