xref: /wlan-driver/qca-wifi-host-cmn/umac/cfr/dispatcher/src/wlan_cfr_tgt_api.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 /*
21*5113495bSYour Name  * Layer b/w umac and target_if (ol) txops
22*5113495bSYour Name  * It contains wrapers for txops
23*5113495bSYour Name  */
24*5113495bSYour Name 
25*5113495bSYour Name #include <wlan_cfr_tgt_api.h>
26*5113495bSYour Name #include <wlan_cfr_utils_api.h>
27*5113495bSYour Name #include <target_type.h>
28*5113495bSYour Name #include <cfr_defs_i.h>
29*5113495bSYour Name 
tgt_cfr_info_send(struct wlan_objmgr_pdev * pdev,void * head,size_t hlen,void * data,size_t dlen,void * tail,size_t tlen)30*5113495bSYour Name uint32_t tgt_cfr_info_send(struct wlan_objmgr_pdev *pdev, void *head,
31*5113495bSYour Name 			   size_t hlen, void *data, size_t dlen, void *tail,
32*5113495bSYour Name 			   size_t tlen)
33*5113495bSYour Name {
34*5113495bSYour Name 	struct pdev_cfr *pa;
35*5113495bSYour Name 	uint32_t status, total_len;
36*5113495bSYour Name 	uint8_t *nl_data = NULL;
37*5113495bSYour Name 
38*5113495bSYour Name 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
39*5113495bSYour Name 
40*5113495bSYour Name 	if (pa == NULL) {
41*5113495bSYour Name 		cfr_err("pdev_cfr is NULL\n");
42*5113495bSYour Name 		return -1;
43*5113495bSYour Name 	}
44*5113495bSYour Name 
45*5113495bSYour Name 	/* If CFR data transport mode is NL event then send single event*/
46*5113495bSYour Name 	if (pa->nl_cb.cfr_nl_cb) {
47*5113495bSYour Name 		total_len = hlen + dlen + tlen;
48*5113495bSYour Name 
49*5113495bSYour Name 		nl_data = qdf_mem_malloc(total_len);
50*5113495bSYour Name 		if (!nl_data) {
51*5113495bSYour Name 			cfr_err("failed to alloc memory, len %d, vdev_id %d",
52*5113495bSYour Name 				total_len, pa->nl_cb.vdev_id);
53*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
54*5113495bSYour Name 		}
55*5113495bSYour Name 
56*5113495bSYour Name 		if (hlen)
57*5113495bSYour Name 			qdf_mem_copy(nl_data, head, hlen);
58*5113495bSYour Name 
59*5113495bSYour Name 		if (dlen)
60*5113495bSYour Name 			qdf_mem_copy(nl_data + hlen, data, dlen);
61*5113495bSYour Name 
62*5113495bSYour Name 		if (tlen)
63*5113495bSYour Name 			qdf_mem_copy(nl_data + hlen + dlen, tail, tlen);
64*5113495bSYour Name 
65*5113495bSYour Name 		pa->nl_cb.cfr_nl_cb(pa->nl_cb.vdev_id, pa->nl_cb.pid,
66*5113495bSYour Name 				    (const void *)nl_data, total_len);
67*5113495bSYour Name 		qdf_mem_free(nl_data);
68*5113495bSYour Name 
69*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
70*5113495bSYour Name 	}
71*5113495bSYour Name 
72*5113495bSYour Name 	if (head)
73*5113495bSYour Name 		status = cfr_streamfs_write(pa, (const void *)head, hlen);
74*5113495bSYour Name 
75*5113495bSYour Name 	if (data)
76*5113495bSYour Name 		status = cfr_streamfs_write(pa, (const void *)data, dlen);
77*5113495bSYour Name 
78*5113495bSYour Name 	if (tail)
79*5113495bSYour Name 		status = cfr_streamfs_write(pa, (const void *)tail, tlen);
80*5113495bSYour Name 
81*5113495bSYour Name 
82*5113495bSYour Name 	/* finalise the write */
83*5113495bSYour Name 	status = cfr_streamfs_flush(pa);
84*5113495bSYour Name 
85*5113495bSYour Name 	return status;
86*5113495bSYour Name }
87*5113495bSYour Name 
tgt_cfr_support_set(struct wlan_objmgr_psoc * psoc,uint32_t value)88*5113495bSYour Name void tgt_cfr_support_set(struct wlan_objmgr_psoc *psoc, uint32_t value)
89*5113495bSYour Name {
90*5113495bSYour Name 	struct psoc_cfr *cfr_sc;
91*5113495bSYour Name 
92*5113495bSYour Name 	if (psoc == NULL)
93*5113495bSYour Name 		return;
94*5113495bSYour Name 
95*5113495bSYour Name 	cfr_sc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
96*5113495bSYour Name 					WLAN_UMAC_COMP_CFR);
97*5113495bSYour Name 	if (cfr_sc == NULL)
98*5113495bSYour Name 		return;
99*5113495bSYour Name 
100*5113495bSYour Name 	cfr_sc->is_cfr_capable = !!value;
101*5113495bSYour Name 	cfr_debug("CFR: FW support advert=%d", cfr_sc->is_cfr_capable);
102*5113495bSYour Name }
103*5113495bSYour Name 
104*5113495bSYour Name static inline struct wlan_lmac_if_cfr_tx_ops *
wlan_psoc_get_cfr_txops(struct wlan_objmgr_psoc * psoc)105*5113495bSYour Name 	wlan_psoc_get_cfr_txops(struct wlan_objmgr_psoc *psoc)
106*5113495bSYour Name {
107*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
108*5113495bSYour Name 
109*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
110*5113495bSYour Name 	if (!tx_ops) {
111*5113495bSYour Name 		cfr_err("tx_ops is NULL");
112*5113495bSYour Name 		return NULL;
113*5113495bSYour Name 	}
114*5113495bSYour Name 	return &tx_ops->cfr_tx_ops;
115*5113495bSYour Name }
116*5113495bSYour Name 
tgt_cfr_get_target_type(struct wlan_objmgr_psoc * psoc)117*5113495bSYour Name int tgt_cfr_get_target_type(struct wlan_objmgr_psoc *psoc)
118*5113495bSYour Name {
119*5113495bSYour Name 	uint32_t target_type = 0;
120*5113495bSYour Name 	struct wlan_lmac_if_target_tx_ops *target_type_tx_ops;
121*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
122*5113495bSYour Name 
123*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
124*5113495bSYour Name 	if (!tx_ops) {
125*5113495bSYour Name 		cfr_err("tx_ops is NULL");
126*5113495bSYour Name 		return target_type;
127*5113495bSYour Name 	}
128*5113495bSYour Name 	target_type_tx_ops = &tx_ops->target_tx_ops;
129*5113495bSYour Name 
130*5113495bSYour Name 	if (target_type_tx_ops->tgt_get_tgt_type)
131*5113495bSYour Name 		target_type = target_type_tx_ops->tgt_get_tgt_type(psoc);
132*5113495bSYour Name 
133*5113495bSYour Name 	return target_type;
134*5113495bSYour Name }
135*5113495bSYour Name 
tgt_cfr_validate_period(struct wlan_objmgr_psoc * psoc,u_int32_t period)136*5113495bSYour Name int tgt_cfr_validate_period(struct wlan_objmgr_psoc *psoc, u_int32_t period)
137*5113495bSYour Name {
138*5113495bSYour Name 	uint32_t target_type = tgt_cfr_get_target_type(psoc);
139*5113495bSYour Name 	int status = 0;
140*5113495bSYour Name 
141*5113495bSYour Name 	if (target_type == TARGET_TYPE_UNKNOWN) {
142*5113495bSYour Name 		cfr_err("cfr period validation fail due to invalid target type");
143*5113495bSYour Name 		return status;
144*5113495bSYour Name 	}
145*5113495bSYour Name 
146*5113495bSYour Name 	/* Basic check is the period should be between 0 and MAX_CFR_PRD */
147*5113495bSYour Name 	if ((period < 0) || (period > MAX_CFR_PRD)) {
148*5113495bSYour Name 		cfr_err("Invalid period value: %d\n", period);
149*5113495bSYour Name 		return status;
150*5113495bSYour Name 	}
151*5113495bSYour Name 
152*5113495bSYour Name 	if (target_type == TARGET_TYPE_QCN9000 ||
153*5113495bSYour Name 	    target_type == TARGET_TYPE_QCA6018 ||
154*5113495bSYour Name 	    target_type == TARGET_TYPE_QCA8074V2 ||
155*5113495bSYour Name 	    target_type == TARGET_TYPE_QCA5018 ||
156*5113495bSYour Name 	    target_type == TARGET_TYPE_QCA5332 ||
157*5113495bSYour Name 	    target_type == TARGET_TYPE_QCN9224 ||
158*5113495bSYour Name 	    target_type == TARGET_TYPE_QCN6432) {
159*5113495bSYour Name 		/* No additional check required for these targets */
160*5113495bSYour Name 		status = 1;
161*5113495bSYour Name 	} else {
162*5113495bSYour Name 		if (!(period % CFR_MOD_PRD)) {
163*5113495bSYour Name 			status = 1;
164*5113495bSYour Name 		} else {
165*5113495bSYour Name 			cfr_err("Invalid period value. Value must be mod of %d",
166*5113495bSYour Name 				CFR_MOD_PRD);
167*5113495bSYour Name 		}
168*5113495bSYour Name 	}
169*5113495bSYour Name 	return status;
170*5113495bSYour Name }
171*5113495bSYour Name 
tgt_cfr_init_pdev(struct wlan_objmgr_pdev * pdev)172*5113495bSYour Name QDF_STATUS tgt_cfr_init_pdev(struct wlan_objmgr_pdev *pdev)
173*5113495bSYour Name {
174*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
175*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
176*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
177*5113495bSYour Name 
178*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
179*5113495bSYour Name 
180*5113495bSYour Name 	if (cfr_tx_ops->cfr_init_pdev)
181*5113495bSYour Name 		status = cfr_tx_ops->cfr_init_pdev(psoc, pdev);
182*5113495bSYour Name 
183*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
184*5113495bSYour Name 		cfr_err("Error occurred with exit code %d\n", status);
185*5113495bSYour Name 
186*5113495bSYour Name 	return status;
187*5113495bSYour Name }
188*5113495bSYour Name 
tgt_cfr_deinit_pdev(struct wlan_objmgr_pdev * pdev)189*5113495bSYour Name QDF_STATUS tgt_cfr_deinit_pdev(struct wlan_objmgr_pdev *pdev)
190*5113495bSYour Name {
191*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
192*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
193*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
194*5113495bSYour Name 
195*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
196*5113495bSYour Name 
197*5113495bSYour Name 	if (cfr_tx_ops->cfr_deinit_pdev)
198*5113495bSYour Name 		status = cfr_tx_ops->cfr_deinit_pdev(psoc, pdev);
199*5113495bSYour Name 
200*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
201*5113495bSYour Name 		cfr_err("Error occurred with exit code %d\n", status);
202*5113495bSYour Name 
203*5113495bSYour Name 	return status;
204*5113495bSYour Name }
205*5113495bSYour Name 
tgt_cfr_start_capture(struct wlan_objmgr_pdev * pdev,struct wlan_objmgr_peer * peer,struct cfr_capture_params * cfr_params)206*5113495bSYour Name int tgt_cfr_start_capture(struct wlan_objmgr_pdev *pdev,
207*5113495bSYour Name 			  struct wlan_objmgr_peer *peer,
208*5113495bSYour Name 			  struct cfr_capture_params *cfr_params)
209*5113495bSYour Name {
210*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
211*5113495bSYour Name 	int status = 0;
212*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
213*5113495bSYour Name 
214*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
215*5113495bSYour Name 
216*5113495bSYour Name 	if (cfr_tx_ops->cfr_start_capture)
217*5113495bSYour Name 		status = cfr_tx_ops->cfr_start_capture(pdev, peer, cfr_params);
218*5113495bSYour Name 
219*5113495bSYour Name 	if (status != 0)
220*5113495bSYour Name 		cfr_err("Error occurred with exit code %d\n", status);
221*5113495bSYour Name 
222*5113495bSYour Name 	return status;
223*5113495bSYour Name }
224*5113495bSYour Name 
tgt_cfr_stop_capture(struct wlan_objmgr_pdev * pdev,struct wlan_objmgr_peer * peer)225*5113495bSYour Name int tgt_cfr_stop_capture(struct wlan_objmgr_pdev *pdev,
226*5113495bSYour Name 			 struct wlan_objmgr_peer *peer)
227*5113495bSYour Name {
228*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
229*5113495bSYour Name 	int status = 0;
230*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
231*5113495bSYour Name 
232*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
233*5113495bSYour Name 
234*5113495bSYour Name 	if (cfr_tx_ops->cfr_stop_capture)
235*5113495bSYour Name 		status = cfr_tx_ops->cfr_stop_capture(pdev, peer);
236*5113495bSYour Name 
237*5113495bSYour Name 	if (status != 0)
238*5113495bSYour Name 		cfr_err("Error occurred with exit code %d\n", status);
239*5113495bSYour Name 
240*5113495bSYour Name 	return status;
241*5113495bSYour Name }
242*5113495bSYour Name 
243*5113495bSYour Name int
tgt_cfr_enable_cfr_timer(struct wlan_objmgr_pdev * pdev,uint32_t cfr_timer)244*5113495bSYour Name tgt_cfr_enable_cfr_timer(struct wlan_objmgr_pdev *pdev, uint32_t cfr_timer)
245*5113495bSYour Name {
246*5113495bSYour Name 	int status = 0;
247*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
248*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
249*5113495bSYour Name 
250*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
251*5113495bSYour Name 
252*5113495bSYour Name 	if (cfr_tx_ops->cfr_enable_cfr_timer)
253*5113495bSYour Name 		status = cfr_tx_ops->cfr_enable_cfr_timer(pdev, cfr_timer);
254*5113495bSYour Name 
255*5113495bSYour Name 	if (status != 0)
256*5113495bSYour Name 		cfr_err("Error occurred with exit code %d\n", status);
257*5113495bSYour Name 
258*5113495bSYour Name 	return status;
259*5113495bSYour Name }
260*5113495bSYour Name 
261*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
262*5113495bSYour Name QDF_STATUS
tgt_cfr_config_rcc(struct wlan_objmgr_pdev * pdev,struct cfr_rcc_param * rcc_param)263*5113495bSYour Name tgt_cfr_config_rcc(struct wlan_objmgr_pdev *pdev,
264*5113495bSYour Name 		   struct cfr_rcc_param *rcc_param)
265*5113495bSYour Name {
266*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
267*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
268*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
269*5113495bSYour Name 
270*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
271*5113495bSYour Name 
272*5113495bSYour Name 	if (cfr_tx_ops->cfr_config_rcc)
273*5113495bSYour Name 		status = cfr_tx_ops->cfr_config_rcc(pdev, rcc_param);
274*5113495bSYour Name 
275*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
276*5113495bSYour Name 		cfr_err("Error occurred with exit code %d\n", status);
277*5113495bSYour Name 
278*5113495bSYour Name 	return status;
279*5113495bSYour Name }
280*5113495bSYour Name 
tgt_cfr_start_lut_age_timer(struct wlan_objmgr_pdev * pdev)281*5113495bSYour Name void tgt_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev)
282*5113495bSYour Name {
283*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
284*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
285*5113495bSYour Name 
286*5113495bSYour Name 	if (!psoc) {
287*5113495bSYour Name 		cfr_err("Invalid PSOC: Flush LUT Timer cannot be started\n");
288*5113495bSYour Name 		return;
289*5113495bSYour Name 	}
290*5113495bSYour Name 
291*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
292*5113495bSYour Name 
293*5113495bSYour Name 	if (cfr_tx_ops->cfr_start_lut_timer)
294*5113495bSYour Name 		cfr_tx_ops->cfr_start_lut_timer(pdev);
295*5113495bSYour Name }
296*5113495bSYour Name 
tgt_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev * pdev)297*5113495bSYour Name void tgt_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev *pdev)
298*5113495bSYour Name {
299*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
300*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
301*5113495bSYour Name 
302*5113495bSYour Name 	if (!psoc) {
303*5113495bSYour Name 		cfr_err("Invalid PSOC: Flush LUT Timer cannot be stopped\n");
304*5113495bSYour Name 		return;
305*5113495bSYour Name 	}
306*5113495bSYour Name 
307*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
308*5113495bSYour Name 
309*5113495bSYour Name 	if (cfr_tx_ops->cfr_stop_lut_timer)
310*5113495bSYour Name 		cfr_tx_ops->cfr_stop_lut_timer(pdev);
311*5113495bSYour Name }
312*5113495bSYour Name 
tgt_cfr_default_ta_ra_cfg(struct wlan_objmgr_pdev * pdev,struct cfr_rcc_param * rcc_param,bool allvalid,uint16_t reset_cfg)313*5113495bSYour Name void tgt_cfr_default_ta_ra_cfg(struct wlan_objmgr_pdev *pdev,
314*5113495bSYour Name 			       struct cfr_rcc_param *rcc_param,
315*5113495bSYour Name 			       bool allvalid, uint16_t reset_cfg)
316*5113495bSYour Name {
317*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
318*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
319*5113495bSYour Name 
320*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
321*5113495bSYour Name 
322*5113495bSYour Name 	if (cfr_tx_ops->cfr_default_ta_ra_cfg)
323*5113495bSYour Name 		cfr_tx_ops->cfr_default_ta_ra_cfg(rcc_param,
324*5113495bSYour Name 						 allvalid, reset_cfg);
325*5113495bSYour Name }
326*5113495bSYour Name 
tgt_cfr_dump_lut_enh(struct wlan_objmgr_pdev * pdev)327*5113495bSYour Name void tgt_cfr_dump_lut_enh(struct wlan_objmgr_pdev *pdev)
328*5113495bSYour Name {
329*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
330*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
331*5113495bSYour Name 
332*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
333*5113495bSYour Name 
334*5113495bSYour Name 	if (cfr_tx_ops->cfr_dump_lut_enh)
335*5113495bSYour Name 		cfr_tx_ops->cfr_dump_lut_enh(pdev);
336*5113495bSYour Name }
337*5113495bSYour Name 
tgt_cfr_rx_tlv_process(struct wlan_objmgr_pdev * pdev,void * nbuf)338*5113495bSYour Name void tgt_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
339*5113495bSYour Name {
340*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
341*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
342*5113495bSYour Name 
343*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
344*5113495bSYour Name 
345*5113495bSYour Name 	if (cfr_tx_ops->cfr_rx_tlv_process)
346*5113495bSYour Name 		cfr_tx_ops->cfr_rx_tlv_process(pdev, nbuf);
347*5113495bSYour Name }
348*5113495bSYour Name 
tgt_cfr_update_global_cfg(struct wlan_objmgr_pdev * pdev)349*5113495bSYour Name void tgt_cfr_update_global_cfg(struct wlan_objmgr_pdev *pdev)
350*5113495bSYour Name {
351*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
352*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
353*5113495bSYour Name 
354*5113495bSYour Name 	if (!psoc) {
355*5113495bSYour Name 		cfr_err("Invalid PSOC:Cannot update global config.\n");
356*5113495bSYour Name 		return;
357*5113495bSYour Name 	}
358*5113495bSYour Name 
359*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
360*5113495bSYour Name 
361*5113495bSYour Name 	if (cfr_tx_ops->cfr_update_global_cfg)
362*5113495bSYour Name 		cfr_tx_ops->cfr_update_global_cfg(pdev);
363*5113495bSYour Name }
364*5113495bSYour Name 
tgt_cfr_subscribe_ppdu_desc(struct wlan_objmgr_pdev * pdev,bool is_subscribe)365*5113495bSYour Name QDF_STATUS tgt_cfr_subscribe_ppdu_desc(struct wlan_objmgr_pdev *pdev,
366*5113495bSYour Name 				       bool is_subscribe)
367*5113495bSYour Name {
368*5113495bSYour Name 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
369*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
370*5113495bSYour Name 
371*5113495bSYour Name 	if (!psoc) {
372*5113495bSYour Name 		cfr_err("Invalid psoc\n");
373*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
374*5113495bSYour Name 	}
375*5113495bSYour Name 
376*5113495bSYour Name 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
377*5113495bSYour Name 
378*5113495bSYour Name 	if (cfr_tx_ops->cfr_subscribe_ppdu_desc)
379*5113495bSYour Name 		return cfr_tx_ops->cfr_subscribe_ppdu_desc(pdev,
380*5113495bSYour Name 							   is_subscribe);
381*5113495bSYour Name 
382*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
383*5113495bSYour Name }
384*5113495bSYour Name 
385*5113495bSYour Name QDF_STATUS
tgt_cfr_capture_count_support_set(struct wlan_objmgr_psoc * psoc,uint32_t value)386*5113495bSYour Name tgt_cfr_capture_count_support_set(struct wlan_objmgr_psoc *psoc,
387*5113495bSYour Name 				  uint32_t value)
388*5113495bSYour Name {
389*5113495bSYour Name 	struct psoc_cfr *cfr_sc;
390*5113495bSYour Name 
391*5113495bSYour Name 	if (!psoc) {
392*5113495bSYour Name 		cfr_err("CFR: NULL PSOC!!");
393*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
394*5113495bSYour Name 	}
395*5113495bSYour Name 
396*5113495bSYour Name 	cfr_sc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
397*5113495bSYour Name 						       WLAN_UMAC_COMP_CFR);
398*5113495bSYour Name 
399*5113495bSYour Name 	if (!cfr_sc) {
400*5113495bSYour Name 		cfr_err("Failed to get CFR component priv obj!!");
401*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
402*5113495bSYour Name 	}
403*5113495bSYour Name 
404*5113495bSYour Name 	cfr_sc->is_cap_interval_mode_sel_support = !!value;
405*5113495bSYour Name 	cfr_debug("CFR: cap_interval_mode_sel_support is %s\n",
406*5113495bSYour Name 		  (cfr_sc->is_cap_interval_mode_sel_support) ?
407*5113495bSYour Name 		  "enabled" :
408*5113495bSYour Name 		  "disabled");
409*5113495bSYour Name 
410*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
411*5113495bSYour Name }
412*5113495bSYour Name 
413*5113495bSYour Name QDF_STATUS
tgt_cfr_mo_marking_support_set(struct wlan_objmgr_psoc * psoc,uint32_t value)414*5113495bSYour Name tgt_cfr_mo_marking_support_set(struct wlan_objmgr_psoc *psoc, uint32_t value)
415*5113495bSYour Name {
416*5113495bSYour Name 	struct psoc_cfr *cfr_sc;
417*5113495bSYour Name 
418*5113495bSYour Name 	if (!psoc) {
419*5113495bSYour Name 		cfr_err("CFR: NULL PSOC!!");
420*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
421*5113495bSYour Name 	}
422*5113495bSYour Name 
423*5113495bSYour Name 	cfr_sc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
424*5113495bSYour Name 						       WLAN_UMAC_COMP_CFR);
425*5113495bSYour Name 	if (!cfr_sc) {
426*5113495bSYour Name 		cfr_err("Failed to get CFR component priv obj!!");
427*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
428*5113495bSYour Name 	}
429*5113495bSYour Name 
430*5113495bSYour Name 	cfr_sc->is_mo_marking_support = !!value;
431*5113495bSYour Name 	cfr_debug("CFR: mo_marking_support is %s\n",
432*5113495bSYour Name 		  (cfr_sc->is_mo_marking_support) ? "enabled" : "disabled");
433*5113495bSYour Name 
434*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
435*5113495bSYour Name }
436*5113495bSYour Name 
437*5113495bSYour Name QDF_STATUS
tgt_cfr_aoa_for_rcc_support_set(struct wlan_objmgr_psoc * psoc,uint32_t value)438*5113495bSYour Name tgt_cfr_aoa_for_rcc_support_set(struct wlan_objmgr_psoc *psoc, uint32_t value)
439*5113495bSYour Name {
440*5113495bSYour Name 	struct psoc_cfr *cfr_sc;
441*5113495bSYour Name 
442*5113495bSYour Name 	if (!psoc) {
443*5113495bSYour Name 		cfr_err("CFR: NULL PSOC!!");
444*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
445*5113495bSYour Name 	}
446*5113495bSYour Name 
447*5113495bSYour Name 	cfr_sc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
448*5113495bSYour Name 						       WLAN_UMAC_COMP_CFR);
449*5113495bSYour Name 
450*5113495bSYour Name 	if (!cfr_sc) {
451*5113495bSYour Name 		cfr_err("Failed to get CFR component priv obj!!");
452*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
453*5113495bSYour Name 	}
454*5113495bSYour Name 
455*5113495bSYour Name 	cfr_sc->is_aoa_for_rcc_support = !!value;
456*5113495bSYour Name 	cfr_debug("CFR: aoa_for_rcc_support is %s\n",
457*5113495bSYour Name 		  (cfr_sc->is_aoa_for_rcc_support) ? "enabled" : "disabled");
458*5113495bSYour Name 
459*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
460*5113495bSYour Name }
461*5113495bSYour Name #else
462*5113495bSYour Name QDF_STATUS
tgt_cfr_capture_count_support_set(struct wlan_objmgr_psoc * psoc,uint32_t value)463*5113495bSYour Name tgt_cfr_capture_count_support_set(struct wlan_objmgr_psoc *psoc,
464*5113495bSYour Name 				  uint32_t value)
465*5113495bSYour Name {
466*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
467*5113495bSYour Name }
468*5113495bSYour Name 
469*5113495bSYour Name QDF_STATUS
tgt_cfr_mo_marking_support_set(struct wlan_objmgr_psoc * psoc,uint32_t value)470*5113495bSYour Name tgt_cfr_mo_marking_support_set(struct wlan_objmgr_psoc *psoc,
471*5113495bSYour Name 			       uint32_t value)
472*5113495bSYour Name {
473*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
474*5113495bSYour Name }
475*5113495bSYour Name 
476*5113495bSYour Name QDF_STATUS
tgt_cfr_aoa_for_rcc_support_set(struct wlan_objmgr_psoc * psoc,uint32_t value)477*5113495bSYour Name tgt_cfr_aoa_for_rcc_support_set(struct wlan_objmgr_psoc *psoc, uint32_t value)
478*5113495bSYour Name {
479*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
480*5113495bSYour Name }
481*5113495bSYour Name #endif
482