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