xref: /wlan-driver/qca-wifi-host-cmn/umac/cfr/dispatcher/src/wlan_cfr_ucfg_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) 2022-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 <wlan_cfr_ucfg_api.h>
21*5113495bSYour Name #include "cfr_defs_i.h"
22*5113495bSYour Name #include <wlan_cfr_utils_api.h>
23*5113495bSYour Name #include <wlan_cfr_tgt_api.h>
24*5113495bSYour Name #include <wlan_objmgr_peer_obj.h>
25*5113495bSYour Name #include <wlan_objmgr_pdev_obj.h>
26*5113495bSYour Name #include <qdf_module.h>
27*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
28*5113495bSYour Name #include "cdp_txrx_ctrl.h"
29*5113495bSYour Name #endif
30*5113495bSYour Name 
31*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
cfr_is_filter_enabled(struct cfr_rcc_param * rcc_param)32*5113495bSYour Name static bool cfr_is_filter_enabled(struct cfr_rcc_param *rcc_param)
33*5113495bSYour Name {
34*5113495bSYour Name 	if (rcc_param->m_directed_ftm ||
35*5113495bSYour Name 	    rcc_param->m_all_ftm_ack ||
36*5113495bSYour Name 	    rcc_param->m_ndpa_ndp_directed ||
37*5113495bSYour Name 	    rcc_param->m_ndpa_ndp_all ||
38*5113495bSYour Name 	    rcc_param->m_ta_ra_filter ||
39*5113495bSYour Name 	    rcc_param->m_all_packet)
40*5113495bSYour Name 		return true;
41*5113495bSYour Name 	else
42*5113495bSYour Name 		return false;
43*5113495bSYour Name }
44*5113495bSYour Name 
cfr_is_rcc_enabled(struct pdev_cfr * pa)45*5113495bSYour Name static bool cfr_is_rcc_enabled(struct pdev_cfr *pa)
46*5113495bSYour Name {
47*5113495bSYour Name 	if (pa->is_cfr_rcc_capable &&
48*5113495bSYour Name 	    cfr_is_filter_enabled(&pa->rcc_param))
49*5113495bSYour Name 		return true;
50*5113495bSYour Name 	else
51*5113495bSYour Name 		return false;
52*5113495bSYour Name }
53*5113495bSYour Name #else
cfr_is_rcc_enabled(struct pdev_cfr * pa)54*5113495bSYour Name static bool cfr_is_rcc_enabled(struct pdev_cfr *pa)
55*5113495bSYour Name {
56*5113495bSYour Name 	return false;
57*5113495bSYour Name }
58*5113495bSYour Name #endif
ucfg_cfr_start_capture(struct wlan_objmgr_pdev * pdev,struct wlan_objmgr_peer * peer,struct cfr_capture_params * params)59*5113495bSYour Name int ucfg_cfr_start_capture(struct wlan_objmgr_pdev *pdev,
60*5113495bSYour Name 			   struct wlan_objmgr_peer *peer,
61*5113495bSYour Name 			   struct cfr_capture_params *params)
62*5113495bSYour Name {
63*5113495bSYour Name 	int status;
64*5113495bSYour Name 	struct pdev_cfr *pa;
65*5113495bSYour Name 	struct peer_cfr *pe;
66*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
67*5113495bSYour Name 
68*5113495bSYour Name 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
69*5113495bSYour Name 	if (NULL == pa) {
70*5113495bSYour Name 		cfr_err("PDEV cfr object is NULL!");
71*5113495bSYour Name 		return -EINVAL;
72*5113495bSYour Name 	}
73*5113495bSYour Name 
74*5113495bSYour Name 	if (!(pa->is_cfr_capable)) {
75*5113495bSYour Name 		cfr_err("cfr is not supported on this chip");
76*5113495bSYour Name 		return -EINVAL;
77*5113495bSYour Name 	}
78*5113495bSYour Name 
79*5113495bSYour Name 	/* Get peer private object */
80*5113495bSYour Name 	pe = wlan_objmgr_peer_get_comp_private_obj(peer, WLAN_UMAC_COMP_CFR);
81*5113495bSYour Name 	if (NULL == pe) {
82*5113495bSYour Name 		cfr_err("PEER cfr object is NULL!");
83*5113495bSYour Name 		return -EINVAL;
84*5113495bSYour Name 	}
85*5113495bSYour Name 
86*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
87*5113495bSYour Name 	if (!psoc) {
88*5113495bSYour Name 		cfr_err("psoc is null!");
89*5113495bSYour Name 		return -EINVAL;
90*5113495bSYour Name 	}
91*5113495bSYour Name 
92*5113495bSYour Name 	if (!(tgt_cfr_validate_period(psoc, params->period)))
93*5113495bSYour Name 		return -EINVAL;
94*5113495bSYour Name 
95*5113495bSYour Name 	if (!(params->period) && (pa->cfr_timer_enable)) {
96*5113495bSYour Name 		cfr_err("Single shot capture is not allowed during periodic capture");
97*5113495bSYour Name 		return -EINVAL;
98*5113495bSYour Name 	}
99*5113495bSYour Name 
100*5113495bSYour Name 	if ((params->period) && !(pa->cfr_timer_enable)) {
101*5113495bSYour Name 		cfr_err("Global periodic timer is not enabled, configure global cfr timer");
102*5113495bSYour Name 	}
103*5113495bSYour Name 
104*5113495bSYour Name 	if (params->period) {
105*5113495bSYour Name 		if (pa->cfr_current_sta_count == pa->cfr_max_sta_count) {
106*5113495bSYour Name 			cfr_err("max periodic cfr clients reached");
107*5113495bSYour Name 			return -EINVAL;
108*5113495bSYour Name 		}
109*5113495bSYour Name 		if (!(pe->request))
110*5113495bSYour Name 			pa->cfr_current_sta_count++;
111*5113495bSYour Name 	}
112*5113495bSYour Name 
113*5113495bSYour Name 	if (cfr_is_rcc_enabled(pa)) {
114*5113495bSYour Name 		cfr_err("This is not allowed since RCC is enabled");
115*5113495bSYour Name 		pa->cfr_timer_enable = 0;
116*5113495bSYour Name 		return -EINVAL;
117*5113495bSYour Name 	}
118*5113495bSYour Name 
119*5113495bSYour Name 	status = tgt_cfr_start_capture(pdev, peer, params);
120*5113495bSYour Name 
121*5113495bSYour Name 	if (status == 0) {
122*5113495bSYour Name 		pe->bandwidth = params->bandwidth;
123*5113495bSYour Name 		pe->period = params->period;
124*5113495bSYour Name 		pe->capture_method = params->method;
125*5113495bSYour Name 		pe->request = PEER_CFR_CAPTURE_ENABLE;
126*5113495bSYour Name 	} else
127*5113495bSYour Name 		pa->cfr_current_sta_count--;
128*5113495bSYour Name 
129*5113495bSYour Name 	return status;
130*5113495bSYour Name }
131*5113495bSYour Name 
ucfg_cfr_start_capture_probe_req(struct wlan_objmgr_pdev * pdev,struct qdf_mac_addr * unassoc_mac,struct cfr_capture_params * params)132*5113495bSYour Name int ucfg_cfr_start_capture_probe_req(struct wlan_objmgr_pdev *pdev,
133*5113495bSYour Name 				     struct qdf_mac_addr *unassoc_mac,
134*5113495bSYour Name 				     struct cfr_capture_params *params)
135*5113495bSYour Name {
136*5113495bSYour Name 	int idx, idx_to_insert = -1;
137*5113495bSYour Name 	struct pdev_cfr *pa;
138*5113495bSYour Name 
139*5113495bSYour Name 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
140*5113495bSYour Name 	if (!pa) {
141*5113495bSYour Name 		cfr_err("Pdev cfr object is null!");
142*5113495bSYour Name 		return -EINVAL;
143*5113495bSYour Name 	}
144*5113495bSYour Name 
145*5113495bSYour Name 	if (!(pa->is_cfr_capable)) {
146*5113495bSYour Name 		cfr_err("CFR is not supported on this chip");
147*5113495bSYour Name 		return -EINVAL;
148*5113495bSYour Name 	}
149*5113495bSYour Name 
150*5113495bSYour Name 	if (pa->cfr_current_sta_count == pa->cfr_max_sta_count) {
151*5113495bSYour Name 		cfr_err("max cfr client reached");
152*5113495bSYour Name 		return -EINVAL;
153*5113495bSYour Name 	}
154*5113495bSYour Name 
155*5113495bSYour Name 	for (idx = 0; idx < MAX_CFR_ENABLED_CLIENTS; idx++) {
156*5113495bSYour Name 		/* Store first invalid entry's index, to add mac entry if not
157*5113495bSYour Name 		 * already present.
158*5113495bSYour Name 		 */
159*5113495bSYour Name 		if (idx_to_insert < 0) {
160*5113495bSYour Name 			if (pa->unassoc_pool[idx].is_valid != true)
161*5113495bSYour Name 				idx_to_insert = idx;
162*5113495bSYour Name 		}
163*5113495bSYour Name 
164*5113495bSYour Name 		/* Add new mac entry only if it is not present. If already
165*5113495bSYour Name 		 * present, update the capture parameters
166*5113495bSYour Name 		 */
167*5113495bSYour Name 		if (qdf_mem_cmp(&pa->unassoc_pool[idx].mac, unassoc_mac,
168*5113495bSYour Name 				sizeof(struct qdf_mac_addr)) == 0) {
169*5113495bSYour Name 			cfr_info("Node already present. Updating params");
170*5113495bSYour Name 			qdf_mem_copy(&pa->unassoc_pool[idx].cfr_params,
171*5113495bSYour Name 				     params,
172*5113495bSYour Name 				     sizeof(struct cfr_capture_params));
173*5113495bSYour Name 			pa->unassoc_pool[idx].is_valid = true;
174*5113495bSYour Name 			return 0;
175*5113495bSYour Name 		}
176*5113495bSYour Name 	}
177*5113495bSYour Name 
178*5113495bSYour Name 	if (idx_to_insert < 0) {
179*5113495bSYour Name 		/* All the entries in the table are valid. So we have reached
180*5113495bSYour Name 		 * max client capacity. To add a new client, capture on one of
181*5113495bSYour Name 		 * the clients in table has to be stopped.
182*5113495bSYour Name 		 */
183*5113495bSYour Name 		cfr_err("Maximum client capacity reached");
184*5113495bSYour Name 		return -EINVAL;
185*5113495bSYour Name 	}
186*5113495bSYour Name 
187*5113495bSYour Name 	/* If control reaches here, we did not find mac in the table
188*5113495bSYour Name 	 * and we have atleast one free entry in table.
189*5113495bSYour Name 	 * Add the entry at index = idx_to_insert
190*5113495bSYour Name 	 */
191*5113495bSYour Name 	qdf_mem_copy(&pa->unassoc_pool[idx_to_insert].mac,
192*5113495bSYour Name 		     unassoc_mac, sizeof(struct qdf_mac_addr));
193*5113495bSYour Name 	qdf_mem_copy(&pa->unassoc_pool[idx_to_insert].cfr_params,
194*5113495bSYour Name 		     params, sizeof(struct cfr_capture_params));
195*5113495bSYour Name 	pa->unassoc_pool[idx_to_insert].is_valid = true;
196*5113495bSYour Name 	pa->cfr_current_sta_count++;
197*5113495bSYour Name 
198*5113495bSYour Name 	return 0;
199*5113495bSYour Name }
200*5113495bSYour Name 
ucfg_cfr_stop_capture_probe_req(struct wlan_objmgr_pdev * pdev,struct qdf_mac_addr * unassoc_mac)201*5113495bSYour Name int ucfg_cfr_stop_capture_probe_req(struct wlan_objmgr_pdev *pdev,
202*5113495bSYour Name 				    struct qdf_mac_addr *unassoc_mac)
203*5113495bSYour Name {
204*5113495bSYour Name 	struct pdev_cfr *pa;
205*5113495bSYour Name 	int idx;
206*5113495bSYour Name 
207*5113495bSYour Name 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
208*5113495bSYour Name 	if (!pa) {
209*5113495bSYour Name 		cfr_err("Pdev cfr object is NULL!");
210*5113495bSYour Name 		return -EINVAL;
211*5113495bSYour Name 	}
212*5113495bSYour Name 
213*5113495bSYour Name 	if (!(pa->is_cfr_capable)) {
214*5113495bSYour Name 		cfr_err("CFR is not supported on this chip");
215*5113495bSYour Name 		return -EINVAL;
216*5113495bSYour Name 	}
217*5113495bSYour Name 
218*5113495bSYour Name 	for (idx = 0; idx < MAX_CFR_ENABLED_CLIENTS; idx++) {
219*5113495bSYour Name 		/* Remove mac only if it is present */
220*5113495bSYour Name 		if (qdf_mem_cmp(&pa->unassoc_pool[idx].mac, unassoc_mac,
221*5113495bSYour Name 				sizeof(struct qdf_mac_addr)) == 0) {
222*5113495bSYour Name 			qdf_mem_zero(&pa->unassoc_pool[idx],
223*5113495bSYour Name 				     sizeof(struct unassoc_pool_entry));
224*5113495bSYour Name 			pa->cfr_current_sta_count--;
225*5113495bSYour Name 			return 0;
226*5113495bSYour Name 		}
227*5113495bSYour Name 	}
228*5113495bSYour Name 
229*5113495bSYour Name 	/* If mac was present in pool it would have been deleted in the
230*5113495bSYour Name 	 * above loop and returned from there.
231*5113495bSYour Name 	 * If control reached here, mac was not found. So, ignore the request.
232*5113495bSYour Name 	 */
233*5113495bSYour Name 	cfr_err("Trying to delete mac not present in pool. Ignoring request.");
234*5113495bSYour Name 	return 0;
235*5113495bSYour Name }
236*5113495bSYour Name 
ucfg_cfr_set_timer(struct wlan_objmgr_pdev * pdev,uint32_t value)237*5113495bSYour Name int ucfg_cfr_set_timer(struct wlan_objmgr_pdev *pdev, uint32_t value)
238*5113495bSYour Name {
239*5113495bSYour Name 	struct pdev_cfr *pa;
240*5113495bSYour Name 
241*5113495bSYour Name 	if (wlan_cfr_is_feature_disabled(pdev)) {
242*5113495bSYour Name 		cfr_err("cfr is disabled");
243*5113495bSYour Name 		return QDF_STATUS_E_NOSUPPORT;
244*5113495bSYour Name 	}
245*5113495bSYour Name 
246*5113495bSYour Name 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
247*5113495bSYour Name 	if (pa == NULL) {
248*5113495bSYour Name 		cfr_err("PDEV cfr object is NULL!");
249*5113495bSYour Name 		return -EINVAL;
250*5113495bSYour Name 	}
251*5113495bSYour Name 
252*5113495bSYour Name 	if (!(pa->is_cfr_capable)) {
253*5113495bSYour Name 		cfr_err("cfr is not supported on this chip");
254*5113495bSYour Name 		return -EINVAL;
255*5113495bSYour Name 	}
256*5113495bSYour Name 
257*5113495bSYour Name 	return tgt_cfr_enable_cfr_timer(pdev, value);
258*5113495bSYour Name }
259*5113495bSYour Name qdf_export_symbol(ucfg_cfr_set_timer);
260*5113495bSYour Name 
ucfg_cfr_get_timer(struct wlan_objmgr_pdev * pdev)261*5113495bSYour Name int ucfg_cfr_get_timer(struct wlan_objmgr_pdev *pdev)
262*5113495bSYour Name {
263*5113495bSYour Name 	struct pdev_cfr *pa;
264*5113495bSYour Name 
265*5113495bSYour Name 	if (wlan_cfr_is_feature_disabled(pdev)) {
266*5113495bSYour Name 		cfr_err("cfr is disabled");
267*5113495bSYour Name 		return QDF_STATUS_E_NOSUPPORT;
268*5113495bSYour Name 	}
269*5113495bSYour Name 
270*5113495bSYour Name 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
271*5113495bSYour Name 	if (pa == NULL) {
272*5113495bSYour Name 		cfr_err("PDEV cfr object is NULL!");
273*5113495bSYour Name 		return -EINVAL;
274*5113495bSYour Name 	}
275*5113495bSYour Name 
276*5113495bSYour Name 	if (!(pa->is_cfr_capable)) {
277*5113495bSYour Name 		cfr_err("cfr is not supported on this chip");
278*5113495bSYour Name 		return -EINVAL;
279*5113495bSYour Name 	}
280*5113495bSYour Name 
281*5113495bSYour Name 	return pa->cfr_timer_enable;
282*5113495bSYour Name }
283*5113495bSYour Name qdf_export_symbol(ucfg_cfr_get_timer);
284*5113495bSYour Name 
cfr_iter_peer_handler(struct wlan_objmgr_pdev * pdev,void * object,void * arg)285*5113495bSYour Name static void cfr_iter_peer_handler(struct wlan_objmgr_pdev *pdev,
286*5113495bSYour Name 				  void *object, void *arg)
287*5113495bSYour Name {
288*5113495bSYour Name 	struct wlan_objmgr_peer *peer = (struct wlan_objmgr_peer *)object;
289*5113495bSYour Name 	struct peer_cfr *pe;
290*5113495bSYour Name 	int *cfr_capt_status = (int *)arg;
291*5113495bSYour Name 
292*5113495bSYour Name 	if (*cfr_capt_status == PEER_CFR_CAPTURE_ENABLE)
293*5113495bSYour Name 		return;
294*5113495bSYour Name 
295*5113495bSYour Name 	if (!peer || !pdev) {
296*5113495bSYour Name 		cfr_err("peer or pdev object is NULL");
297*5113495bSYour Name 		return;
298*5113495bSYour Name 	}
299*5113495bSYour Name 
300*5113495bSYour Name 	if (wlan_vdev_get_selfpeer(peer->peer_objmgr.vdev) == peer)
301*5113495bSYour Name 		return;
302*5113495bSYour Name 
303*5113495bSYour Name 	pe = wlan_objmgr_peer_get_comp_private_obj(peer, WLAN_UMAC_COMP_CFR);
304*5113495bSYour Name 	if (!pe) {
305*5113495bSYour Name 		cfr_err("PEER cfr object is NULL!");
306*5113495bSYour Name 		return;
307*5113495bSYour Name 	}
308*5113495bSYour Name 
309*5113495bSYour Name 	if (pe->period && (pe->request == PEER_CFR_CAPTURE_ENABLE)) {
310*5113495bSYour Name 		*cfr_capt_status = pe->request;
311*5113495bSYour Name 		cfr_debug("CFR capture running for peer "
312*5113495bSYour Name 			  QDF_MAC_ADDR_FMT,
313*5113495bSYour Name 			  QDF_MAC_ADDR_REF(peer->macaddr));
314*5113495bSYour Name 	}
315*5113495bSYour Name }
316*5113495bSYour Name 
ucfg_cfr_get_capture_status(struct wlan_objmgr_pdev * pdev,enum cfr_capt_status * status)317*5113495bSYour Name void ucfg_cfr_get_capture_status(struct wlan_objmgr_pdev *pdev,
318*5113495bSYour Name 				 enum cfr_capt_status *status)
319*5113495bSYour Name {
320*5113495bSYour Name 	*status = PEER_CFR_CAPTURE_DISABLE;
321*5113495bSYour Name 
322*5113495bSYour Name 	wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_PEER_OP,
323*5113495bSYour Name 					  cfr_iter_peer_handler,
324*5113495bSYour Name 					  status, 1, WLAN_CFR_ID);
325*5113495bSYour Name }
326*5113495bSYour Name qdf_export_symbol(ucfg_cfr_get_capture_status);
327*5113495bSYour Name 
ucfg_cfr_stop_capture(struct wlan_objmgr_pdev * pdev,struct wlan_objmgr_peer * peer)328*5113495bSYour Name int ucfg_cfr_stop_capture(struct wlan_objmgr_pdev *pdev,
329*5113495bSYour Name 			  struct wlan_objmgr_peer *peer)
330*5113495bSYour Name {
331*5113495bSYour Name 	int status;
332*5113495bSYour Name 	struct peer_cfr *pe;
333*5113495bSYour Name 	struct pdev_cfr *pa;
334*5113495bSYour Name 
335*5113495bSYour Name 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
336*5113495bSYour Name 	if (pa == NULL) {
337*5113495bSYour Name 		cfr_err("PDEV cfr object is NULL!");
338*5113495bSYour Name 		return -EINVAL;
339*5113495bSYour Name 	}
340*5113495bSYour Name 
341*5113495bSYour Name 	if (!(pa->is_cfr_capable)) {
342*5113495bSYour Name 		cfr_err("cfr is not supported on this chip");
343*5113495bSYour Name 		return -EINVAL;
344*5113495bSYour Name 	}
345*5113495bSYour Name 
346*5113495bSYour Name 	pe = wlan_objmgr_peer_get_comp_private_obj(peer, WLAN_UMAC_COMP_CFR);
347*5113495bSYour Name 	if (pe == NULL) {
348*5113495bSYour Name 		cfr_err("PEER cfr object is NULL!");
349*5113495bSYour Name 		return -EINVAL;
350*5113495bSYour Name 	}
351*5113495bSYour Name 
352*5113495bSYour Name 	if ((pe->period) && (pe->request))
353*5113495bSYour Name 		status = tgt_cfr_stop_capture(pdev, peer);
354*5113495bSYour Name 	else {
355*5113495bSYour Name 		cfr_err("periodic cfr not started for the client");
356*5113495bSYour Name 		return -EINVAL;
357*5113495bSYour Name 	}
358*5113495bSYour Name 
359*5113495bSYour Name 	if (status == 0) {
360*5113495bSYour Name 		pe->request = PEER_CFR_CAPTURE_DISABLE;
361*5113495bSYour Name 		pa->cfr_current_sta_count--;
362*5113495bSYour Name 	}
363*5113495bSYour Name 
364*5113495bSYour Name 	return status;
365*5113495bSYour Name }
366*5113495bSYour Name 
ucfg_cfr_list_peers(struct wlan_objmgr_pdev * pdev)367*5113495bSYour Name int ucfg_cfr_list_peers(struct wlan_objmgr_pdev *pdev)
368*5113495bSYour Name {
369*5113495bSYour Name 	return 0;
370*5113495bSYour Name }
371*5113495bSYour Name 
ucfg_cfr_stop_indication(struct wlan_objmgr_vdev * vdev)372*5113495bSYour Name QDF_STATUS ucfg_cfr_stop_indication(struct wlan_objmgr_vdev *vdev)
373*5113495bSYour Name {
374*5113495bSYour Name 	if (!vdev) {
375*5113495bSYour Name 		cfr_err("null vdev");
376*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
377*5113495bSYour Name 	}
378*5113495bSYour Name 
379*5113495bSYour Name 	return cfr_stop_indication(vdev);
380*5113495bSYour Name }
381*5113495bSYour Name 
382*5113495bSYour Name #ifdef WLAN_CFR_ADRASTEA
ucfg_cfr_capture_data(struct wlan_objmgr_psoc * psoc,uint32_t vdev_id,struct csi_cfr_header * hdr,uint32_t mem_index)383*5113495bSYour Name void ucfg_cfr_capture_data(struct wlan_objmgr_psoc *psoc, uint32_t vdev_id,
384*5113495bSYour Name 			   struct csi_cfr_header *hdr, uint32_t mem_index)
385*5113495bSYour Name {
386*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
387*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
388*5113495bSYour Name 	struct pdev_cfr *pcfr;
389*5113495bSYour Name 	uint32_t end_magic_num = 0xBEAFDEAD;
390*5113495bSYour Name 	void *vaddr, *payload;
391*5113495bSYour Name 	u32 *rindex, *windex, payload_len;
392*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
393*5113495bSYour Name 
394*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
395*5113495bSYour Name 						    WLAN_CFR_ID);
396*5113495bSYour Name 	if (!vdev) {
397*5113495bSYour Name 		cfr_err("vdev is NULL");
398*5113495bSYour Name 		return;
399*5113495bSYour Name 	}
400*5113495bSYour Name 
401*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
402*5113495bSYour Name 	if (!pdev) {
403*5113495bSYour Name 		cfr_err("pdev is NULL");
404*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_CFR_ID);
405*5113495bSYour Name 		return;
406*5113495bSYour Name 	}
407*5113495bSYour Name 
408*5113495bSYour Name 	status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_CFR_ID);
409*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
410*5113495bSYour Name 		cfr_err("Failed to get pdev reference");
411*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_CFR_ID);
412*5113495bSYour Name 		return;
413*5113495bSYour Name 	}
414*5113495bSYour Name 
415*5113495bSYour Name 	pcfr = wlan_objmgr_pdev_get_comp_private_obj(pdev,
416*5113495bSYour Name 						     WLAN_UMAC_COMP_CFR);
417*5113495bSYour Name 	if (!pcfr) {
418*5113495bSYour Name 		cfr_err("pdev is NULL");
419*5113495bSYour Name 		goto exit;
420*5113495bSYour Name 	}
421*5113495bSYour Name 
422*5113495bSYour Name 	if (!pcfr->is_cfr_capable) {
423*5113495bSYour Name 		cfr_err("CFR not supported on this chip");
424*5113495bSYour Name 		goto exit;
425*5113495bSYour Name 	}
426*5113495bSYour Name 
427*5113495bSYour Name 	hdr->cmn.vendorid               = CFR_VENDOR_ID;
428*5113495bSYour Name 	hdr->cmn.cfr_metadata_version   = CFR_META_VERSION_1;
429*5113495bSYour Name 	hdr->cmn.cfr_data_version       = CFR_DATA_VERSION_1;
430*5113495bSYour Name 	hdr->cmn.chip_type              = CFR_CAPTURE_RADIO_ADRASTEA;
431*5113495bSYour Name 	hdr->cmn.pltform_type           = CFR_PLATFORM_TYPE_ARM;
432*5113495bSYour Name 	hdr->cmn.cfr_metadata_len       = CFR_META_DATA_LEN;
433*5113495bSYour Name 
434*5113495bSYour Name 	vaddr = pcfr->cfr_mem_chunk.vaddr;
435*5113495bSYour Name 	rindex = (u32 *)vaddr;
436*5113495bSYour Name 	windex = rindex + 1;
437*5113495bSYour Name 
438*5113495bSYour Name 	/*
439*5113495bSYour Name 	 * mem_index is having the index of the address where CFR dump wrriten,
440*5113495bSYour Name 	 * find data pointer from mem index and start address of memory.
441*5113495bSYour Name 	 */
442*5113495bSYour Name 	payload = vaddr + mem_index;
443*5113495bSYour Name 	payload_len = hdr->u.meta_legacy.length;
444*5113495bSYour Name 
445*5113495bSYour Name 	/* Write data into streamfs */
446*5113495bSYour Name 	tgt_cfr_info_send(pdev, hdr, sizeof(struct csi_cfr_header),
447*5113495bSYour Name 			  payload, payload_len, &end_magic_num,
448*5113495bSYour Name 			  sizeof(uint32_t));
449*5113495bSYour Name 
450*5113495bSYour Name 	/*
451*5113495bSYour Name 	 * Updating the read index to the number of bytes read by host, it will
452*5113495bSYour Name 	 * help in writing next capture.
453*5113495bSYour Name 	 * ignoring 4 byte for FW magic number from the actual allocated memory
454*5113495bSYour Name 	 * length to avoid corruption in magic number. This memory is circular
455*5113495bSYour Name 	 * so after completion of one round, Skipping the first 8 byte as they
456*5113495bSYour Name 	 * are for read index and write index.
457*5113495bSYour Name 	 */
458*5113495bSYour Name 	if (((*rindex) + payload_len) <= (pcfr->cfr_mem_chunk.len - 4))
459*5113495bSYour Name 		(*rindex) += payload_len;
460*5113495bSYour Name 	else if (((*rindex) + payload_len) > (pcfr->cfr_mem_chunk.len - 4))
461*5113495bSYour Name 		(*rindex) = (payload_len + 8);
462*5113495bSYour Name 
463*5113495bSYour Name exit:
464*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_CFR_ID);
465*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
466*5113495bSYour Name }
467*5113495bSYour Name #endif
468*5113495bSYour Name 
469*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
470*5113495bSYour Name 
471*5113495bSYour Name static
dev_sanity_check(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_pdev ** ppdev,struct pdev_cfr ** ppcfr)472*5113495bSYour Name QDF_STATUS dev_sanity_check(struct wlan_objmgr_vdev *vdev,
473*5113495bSYour Name 			    struct wlan_objmgr_pdev **ppdev,
474*5113495bSYour Name 			    struct pdev_cfr **ppcfr)
475*5113495bSYour Name {
476*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
477*5113495bSYour Name 
478*5113495bSYour Name 	if (!vdev) {
479*5113495bSYour Name 		cfr_err("vdev is NULL");
480*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
481*5113495bSYour Name 	}
482*5113495bSYour Name 
483*5113495bSYour Name 	*ppdev = wlan_vdev_get_pdev(vdev);
484*5113495bSYour Name 
485*5113495bSYour Name 	if (!*ppdev) {
486*5113495bSYour Name 		cfr_err("pdev is NULL");
487*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
488*5113495bSYour Name 	}
489*5113495bSYour Name 
490*5113495bSYour Name 	status = wlan_objmgr_pdev_try_get_ref(*ppdev, WLAN_CFR_ID);
491*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
492*5113495bSYour Name 		cfr_err("Failed to get pdev reference");
493*5113495bSYour Name 		return status;
494*5113495bSYour Name 	}
495*5113495bSYour Name 
496*5113495bSYour Name 	*ppcfr = wlan_objmgr_pdev_get_comp_private_obj(*ppdev,
497*5113495bSYour Name 						     WLAN_UMAC_COMP_CFR);
498*5113495bSYour Name 
499*5113495bSYour Name 	if (!(*ppcfr)) {
500*5113495bSYour Name 		cfr_err("pdev object for CFR is null");
501*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(*ppdev, WLAN_CFR_ID);
502*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
503*5113495bSYour Name 	}
504*5113495bSYour Name 
505*5113495bSYour Name 	if (!(*ppcfr)->is_cfr_rcc_capable) {
506*5113495bSYour Name 		cfr_err("cfr is not supported on this chip");
507*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(*ppdev, WLAN_CFR_ID);
508*5113495bSYour Name 		return QDF_STATUS_E_NOSUPPORT;
509*5113495bSYour Name 	}
510*5113495bSYour Name 
511*5113495bSYour Name 	return status;
512*5113495bSYour Name }
513*5113495bSYour Name 
514*5113495bSYour Name /*
515*5113495bSYour Name  * This is needed only in case of m_ta_ra_filter mode.
516*5113495bSYour Name  * If user wants to reset the group configurations to default values,
517*5113495bSYour Name  * then this handler will come into action.
518*5113495bSYour Name  *
519*5113495bSYour Name  * If user wants to reset the configurations of 0th, 1st and 3rd group,
520*5113495bSYour Name  * then the input should be :
521*5113495bSYour Name  *
522*5113495bSYour Name  *               wlanconfig ath0 cfr reset_cfg 0xb
523*5113495bSYour Name  *
524*5113495bSYour Name  */
525*5113495bSYour Name 
ucfg_cfr_set_reset_bitmap(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)526*5113495bSYour Name QDF_STATUS ucfg_cfr_set_reset_bitmap(struct wlan_objmgr_vdev *vdev,
527*5113495bSYour Name 				     struct cfr_wlanconfig_param *params)
528*5113495bSYour Name {
529*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
530*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
531*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
532*5113495bSYour Name 
533*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
534*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
535*5113495bSYour Name 		return status;
536*5113495bSYour Name 
537*5113495bSYour Name 	pcfr->rcc_param.modified_in_curr_session |= params->reset_cfg;
538*5113495bSYour Name 	tgt_cfr_default_ta_ra_cfg(pdev, &pcfr->rcc_param,
539*5113495bSYour Name 				  true, params->reset_cfg);
540*5113495bSYour Name 
541*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
542*5113495bSYour Name 
543*5113495bSYour Name 	return status;
544*5113495bSYour Name }
545*5113495bSYour Name 
546*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
547*5113495bSYour Name /*
548*5113495bSYour Name  * This is needed only in case of m_ta_ra_filter mode.
549*5113495bSYour Name  * After providing all the group configurations, user should provide
550*5113495bSYour Name  * the information about which groups need to be enabled.
551*5113495bSYour Name  * Based on that FW will enable the configurations for CFR groups.
552*5113495bSYour Name  * If user has to enable only 0th group, then input should be :
553*5113495bSYour Name  *
554*5113495bSYour Name  *               wlanconfig ath0 cfr en_cfg 0x1
555*5113495bSYour Name  *
556*5113495bSYour Name  * Enable the bitmap from user provided configuration into cfr_rcc_param.
557*5113495bSYour Name  */
558*5113495bSYour Name 
ucfg_cfr_set_en_bitmap(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)559*5113495bSYour Name QDF_STATUS ucfg_cfr_set_en_bitmap(struct wlan_objmgr_vdev *vdev,
560*5113495bSYour Name 				  struct cfr_wlanconfig_param *params)
561*5113495bSYour Name {
562*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
563*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
564*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
565*5113495bSYour Name 
566*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
567*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
568*5113495bSYour Name 		return status;
569*5113495bSYour Name 
570*5113495bSYour Name 	pcfr->rcc_param.filter_group_bitmap = params->en_cfg;
571*5113495bSYour Name 
572*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
573*5113495bSYour Name 
574*5113495bSYour Name 	return status;
575*5113495bSYour Name }
576*5113495bSYour Name #endif
577*5113495bSYour Name 
578*5113495bSYour Name /*
579*5113495bSYour Name  * Copy user provided input for ul_mu_user_mask into cfr_rcc_param.
580*5113495bSYour Name  */
581*5113495bSYour Name 
582*5113495bSYour Name QDF_STATUS
ucfg_cfr_set_ul_mu_user_mask(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)583*5113495bSYour Name ucfg_cfr_set_ul_mu_user_mask(struct wlan_objmgr_vdev *vdev,
584*5113495bSYour Name 			     struct cfr_wlanconfig_param *params)
585*5113495bSYour Name {
586*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
587*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
588*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
589*5113495bSYour Name 
590*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
591*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
592*5113495bSYour Name 		return status;
593*5113495bSYour Name 
594*5113495bSYour Name 	pcfr->rcc_param.ul_mu_user_mask_lower = params->ul_mu_user_mask_lower;
595*5113495bSYour Name 	pcfr->rcc_param.ul_mu_user_mask_upper = params->ul_mu_user_mask_upper;
596*5113495bSYour Name 
597*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
598*5113495bSYour Name 
599*5113495bSYour Name 	return status;
600*5113495bSYour Name }
601*5113495bSYour Name 
602*5113495bSYour Name /*
603*5113495bSYour Name  * FREEZE_TLV_DELAY_CNT_* registers are used for FREEZE TLV timeout mechanism
604*5113495bSYour Name  * in MAC side. In case MAC send FREEZE TLV to PHY too late due to
605*5113495bSYour Name  * long AST delay, PHY ucode may not handle it well or it will impact
606*5113495bSYour Name  * next frame’s normal processing, then MAC needs to drop FREEZE TLV
607*5113495bSYour Name  * sending process after reaching the threshold.
608*5113495bSYour Name  *
609*5113495bSYour Name  * This handler will copy user provided input for freeze_tlv_delay_cnt
610*5113495bSYour Name  * into cfr_rcc_param.
611*5113495bSYour Name  */
612*5113495bSYour Name 
613*5113495bSYour Name QDF_STATUS
ucfg_cfr_set_freeze_tlv_delay_cnt(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)614*5113495bSYour Name ucfg_cfr_set_freeze_tlv_delay_cnt(struct wlan_objmgr_vdev *vdev,
615*5113495bSYour Name 				  struct cfr_wlanconfig_param *params)
616*5113495bSYour Name {
617*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
618*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
619*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
620*5113495bSYour Name 
621*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
622*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
623*5113495bSYour Name 		return status;
624*5113495bSYour Name 
625*5113495bSYour Name 	pcfr->rcc_param.freeze_tlv_delay_cnt_en =
626*5113495bSYour Name 		params->freeze_tlv_delay_cnt_en;
627*5113495bSYour Name 
628*5113495bSYour Name 	pcfr->rcc_param.freeze_tlv_delay_cnt_thr =
629*5113495bSYour Name 		params->freeze_tlv_delay_cnt_thr;
630*5113495bSYour Name 
631*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
632*5113495bSYour Name 
633*5113495bSYour Name 	return status;
634*5113495bSYour Name }
635*5113495bSYour Name 
636*5113495bSYour Name /*
637*5113495bSYour Name  * Configure ta_ra_filter_in_as_fp from the provided configuration into
638*5113495bSYour Name  * cfr_rcc_param. All fixed parameters needed to be stored into cfr_rcc_param.
639*5113495bSYour Name  */
640*5113495bSYour Name QDF_STATUS
ucfg_cfr_set_tara_filterin_as_fp(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)641*5113495bSYour Name ucfg_cfr_set_tara_filterin_as_fp(struct wlan_objmgr_vdev *vdev,
642*5113495bSYour Name 				 struct cfr_wlanconfig_param *params)
643*5113495bSYour Name {
644*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
645*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
646*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
647*5113495bSYour Name 
648*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
649*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
650*5113495bSYour Name 		return status;
651*5113495bSYour Name 
652*5113495bSYour Name 	if (!pcfr->is_mo_marking_support) {
653*5113495bSYour Name 		cfr_err("MO marking support not available to filter as FP/MO");
654*5113495bSYour Name 		status = QDF_STATUS_E_NOSUPPORT;
655*5113495bSYour Name 	} else {
656*5113495bSYour Name 		pcfr->rcc_param.en_ta_ra_filter_in_as_fp =
657*5113495bSYour Name 			params->en_ta_ra_filter_in_as_fp;
658*5113495bSYour Name 	}
659*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
660*5113495bSYour Name 
661*5113495bSYour Name 	return status;
662*5113495bSYour Name }
663*5113495bSYour Name 
664*5113495bSYour Name /*
665*5113495bSYour Name  * Set the capture count from the provided configuration into cfr_rcc_param.
666*5113495bSYour Name  * All fixed parameters are needed to be stored into cfr_rcc_param.
667*5113495bSYour Name  */
668*5113495bSYour Name QDF_STATUS
ucfg_cfr_set_capture_count(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)669*5113495bSYour Name ucfg_cfr_set_capture_count(struct wlan_objmgr_vdev *vdev,
670*5113495bSYour Name 			   struct cfr_wlanconfig_param *params)
671*5113495bSYour Name {
672*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
673*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
674*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
675*5113495bSYour Name 
676*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
677*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
678*5113495bSYour Name 		return status;
679*5113495bSYour Name 
680*5113495bSYour Name 	if (!pcfr->is_cap_interval_mode_sel_support) {
681*5113495bSYour Name 		cfr_err("Capture count support not enabled");
682*5113495bSYour Name 		status = QDF_STATUS_E_NOSUPPORT;
683*5113495bSYour Name 	} else {
684*5113495bSYour Name 		pcfr->rcc_param.capture_count = params->cap_count;
685*5113495bSYour Name 	}
686*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
687*5113495bSYour Name 
688*5113495bSYour Name 	return status;
689*5113495bSYour Name }
690*5113495bSYour Name 
691*5113495bSYour Name /*
692*5113495bSYour Name  * Set interval mode sel nob from the provided configuration into cfr_rcc_param.
693*5113495bSYour Name  * All fixed parameters are needed to be stored into cfr_rcc_param
694*5113495bSYour Name  */
695*5113495bSYour Name QDF_STATUS
ucfg_cfr_set_capture_interval_mode_sel(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)696*5113495bSYour Name ucfg_cfr_set_capture_interval_mode_sel(struct wlan_objmgr_vdev *vdev,
697*5113495bSYour Name 				       struct cfr_wlanconfig_param *params)
698*5113495bSYour Name {
699*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
700*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
701*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
702*5113495bSYour Name 
703*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
704*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
705*5113495bSYour Name 		return status;
706*5113495bSYour Name 
707*5113495bSYour Name 	if (!pcfr->is_cap_interval_mode_sel_support) {
708*5113495bSYour Name 		cfr_err("Capture count support not enabled");
709*5113495bSYour Name 		status = QDF_STATUS_E_NOSUPPORT;
710*5113495bSYour Name 	} else {
711*5113495bSYour Name 		pcfr->rcc_param.capture_intval_mode_sel =
712*5113495bSYour Name 			params->cap_intval_mode_sel;
713*5113495bSYour Name 	}
714*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
715*5113495bSYour Name 
716*5113495bSYour Name 	return status;
717*5113495bSYour Name }
718*5113495bSYour Name 
719*5113495bSYour Name /*
720*5113495bSYour Name  * Set capture interval from the provided configuration into cfr_rcc_param.
721*5113495bSYour Name  * All fixed parameters are needed to be stored into cfr_rcc_param.
722*5113495bSYour Name  */
723*5113495bSYour Name 
724*5113495bSYour Name QDF_STATUS
ucfg_cfr_set_capture_interval(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)725*5113495bSYour Name ucfg_cfr_set_capture_interval(struct wlan_objmgr_vdev *vdev,
726*5113495bSYour Name 			      struct cfr_wlanconfig_param *params)
727*5113495bSYour Name {
728*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
729*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
730*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
731*5113495bSYour Name 
732*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
733*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
734*5113495bSYour Name 		return status;
735*5113495bSYour Name 
736*5113495bSYour Name 	if (pcfr->rcc_param.capture_duration > params->cap_intvl) {
737*5113495bSYour Name 		cfr_err("Capture interval should be more than capture duration");
738*5113495bSYour Name 		status = QDF_STATUS_E_INVAL;
739*5113495bSYour Name 	} else {
740*5113495bSYour Name 		pcfr->rcc_param.capture_interval = params->cap_intvl;
741*5113495bSYour Name 	}
742*5113495bSYour Name 
743*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
744*5113495bSYour Name 
745*5113495bSYour Name 	return status;
746*5113495bSYour Name }
747*5113495bSYour Name 
748*5113495bSYour Name /*
749*5113495bSYour Name  * Set capture duration from the provided configuration into cfr_rcc_param.
750*5113495bSYour Name  * All fixed parameters are needed to be stored into cfr_rcc_param.
751*5113495bSYour Name  */
752*5113495bSYour Name 
753*5113495bSYour Name QDF_STATUS
ucfg_cfr_set_capture_duration(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)754*5113495bSYour Name ucfg_cfr_set_capture_duration(struct wlan_objmgr_vdev *vdev,
755*5113495bSYour Name 			      struct cfr_wlanconfig_param *params)
756*5113495bSYour Name {
757*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
758*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
759*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
760*5113495bSYour Name 
761*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
762*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
763*5113495bSYour Name 		return status;
764*5113495bSYour Name 
765*5113495bSYour Name 	if (pcfr->rcc_param.capture_interval &&
766*5113495bSYour Name 	    (params->cap_dur > pcfr->rcc_param.capture_interval)) {
767*5113495bSYour Name 		cfr_err("Capture duration is exceeding capture interval");
768*5113495bSYour Name 		status = QDF_STATUS_E_INVAL;
769*5113495bSYour Name 	} else {
770*5113495bSYour Name 		pcfr->rcc_param.capture_duration = params->cap_dur;
771*5113495bSYour Name 	}
772*5113495bSYour Name 
773*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
774*5113495bSYour Name 
775*5113495bSYour Name 	return status;
776*5113495bSYour Name }
777*5113495bSYour Name 
778*5113495bSYour Name /*
779*5113495bSYour Name  * Copy user provided group parameters( type/ subtype of mgmt, ctrl, data )
780*5113495bSYour Name  * into curr_cfg instance of ta_ra_cfr_cfg.
781*5113495bSYour Name  * Set valid mask for the provided configuration.
782*5113495bSYour Name  * Set modified_in_curr_session for the particular group.
783*5113495bSYour Name  */
784*5113495bSYour Name 
785*5113495bSYour Name QDF_STATUS
ucfg_cfr_set_frame_type_subtype(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)786*5113495bSYour Name ucfg_cfr_set_frame_type_subtype(struct wlan_objmgr_vdev *vdev,
787*5113495bSYour Name 				struct cfr_wlanconfig_param *params)
788*5113495bSYour Name {
789*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
790*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
791*5113495bSYour Name 	struct ta_ra_cfr_cfg *curr_cfg = NULL;
792*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
793*5113495bSYour Name 
794*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
795*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
796*5113495bSYour Name 		return status;
797*5113495bSYour Name 
798*5113495bSYour Name 	if (params->grp_id >= MAX_TA_RA_ENTRIES) {
799*5113495bSYour Name 		cfr_err("err parameter grp_id, value=%u, max=%u\n",
800*5113495bSYour Name 			params->grp_id,
801*5113495bSYour Name 			MAX_TA_RA_ENTRIES);
802*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
803*5113495bSYour Name 	}
804*5113495bSYour Name 
805*5113495bSYour Name 	/* Populating current config based on user's input */
806*5113495bSYour Name 	curr_cfg = &pcfr->rcc_param.curr[params->grp_id];
807*5113495bSYour Name 	curr_cfg->mgmt_subtype_filter = params->expected_mgmt_subtype;
808*5113495bSYour Name 	curr_cfg->ctrl_subtype_filter = params->expected_ctrl_subtype;
809*5113495bSYour Name 	curr_cfg->data_subtype_filter = params->expected_data_subtype;
810*5113495bSYour Name 
811*5113495bSYour Name 	curr_cfg->valid_mgmt_subtype = 1;
812*5113495bSYour Name 	curr_cfg->valid_ctrl_subtype = 1;
813*5113495bSYour Name 	curr_cfg->valid_data_subtype = 1;
814*5113495bSYour Name 
815*5113495bSYour Name 	qdf_set_bit(params->grp_id,
816*5113495bSYour Name 		    &pcfr->rcc_param.modified_in_curr_session);
817*5113495bSYour Name 
818*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
819*5113495bSYour Name 
820*5113495bSYour Name 	return status;
821*5113495bSYour Name }
822*5113495bSYour Name 
823*5113495bSYour Name /*
824*5113495bSYour Name  * Copy user provided group parameters( BW and NSS )
825*5113495bSYour Name  * into curr_cfg instance of ta_ra_cfr_cfg.
826*5113495bSYour Name  * Set valid mask for the provided configuration.
827*5113495bSYour Name  * Set modified_in_curr_session for the particular group.
828*5113495bSYour Name  */
829*5113495bSYour Name 
ucfg_cfr_set_bw_nss(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)830*5113495bSYour Name QDF_STATUS ucfg_cfr_set_bw_nss(struct wlan_objmgr_vdev *vdev,
831*5113495bSYour Name 			       struct cfr_wlanconfig_param *params)
832*5113495bSYour Name {
833*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
834*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
835*5113495bSYour Name 	struct ta_ra_cfr_cfg *curr_cfg = NULL;
836*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
837*5113495bSYour Name 
838*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
839*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
840*5113495bSYour Name 		return status;
841*5113495bSYour Name 
842*5113495bSYour Name 	if (params->grp_id >= MAX_TA_RA_ENTRIES) {
843*5113495bSYour Name 		cfr_err("err parameter grp_id, value=%u, max=%u\n",
844*5113495bSYour Name 			params->grp_id,
845*5113495bSYour Name 			MAX_TA_RA_ENTRIES);
846*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
847*5113495bSYour Name 	}
848*5113495bSYour Name 
849*5113495bSYour Name 	/* Populating current config based on user's input */
850*5113495bSYour Name 	curr_cfg = &pcfr->rcc_param.curr[params->grp_id];
851*5113495bSYour Name 	curr_cfg->bw = params->bw;
852*5113495bSYour Name 	curr_cfg->nss = params->nss;
853*5113495bSYour Name 
854*5113495bSYour Name 	curr_cfg->valid_bw_mask = 1;
855*5113495bSYour Name 	curr_cfg->valid_nss_mask = 1;
856*5113495bSYour Name 
857*5113495bSYour Name 	qdf_set_bit(params->grp_id,
858*5113495bSYour Name 		    &pcfr->rcc_param.modified_in_curr_session);
859*5113495bSYour Name 
860*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
861*5113495bSYour Name 
862*5113495bSYour Name 	return status;
863*5113495bSYour Name }
864*5113495bSYour Name 
865*5113495bSYour Name /*
866*5113495bSYour Name  * Copy user provided group parameters( TA, RA, TA_MASK, RA_MASK )
867*5113495bSYour Name  * into curr_cfg instance of ta_ra_cfr_cfg.
868*5113495bSYour Name  * Set valid mask for the provided configuration.
869*5113495bSYour Name  * Set modified_in_curr_session for the particular group.
870*5113495bSYour Name  */
871*5113495bSYour Name 
ucfg_cfr_set_tara_config(struct wlan_objmgr_vdev * vdev,struct cfr_wlanconfig_param * params)872*5113495bSYour Name QDF_STATUS ucfg_cfr_set_tara_config(struct wlan_objmgr_vdev *vdev,
873*5113495bSYour Name 				    struct cfr_wlanconfig_param *params)
874*5113495bSYour Name {
875*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
876*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
877*5113495bSYour Name 	struct ta_ra_cfr_cfg *curr_cfg = NULL;
878*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
879*5113495bSYour Name 
880*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
881*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
882*5113495bSYour Name 		return status;
883*5113495bSYour Name 
884*5113495bSYour Name 	if (params->grp_id >= MAX_TA_RA_ENTRIES) {
885*5113495bSYour Name 		cfr_err("err parameter grp_id, value=%u, max=%u\n",
886*5113495bSYour Name 			params->grp_id,
887*5113495bSYour Name 			MAX_TA_RA_ENTRIES);
888*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
889*5113495bSYour Name 	}
890*5113495bSYour Name 
891*5113495bSYour Name 	curr_cfg = &pcfr->rcc_param.curr[params->grp_id];
892*5113495bSYour Name 	qdf_mem_copy(curr_cfg->tx_addr, params->ta, QDF_MAC_ADDR_SIZE);
893*5113495bSYour Name 	qdf_mem_copy(curr_cfg->rx_addr, params->ra, QDF_MAC_ADDR_SIZE);
894*5113495bSYour Name 	qdf_mem_copy(curr_cfg->tx_addr_mask,
895*5113495bSYour Name 		     params->ta_mask, QDF_MAC_ADDR_SIZE);
896*5113495bSYour Name 	qdf_mem_copy(curr_cfg->rx_addr_mask,
897*5113495bSYour Name 		     params->ra_mask, QDF_MAC_ADDR_SIZE);
898*5113495bSYour Name 
899*5113495bSYour Name 	curr_cfg->valid_ta = 1;
900*5113495bSYour Name 	curr_cfg->valid_ta_mask = 1;
901*5113495bSYour Name 	curr_cfg->valid_ra = 1;
902*5113495bSYour Name 	curr_cfg->valid_ra_mask = 1;
903*5113495bSYour Name 
904*5113495bSYour Name 	qdf_set_bit(params->grp_id,
905*5113495bSYour Name 		    &pcfr->rcc_param.modified_in_curr_session);
906*5113495bSYour Name 
907*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
908*5113495bSYour Name 
909*5113495bSYour Name 	return status;
910*5113495bSYour Name }
911*5113495bSYour Name 
ucfg_cfr_get_cfg(struct wlan_objmgr_vdev * vdev)912*5113495bSYour Name QDF_STATUS ucfg_cfr_get_cfg(struct wlan_objmgr_vdev *vdev)
913*5113495bSYour Name {
914*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
915*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
916*5113495bSYour Name 	struct ta_ra_cfr_cfg *glbl_cfg = NULL;
917*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
918*5113495bSYour Name 	uint8_t grp_id;
919*5113495bSYour Name 
920*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
921*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
922*5113495bSYour Name 		return status;
923*5113495bSYour Name 	if (!cfr_is_filter_enabled(&pcfr->rcc_param)) {
924*5113495bSYour Name 		cfr_err(" All RCC modes are disabled");
925*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
926*5113495bSYour Name 		return status;
927*5113495bSYour Name 	}
928*5113495bSYour Name 
929*5113495bSYour Name 	cfr_err("CAPTURE MODE:\n");
930*5113495bSYour Name 
931*5113495bSYour Name 	cfr_err("m_directed_ftm is : %s\n",
932*5113495bSYour Name 		pcfr->rcc_param.m_directed_ftm ?
933*5113495bSYour Name 		"enabled" : "disabled");
934*5113495bSYour Name 	cfr_err("m_all_ftm_ack is : %s\n",
935*5113495bSYour Name 		pcfr->rcc_param.m_all_ftm_ack ?
936*5113495bSYour Name 		"enabled" : "disabled");
937*5113495bSYour Name 	cfr_err("m_ndpa_ndp_directed is: %s\n",
938*5113495bSYour Name 		pcfr->rcc_param.m_ndpa_ndp_directed ?
939*5113495bSYour Name 		"enabled" : "disabled");
940*5113495bSYour Name 	cfr_err("m_ndpa_ndp_all is : %s\n",
941*5113495bSYour Name 		pcfr->rcc_param.m_ndpa_ndp_all ?
942*5113495bSYour Name 		"enabled" : "disabled");
943*5113495bSYour Name 	cfr_err("m_ta_ra_filter is : %s\n",
944*5113495bSYour Name 		pcfr->rcc_param.m_ta_ra_filter ?
945*5113495bSYour Name 		"enabled" : "disabled");
946*5113495bSYour Name 	cfr_err("m_all_packet is : %s\n",
947*5113495bSYour Name 		pcfr->rcc_param.m_all_packet ?
948*5113495bSYour Name 		"enabled" : "disabled");
949*5113495bSYour Name 
950*5113495bSYour Name 	cfr_err("capture duration : %u usec\n",
951*5113495bSYour Name 		pcfr->rcc_param.capture_duration);
952*5113495bSYour Name 	cfr_err("capture interval : %u usec\n",
953*5113495bSYour Name 		pcfr->rcc_param.capture_interval);
954*5113495bSYour Name 	cfr_err("capture count : %u\n",
955*5113495bSYour Name 		pcfr->rcc_param.capture_count);
956*5113495bSYour Name 	cfr_err("capture interval mode sel : %u\n",
957*5113495bSYour Name 		pcfr->rcc_param.capture_intval_mode_sel);
958*5113495bSYour Name 	cfr_err("UL MU User mask lower : %u\n",
959*5113495bSYour Name 		pcfr->rcc_param.ul_mu_user_mask_lower);
960*5113495bSYour Name 	cfr_err("UL MU User mask upper : %u\n",
961*5113495bSYour Name 		pcfr->rcc_param.ul_mu_user_mask_upper);
962*5113495bSYour Name 	cfr_err("Freeze TLV delay count is : %s\n",
963*5113495bSYour Name 		pcfr->rcc_param.freeze_tlv_delay_cnt_en ?
964*5113495bSYour Name 		"enabled" : "disabled");
965*5113495bSYour Name 	cfr_err("Freeze TLV delay count threshold : %u\n",
966*5113495bSYour Name 		pcfr->rcc_param.freeze_tlv_delay_cnt_thr);
967*5113495bSYour Name 	cfr_err("Enabled CFG id bitmap : 0x%x\n",
968*5113495bSYour Name 		pcfr->rcc_param.filter_group_bitmap);
969*5113495bSYour Name 	cfr_err(" Modified cfg id bitmap : %lu\n",
970*5113495bSYour Name 		pcfr->rcc_param.modified_in_curr_session);
971*5113495bSYour Name 
972*5113495bSYour Name 	cfr_err("TARA_CONFIG details:\n");
973*5113495bSYour Name 
974*5113495bSYour Name 	for (grp_id = 0; grp_id < MAX_TA_RA_ENTRIES; grp_id++) {
975*5113495bSYour Name 		glbl_cfg = &pcfr->global[grp_id];
976*5113495bSYour Name 
977*5113495bSYour Name 		cfr_err("Config ID: %d\n", grp_id);
978*5113495bSYour Name 		cfr_err("Bandwidth :0x%x\n", glbl_cfg->bw);
979*5113495bSYour Name 		cfr_err("NSS : 0x%x\n", glbl_cfg->nss);
980*5113495bSYour Name 		cfr_err("valid_ta: %d\n", glbl_cfg->valid_ta);
981*5113495bSYour Name 		cfr_err("valid_ta_mask: %d\n", glbl_cfg->valid_ta_mask);
982*5113495bSYour Name 		cfr_err("valid_ra: %d\n", glbl_cfg->valid_ra);
983*5113495bSYour Name 		cfr_err("valid_ra_mask: %d\n", glbl_cfg->valid_ra_mask);
984*5113495bSYour Name 		cfr_err("valid_bw_mask: %d\n", glbl_cfg->valid_bw_mask);
985*5113495bSYour Name 		cfr_err("valid_nss_mask: %d\n", glbl_cfg->valid_nss_mask);
986*5113495bSYour Name 		cfr_err("valid_mgmt_subtype: %d\n",
987*5113495bSYour Name 			glbl_cfg->valid_mgmt_subtype);
988*5113495bSYour Name 		cfr_err("valid_ctrl_subtype: %d\n",
989*5113495bSYour Name 			glbl_cfg->valid_ctrl_subtype);
990*5113495bSYour Name 		cfr_err("valid_data_subtype: %d\n",
991*5113495bSYour Name 			glbl_cfg->valid_data_subtype);
992*5113495bSYour Name 		cfr_err("Mgmt subtype : 0x%x\n",
993*5113495bSYour Name 			glbl_cfg->mgmt_subtype_filter);
994*5113495bSYour Name 		cfr_err("CTRL subtype : 0x%x\n",
995*5113495bSYour Name 			glbl_cfg->ctrl_subtype_filter);
996*5113495bSYour Name 		cfr_err("Data subtype : 0x%x\n",
997*5113495bSYour Name 			glbl_cfg->data_subtype_filter);
998*5113495bSYour Name 		cfr_err("TX Addr: " QDF_MAC_ADDR_FMT,
999*5113495bSYour Name 			QDF_MAC_ADDR_REF(glbl_cfg->tx_addr));
1000*5113495bSYour Name 		cfr_err("TX Addr Mask: " QDF_MAC_ADDR_FMT,
1001*5113495bSYour Name 			QDF_MAC_ADDR_REF(glbl_cfg->tx_addr_mask));
1002*5113495bSYour Name 		cfr_err("RX Addr: " QDF_MAC_ADDR_FMT,
1003*5113495bSYour Name 			QDF_MAC_ADDR_REF(glbl_cfg->rx_addr));
1004*5113495bSYour Name 		cfr_err("RX Addr Mask: " QDF_MAC_ADDR_FMT,
1005*5113495bSYour Name 			QDF_MAC_ADDR_REF(glbl_cfg->rx_addr_mask));
1006*5113495bSYour Name 	}
1007*5113495bSYour Name 
1008*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1009*5113495bSYour Name 
1010*5113495bSYour Name 	return status;
1011*5113495bSYour Name }
1012*5113495bSYour Name 
chan_capture_status_to_str(enum chan_capture_status type)1013*5113495bSYour Name static const char *chan_capture_status_to_str(enum chan_capture_status type)
1014*5113495bSYour Name {
1015*5113495bSYour Name 	switch (type) {
1016*5113495bSYour Name 	case CAPTURE_IDLE:
1017*5113495bSYour Name 		return "CAPTURE_IDLE";
1018*5113495bSYour Name 	case CAPTURE_BUSY:
1019*5113495bSYour Name 		return "CAPTURE_BUSY";
1020*5113495bSYour Name 	case CAPTURE_ACTIVE:
1021*5113495bSYour Name 		return "CAPTURE_ACTIVE";
1022*5113495bSYour Name 	case CAPTURE_NO_BUFFER:
1023*5113495bSYour Name 		return "CAPTURE_NO_BUFFER";
1024*5113495bSYour Name 	default:
1025*5113495bSYour Name 		return "INVALID";
1026*5113495bSYour Name 	}
1027*5113495bSYour Name }
1028*5113495bSYour Name 
1029*5113495bSYour Name static const
mac_freeze_reason_to_str(enum mac_freeze_capture_reason type)1030*5113495bSYour Name char *mac_freeze_reason_to_str(enum mac_freeze_capture_reason type)
1031*5113495bSYour Name {
1032*5113495bSYour Name 	switch (type) {
1033*5113495bSYour Name 	case FREEZE_REASON_TM:
1034*5113495bSYour Name 		return "FREEZE_REASON_TM";
1035*5113495bSYour Name 	case FREEZE_REASON_FTM:
1036*5113495bSYour Name 		return "FREEZE_REASON_FTM";
1037*5113495bSYour Name 	case FREEZE_REASON_ACK_RESP_TO_TM_FTM:
1038*5113495bSYour Name 		return "FREEZE_REASON_ACK_RESP_TO_TM_FTM";
1039*5113495bSYour Name 	case FREEZE_REASON_TA_RA_TYPE_FILTER:
1040*5113495bSYour Name 		return "FREEZE_REASON_TA_RA_TYPE_FILTER";
1041*5113495bSYour Name 	case FREEZE_REASON_NDPA_NDP:
1042*5113495bSYour Name 		return "FREEZE_REASON_NDPA_NDP";
1043*5113495bSYour Name 	case FREEZE_REASON_ALL_PACKET:
1044*5113495bSYour Name 		return "FREEZE_REASON_ALL_PACKET";
1045*5113495bSYour Name 	default:
1046*5113495bSYour Name 		return "INVALID";
1047*5113495bSYour Name 	}
1048*5113495bSYour Name }
1049*5113495bSYour Name 
ucfg_cfr_rcc_dump_dbg_counters(struct wlan_objmgr_vdev * vdev)1050*5113495bSYour Name QDF_STATUS ucfg_cfr_rcc_dump_dbg_counters(struct wlan_objmgr_vdev *vdev)
1051*5113495bSYour Name {
1052*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
1053*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
1054*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
1055*5113495bSYour Name 	struct cdp_cfr_rcc_stats *cfr_rcc_stats = NULL;
1056*5113495bSYour Name 	uint8_t stats_cnt;
1057*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1058*5113495bSYour Name 
1059*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
1060*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
1061*5113495bSYour Name 		return status;
1062*5113495bSYour Name 
1063*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
1064*5113495bSYour Name 	if (!psoc) {
1065*5113495bSYour Name 		cfr_err("psoc is null!");
1066*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1067*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
1068*5113495bSYour Name 	}
1069*5113495bSYour Name 
1070*5113495bSYour Name 	cfr_err("total_tx_evt_cnt = %llu\n",
1071*5113495bSYour Name 		pcfr->total_tx_evt_cnt);
1072*5113495bSYour Name 	cfr_err("dbr_evt_cnt = %llu\n",
1073*5113495bSYour Name 		pcfr->dbr_evt_cnt);
1074*5113495bSYour Name 	cfr_err("rx_tlv_evt_cnt = %llu\n",
1075*5113495bSYour Name 		pcfr->rx_tlv_evt_cnt);
1076*5113495bSYour Name 	cfr_err("release_cnt = %llu\n",
1077*5113495bSYour Name 		pcfr->release_cnt);
1078*5113495bSYour Name 	cfr_err("Error cnt:\n");
1079*5113495bSYour Name 	cfr_err("flush_dbr_cnt = %llu\n",
1080*5113495bSYour Name 		pcfr->flush_dbr_cnt);
1081*5113495bSYour Name 	cfr_err("invalid_dma_length_cnt = %llu\n",
1082*5113495bSYour Name 		pcfr->invalid_dma_length_cnt);
1083*5113495bSYour Name 	cfr_err("flush_timeout_dbr_cnt = %llu\n",
1084*5113495bSYour Name 		pcfr->flush_timeout_dbr_cnt);
1085*5113495bSYour Name 	cfr_err("tx_peer_status_cfr_fail = %llu\n",
1086*5113495bSYour Name 		pcfr->tx_peer_status_cfr_fail);
1087*5113495bSYour Name 	cfr_err("tx_evt_status_cfr_fail = %llu\n",
1088*5113495bSYour Name 		pcfr->tx_evt_status_cfr_fail);
1089*5113495bSYour Name 	cfr_err("tx_dbr_cookie_lookup_fail = %llu\n",
1090*5113495bSYour Name 		pcfr->tx_dbr_cookie_lookup_fail);
1091*5113495bSYour Name 	cfr_err("PPDU id mismatch for same cookie:\n");
1092*5113495bSYour Name 	cfr_err("clear_txrx_event = %llu\n",
1093*5113495bSYour Name 		pcfr->clear_txrx_event);
1094*5113495bSYour Name 	cfr_err("cfr_dma_aborts = %llu\n",
1095*5113495bSYour Name 		pcfr->cfr_dma_aborts);
1096*5113495bSYour Name 
1097*5113495bSYour Name 	cfr_rcc_stats = qdf_mem_malloc(sizeof(struct cdp_cfr_rcc_stats));
1098*5113495bSYour Name 	if (!cfr_rcc_stats) {
1099*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1100*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1101*5113495bSYour Name 	}
1102*5113495bSYour Name 
1103*5113495bSYour Name 	cdp_get_cfr_dbg_stats(wlan_psoc_get_dp_handle(psoc),
1104*5113495bSYour Name 			      wlan_objmgr_pdev_get_pdev_id(pdev),
1105*5113495bSYour Name 			      cfr_rcc_stats);
1106*5113495bSYour Name 
1107*5113495bSYour Name 	cfr_err("bb_captured_channel_cnt: %llu\n",
1108*5113495bSYour Name 		cfr_rcc_stats->bb_captured_channel_cnt);
1109*5113495bSYour Name 	cfr_err("bb_captured_timeout_cnt: %llu\n",
1110*5113495bSYour Name 		cfr_rcc_stats->bb_captured_timeout_cnt);
1111*5113495bSYour Name 	cfr_err("rx_loc_info_valid_cnt: %llu\n",
1112*5113495bSYour Name 		cfr_rcc_stats->rx_loc_info_valid_cnt);
1113*5113495bSYour Name 
1114*5113495bSYour Name 	cfr_err("Channel capture status:\n");
1115*5113495bSYour Name 	for (stats_cnt = 0; stats_cnt < CAPTURE_MAX; stats_cnt++) {
1116*5113495bSYour Name 		cfr_err("%s = %llu\n",
1117*5113495bSYour Name 			chan_capture_status_to_str(stats_cnt),
1118*5113495bSYour Name 			cfr_rcc_stats->chan_capture_status[stats_cnt]);
1119*5113495bSYour Name 	}
1120*5113495bSYour Name 
1121*5113495bSYour Name 	cfr_err("Freeze reason:\n");
1122*5113495bSYour Name 	for (stats_cnt = 0; stats_cnt < FREEZE_REASON_MAX; stats_cnt++) {
1123*5113495bSYour Name 		cfr_err("%s = %llu\n",
1124*5113495bSYour Name 			mac_freeze_reason_to_str(stats_cnt),
1125*5113495bSYour Name 			cfr_rcc_stats->reason_cnt[stats_cnt]);
1126*5113495bSYour Name 	}
1127*5113495bSYour Name 
1128*5113495bSYour Name 	qdf_mem_free(cfr_rcc_stats);
1129*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1130*5113495bSYour Name 
1131*5113495bSYour Name 	return status;
1132*5113495bSYour Name }
1133*5113495bSYour Name 
ucfg_cfr_rcc_clr_dbg_counters(struct wlan_objmgr_vdev * vdev)1134*5113495bSYour Name QDF_STATUS ucfg_cfr_rcc_clr_dbg_counters(struct wlan_objmgr_vdev *vdev)
1135*5113495bSYour Name {
1136*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
1137*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
1138*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
1139*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1140*5113495bSYour Name 
1141*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
1142*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
1143*5113495bSYour Name 		return status;
1144*5113495bSYour Name 
1145*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
1146*5113495bSYour Name 	if (!psoc) {
1147*5113495bSYour Name 		cfr_err("psoc is null!");
1148*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1149*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
1150*5113495bSYour Name 	}
1151*5113495bSYour Name 	cdp_cfr_clr_dbg_stats(wlan_psoc_get_dp_handle(psoc),
1152*5113495bSYour Name 			      wlan_objmgr_pdev_get_pdev_id(pdev));
1153*5113495bSYour Name 
1154*5113495bSYour Name 	pcfr->dbr_evt_cnt = 0;
1155*5113495bSYour Name 	pcfr->release_cnt = 0;
1156*5113495bSYour Name 	pcfr->total_tx_evt_cnt = 0;
1157*5113495bSYour Name 	pcfr->rx_tlv_evt_cnt = 0;
1158*5113495bSYour Name 	pcfr->flush_dbr_cnt = 0;
1159*5113495bSYour Name 	pcfr->flush_timeout_dbr_cnt = 0;
1160*5113495bSYour Name 	pcfr->invalid_dma_length_cnt = 0;
1161*5113495bSYour Name 	pcfr->clear_txrx_event = 0;
1162*5113495bSYour Name 	pcfr->cfr_dma_aborts = 0;
1163*5113495bSYour Name 	pcfr->tx_peer_status_cfr_fail = 0;
1164*5113495bSYour Name 	pcfr->tx_evt_status_cfr_fail = 0;
1165*5113495bSYour Name 	pcfr->tx_dbr_cookie_lookup_fail = 0;
1166*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1167*5113495bSYour Name 
1168*5113495bSYour Name 	return status;
1169*5113495bSYour Name }
1170*5113495bSYour Name 
ucfg_cfr_rcc_dump_lut(struct wlan_objmgr_vdev * vdev)1171*5113495bSYour Name QDF_STATUS ucfg_cfr_rcc_dump_lut(struct wlan_objmgr_vdev *vdev)
1172*5113495bSYour Name {
1173*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
1174*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1175*5113495bSYour Name 
1176*5113495bSYour Name 	if (!vdev) {
1177*5113495bSYour Name 		cfr_err("vdev is NULL");
1178*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1179*5113495bSYour Name 	}
1180*5113495bSYour Name 
1181*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
1182*5113495bSYour Name 	if (!pdev) {
1183*5113495bSYour Name 		cfr_err("pdev is NULL");
1184*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1185*5113495bSYour Name 	}
1186*5113495bSYour Name 
1187*5113495bSYour Name 	if (wlan_objmgr_pdev_try_get_ref(pdev, WLAN_CFR_ID) !=
1188*5113495bSYour Name 	    QDF_STATUS_SUCCESS) {
1189*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1190*5113495bSYour Name 	}
1191*5113495bSYour Name 
1192*5113495bSYour Name 	cfr_err("LUT table:");
1193*5113495bSYour Name 	tgt_cfr_dump_lut_enh(pdev);
1194*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1195*5113495bSYour Name 
1196*5113495bSYour Name 	return status;
1197*5113495bSYour Name }
1198*5113495bSYour Name 
cfr_set_filter(struct wlan_objmgr_pdev * pdev,bool enable,struct cdp_monitor_filter * filter_val,bool cfr_enable_monitor_mode)1199*5113495bSYour Name static void cfr_set_filter(struct wlan_objmgr_pdev *pdev, bool enable,
1200*5113495bSYour Name 			   struct cdp_monitor_filter *filter_val,
1201*5113495bSYour Name 			   bool cfr_enable_monitor_mode)
1202*5113495bSYour Name {
1203*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
1204*5113495bSYour Name 
1205*5113495bSYour Name 	cfr_info("pdev_id=%d\n", wlan_objmgr_pdev_get_pdev_id(pdev));
1206*5113495bSYour Name 
1207*5113495bSYour Name 	cdp_cfr_filter(wlan_psoc_get_dp_handle(psoc),
1208*5113495bSYour Name 		       wlan_objmgr_pdev_get_pdev_id(pdev),
1209*5113495bSYour Name 		       enable, filter_val,
1210*5113495bSYour Name 		       cfr_enable_monitor_mode);
1211*5113495bSYour Name }
1212*5113495bSYour Name 
1213*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
1214*5113495bSYour Name /*
1215*5113495bSYour Name  * With the initiation of commit command, this handler will be triggered.
1216*5113495bSYour Name  *
1217*5113495bSYour Name  * Starts the procedure of forming the TLVs.
1218*5113495bSYour Name  * If Host succeeds to send WMI command to FW, after TLV processing, then it
1219*5113495bSYour Name  * will save the previous CFR configurations into one instance ta_ra_cfr_cfg,
1220*5113495bSYour Name  * called glbl_cfg and update the current config to default state for the
1221*5113495bSYour Name  * next commit session.
1222*5113495bSYour Name  *
1223*5113495bSYour Name  * Finally, reset the counter (modified_in_curr_session) to 0 before moving to
1224*5113495bSYour Name  * next commit session.
1225*5113495bSYour Name  *
1226*5113495bSYour Name  */
1227*5113495bSYour Name 
ucfg_cfr_committed_rcc_config(struct wlan_objmgr_vdev * vdev)1228*5113495bSYour Name QDF_STATUS ucfg_cfr_committed_rcc_config(struct wlan_objmgr_vdev *vdev)
1229*5113495bSYour Name {
1230*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
1231*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
1232*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
1233*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1234*5113495bSYour Name 	struct cdp_monitor_filter filter_val = {0};
1235*5113495bSYour Name 	bool cfr_enable_monitor_mode = false;
1236*5113495bSYour Name 
1237*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
1238*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
1239*5113495bSYour Name 		return status;
1240*5113495bSYour Name 
1241*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
1242*5113495bSYour Name 
1243*5113495bSYour Name 	if (!psoc) {
1244*5113495bSYour Name 		cfr_err("psoc is null!");
1245*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1246*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
1247*5113495bSYour Name 	}
1248*5113495bSYour Name 
1249*5113495bSYour Name 	pcfr->rcc_param.vdev_id = wlan_vdev_get_id(vdev);
1250*5113495bSYour Name 
1251*5113495bSYour Name 	if (wlan_vdev_mlme_is_special_vdev(vdev))
1252*5113495bSYour Name 		cfr_enable_monitor_mode = true;
1253*5113495bSYour Name 
1254*5113495bSYour Name 	/*
1255*5113495bSYour Name 	 * If capture mode is valid, then Host:
1256*5113495bSYour Name 	 * Subscribes for PPDU status TLVs in monitor status ring.
1257*5113495bSYour Name 	 * Sets filter type to either FP or MO, based on the capture mode.
1258*5113495bSYour Name 	 * Starts the LUT_AGE_TIMER of 1sec.
1259*5113495bSYour Name 	 *
1260*5113495bSYour Name 	 * If capture mode is disabled, then Host:
1261*5113495bSYour Name 	 * unsubscribes for PPDU status TLVs in monitor status ring.
1262*5113495bSYour Name 	 * Sets filter type to 0.
1263*5113495bSYour Name 	 * Stops the LUT_AGE_TIMER.
1264*5113495bSYour Name 	 *
1265*5113495bSYour Name 	 */
1266*5113495bSYour Name 
1267*5113495bSYour Name 	if (cfr_is_filter_enabled(&pcfr->rcc_param)) {
1268*5113495bSYour Name 		if (pcfr->cfr_timer_enable) {
1269*5113495bSYour Name 			cfr_err("Not allowed: Periodic capture is enabled.\n");
1270*5113495bSYour Name 			wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1271*5113495bSYour Name 			return QDF_STATUS_E_NOSUPPORT;
1272*5113495bSYour Name 		}
1273*5113495bSYour Name 
1274*5113495bSYour Name 		if (pcfr->rcc_param.m_all_ftm_ack) {
1275*5113495bSYour Name 			filter_val.mode |= MON_FILTER_PASS |
1276*5113495bSYour Name 					   MON_FILTER_OTHER;
1277*5113495bSYour Name 			filter_val.fp_mgmt |= FILTER_MGMT_ACTION;
1278*5113495bSYour Name 			filter_val.mo_mgmt |= FILTER_MGMT_ACTION;
1279*5113495bSYour Name 		}
1280*5113495bSYour Name 
1281*5113495bSYour Name 		if (pcfr->rcc_param.m_ndpa_ndp_all) {
1282*5113495bSYour Name 			filter_val.mode |= MON_FILTER_PASS |
1283*5113495bSYour Name 					   MON_FILTER_OTHER;
1284*5113495bSYour Name 			filter_val.fp_ctrl |= FILTER_CTRL_VHT_NDP;
1285*5113495bSYour Name 			filter_val.mo_ctrl |= FILTER_CTRL_VHT_NDP;
1286*5113495bSYour Name 		}
1287*5113495bSYour Name 
1288*5113495bSYour Name 		if (pcfr->rcc_param.m_all_packet) {
1289*5113495bSYour Name 			filter_val.mode |= MON_FILTER_PASS |
1290*5113495bSYour Name 					   MON_FILTER_OTHER;
1291*5113495bSYour Name 			filter_val.fp_mgmt |= FILTER_MGMT_ALL;
1292*5113495bSYour Name 			filter_val.mo_mgmt |= FILTER_MGMT_ALL;
1293*5113495bSYour Name 			filter_val.fp_ctrl |= FILTER_CTRL_ALL;
1294*5113495bSYour Name 			filter_val.mo_ctrl |= FILTER_CTRL_ALL;
1295*5113495bSYour Name 			filter_val.fp_data |= FILTER_DATA_ALL;
1296*5113495bSYour Name 			filter_val.mo_data |= FILTER_DATA_ALL;
1297*5113495bSYour Name 		}
1298*5113495bSYour Name 
1299*5113495bSYour Name 		/*
1300*5113495bSYour Name 		 * M_TA_RA in monitor other is as intensive as M_ALL pkt
1301*5113495bSYour Name 		 * Support only FP in M_TA_RA mode
1302*5113495bSYour Name 		 */
1303*5113495bSYour Name 		if (pcfr->rcc_param.m_ta_ra_filter) {
1304*5113495bSYour Name 			filter_val.mode |= MON_FILTER_PASS |
1305*5113495bSYour Name 					   MON_FILTER_OTHER;
1306*5113495bSYour Name 			filter_val.fp_mgmt |= FILTER_MGMT_ALL;
1307*5113495bSYour Name 			filter_val.mo_mgmt |= FILTER_MGMT_ALL;
1308*5113495bSYour Name 			filter_val.fp_ctrl |= FILTER_CTRL_ALL;
1309*5113495bSYour Name 			filter_val.mo_ctrl |= FILTER_CTRL_ALL;
1310*5113495bSYour Name 			filter_val.fp_data |= FILTER_DATA_ALL;
1311*5113495bSYour Name 			filter_val.mo_data |= FILTER_DATA_ALL;
1312*5113495bSYour Name 		}
1313*5113495bSYour Name 
1314*5113495bSYour Name 		if (pcfr->rcc_param.m_directed_ftm) {
1315*5113495bSYour Name 			filter_val.mode |= MON_FILTER_PASS;
1316*5113495bSYour Name 			filter_val.fp_mgmt |= FILTER_MGMT_ACTION;
1317*5113495bSYour Name 		}
1318*5113495bSYour Name 
1319*5113495bSYour Name 		if (pcfr->rcc_param.m_ndpa_ndp_directed) {
1320*5113495bSYour Name 			filter_val.mode |= MON_FILTER_PASS;
1321*5113495bSYour Name 			filter_val.fp_ctrl |= FILTER_CTRL_VHT_NDP;
1322*5113495bSYour Name 		}
1323*5113495bSYour Name 
1324*5113495bSYour Name 		if (!cdp_get_cfr_rcc(wlan_psoc_get_dp_handle(psoc),
1325*5113495bSYour Name 				    wlan_objmgr_pdev_get_pdev_id(pdev)))
1326*5113495bSYour Name 			tgt_cfr_start_lut_age_timer(pdev);
1327*5113495bSYour Name 		cfr_set_filter(pdev, 1, &filter_val, cfr_enable_monitor_mode);
1328*5113495bSYour Name 	} else {
1329*5113495bSYour Name 		if (cdp_get_cfr_rcc(wlan_psoc_get_dp_handle(psoc),
1330*5113495bSYour Name 				    wlan_objmgr_pdev_get_pdev_id(pdev)))
1331*5113495bSYour Name 			tgt_cfr_stop_lut_age_timer(pdev);
1332*5113495bSYour Name 		cfr_set_filter(pdev, 0, &filter_val, cfr_enable_monitor_mode);
1333*5113495bSYour Name 	}
1334*5113495bSYour Name 
1335*5113495bSYour Name 	/* Trigger wmi to start the TLV processing. */
1336*5113495bSYour Name 	status = tgt_cfr_config_rcc(pdev, &pcfr->rcc_param);
1337*5113495bSYour Name 	if (status == QDF_STATUS_SUCCESS) {
1338*5113495bSYour Name 		cfr_info("CFR commit done\n");
1339*5113495bSYour Name 		/* Update global config */
1340*5113495bSYour Name 		tgt_cfr_update_global_cfg(pdev);
1341*5113495bSYour Name 
1342*5113495bSYour Name 		/* Bring curr_cfg to default state for next commit session */
1343*5113495bSYour Name 		tgt_cfr_default_ta_ra_cfg(pdev, &pcfr->rcc_param,
1344*5113495bSYour Name 					  false, MAX_RESET_CFG_ENTRY);
1345*5113495bSYour Name 	} else {
1346*5113495bSYour Name 		cfr_err("CFR commit failed");
1347*5113495bSYour Name 	}
1348*5113495bSYour Name 
1349*5113495bSYour Name 	pcfr->rcc_param.num_grp_tlvs = 0;
1350*5113495bSYour Name 	pcfr->rcc_param.modified_in_curr_session = 0;
1351*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1352*5113495bSYour Name 
1353*5113495bSYour Name 	return status;
1354*5113495bSYour Name }
1355*5113495bSYour Name 
1356*5113495bSYour Name #ifdef WLAN_CFR_PM
ucfg_cfr_suspend(struct wlan_objmgr_pdev * pdev)1357*5113495bSYour Name QDF_STATUS ucfg_cfr_suspend(struct wlan_objmgr_pdev *pdev)
1358*5113495bSYour Name {
1359*5113495bSYour Name 	struct pdev_cfr *pcfr;
1360*5113495bSYour Name 
1361*5113495bSYour Name 	pcfr = wlan_objmgr_pdev_get_comp_private_obj(
1362*5113495bSYour Name 				pdev, WLAN_UMAC_COMP_CFR);
1363*5113495bSYour Name 
1364*5113495bSYour Name 	if (!pcfr) {
1365*5113495bSYour Name 		cfr_err("null pcfr");
1366*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1367*5113495bSYour Name 	}
1368*5113495bSYour Name 
1369*5113495bSYour Name 	return cfr_allow_suspend(pcfr);
1370*5113495bSYour Name }
1371*5113495bSYour Name 
ucfg_cfr_resume(struct wlan_objmgr_pdev * pdev)1372*5113495bSYour Name QDF_STATUS ucfg_cfr_resume(struct wlan_objmgr_pdev *pdev)
1373*5113495bSYour Name {
1374*5113495bSYour Name 	struct pdev_cfr *pcfr;
1375*5113495bSYour Name 
1376*5113495bSYour Name 	pcfr = wlan_objmgr_pdev_get_comp_private_obj(
1377*5113495bSYour Name 				pdev, WLAN_UMAC_COMP_CFR);
1378*5113495bSYour Name 
1379*5113495bSYour Name 	if (!pcfr) {
1380*5113495bSYour Name 		cfr_err("null pcfr");
1381*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1382*5113495bSYour Name 	}
1383*5113495bSYour Name 
1384*5113495bSYour Name 	return cfr_prevent_suspend(pcfr);
1385*5113495bSYour Name }
1386*5113495bSYour Name #endif
1387*5113495bSYour Name /*
1388*5113495bSYour Name  * This handler is used to enable / disable the capture mode.
1389*5113495bSYour Name  *
1390*5113495bSYour Name  */
ucfg_cfr_set_rcc_mode(struct wlan_objmgr_vdev * vdev,enum capture_type mode,uint8_t value)1391*5113495bSYour Name QDF_STATUS ucfg_cfr_set_rcc_mode(struct wlan_objmgr_vdev *vdev,
1392*5113495bSYour Name 				 enum capture_type mode, uint8_t value)
1393*5113495bSYour Name {
1394*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
1395*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
1396*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1397*5113495bSYour Name 
1398*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
1399*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
1400*5113495bSYour Name 		return status;
1401*5113495bSYour Name 
1402*5113495bSYour Name 	switch (mode) {
1403*5113495bSYour Name 	case RCC_DIRECTED_FTM_FILTER:
1404*5113495bSYour Name 		pcfr->rcc_param.m_directed_ftm = value;
1405*5113495bSYour Name 		break;
1406*5113495bSYour Name 	case RCC_ALL_FTM_ACK_FILTER:
1407*5113495bSYour Name 		pcfr->rcc_param.m_all_ftm_ack = value;
1408*5113495bSYour Name 		break;
1409*5113495bSYour Name 	case RCC_DIRECTED_NDPA_NDP_FILTER:
1410*5113495bSYour Name 		pcfr->rcc_param.m_ndpa_ndp_directed = value;
1411*5113495bSYour Name 		break;
1412*5113495bSYour Name 	case RCC_NDPA_NDP_ALL_FILTER:
1413*5113495bSYour Name 		pcfr->rcc_param.m_ndpa_ndp_all = value;
1414*5113495bSYour Name 		break;
1415*5113495bSYour Name 	case RCC_TA_RA_FILTER:
1416*5113495bSYour Name 		pcfr->rcc_param.m_ta_ra_filter = value;
1417*5113495bSYour Name 		break;
1418*5113495bSYour Name 	case RCC_ALL_PACKET_FILTER:
1419*5113495bSYour Name 		pcfr->rcc_param.m_all_packet = value;
1420*5113495bSYour Name 		break;
1421*5113495bSYour Name 	case RCC_DIS_ALL_MODE:
1422*5113495bSYour Name 		pcfr->rcc_param.m_directed_ftm = value;
1423*5113495bSYour Name 		pcfr->rcc_param.m_all_ftm_ack = value;
1424*5113495bSYour Name 		pcfr->rcc_param.m_ndpa_ndp_directed = value;
1425*5113495bSYour Name 		pcfr->rcc_param.m_ndpa_ndp_all = value;
1426*5113495bSYour Name 		pcfr->rcc_param.m_ta_ra_filter = value;
1427*5113495bSYour Name 		pcfr->rcc_param.m_all_packet = value;
1428*5113495bSYour Name 		break;
1429*5113495bSYour Name 
1430*5113495bSYour Name 	default:
1431*5113495bSYour Name 		break;
1432*5113495bSYour Name 	}
1433*5113495bSYour Name 
1434*5113495bSYour Name 	cfr_debug("<CFR_UMAC> Capture mode set by user: 0x%x\n", value);
1435*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1436*5113495bSYour Name 
1437*5113495bSYour Name 	return status;
1438*5113495bSYour Name }
1439*5113495bSYour Name #endif
1440*5113495bSYour Name 
ucfg_cfr_get_rcc_enabled(struct wlan_objmgr_vdev * vdev)1441*5113495bSYour Name bool ucfg_cfr_get_rcc_enabled(struct wlan_objmgr_vdev *vdev)
1442*5113495bSYour Name {
1443*5113495bSYour Name 	struct pdev_cfr *pcfr = NULL;
1444*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
1445*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1446*5113495bSYour Name 	bool rcc_enabled = false;
1447*5113495bSYour Name 
1448*5113495bSYour Name 	status = dev_sanity_check(vdev, &pdev, &pcfr);
1449*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
1450*5113495bSYour Name 		return false;
1451*5113495bSYour Name 
1452*5113495bSYour Name 	if ((pcfr->rcc_param.vdev_id != CFR_INVALID_VDEV_ID) &&
1453*5113495bSYour Name 	    (pcfr->rcc_param.vdev_id != wlan_vdev_get_id(vdev))) {
1454*5113495bSYour Name 		cfr_debug("vdev id mismatch, input %d, pcfr %d",
1455*5113495bSYour Name 			  wlan_vdev_get_id(vdev),
1456*5113495bSYour Name 			  pcfr->rcc_param.vdev_id);
1457*5113495bSYour Name 		return false;
1458*5113495bSYour Name 	}
1459*5113495bSYour Name 
1460*5113495bSYour Name 	rcc_enabled = cfr_is_filter_enabled(&pcfr->rcc_param);
1461*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
1462*5113495bSYour Name 
1463*5113495bSYour Name 	return rcc_enabled;
1464*5113495bSYour Name }
1465*5113495bSYour Name 
1466*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
ucfg_cfr_subscribe_ppdu_desc(struct wlan_objmgr_pdev * pdev,bool is_subscribe)1467*5113495bSYour Name QDF_STATUS ucfg_cfr_subscribe_ppdu_desc(struct wlan_objmgr_pdev *pdev,
1468*5113495bSYour Name 					bool is_subscribe)
1469*5113495bSYour Name {
1470*5113495bSYour Name 	return tgt_cfr_subscribe_ppdu_desc(pdev, is_subscribe);
1471*5113495bSYour Name }
1472*5113495bSYour Name #endif
1473*5113495bSYour Name #endif
1474