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