xref: /wlan-driver/qca-wifi-host-cmn/target_if/dfs/src/target_if_dfs_full_offload.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  *
6*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
7*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
8*5113495bSYour Name  * above copyright notice and this permission notice appear in all
9*5113495bSYour Name  * copies.
10*5113495bSYour Name  *
11*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
12*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
14*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
15*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
16*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
17*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
18*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
19*5113495bSYour Name  */
20*5113495bSYour Name 
21*5113495bSYour Name /**
22*5113495bSYour Name  * DOC: target_if_dfs_full_offload.c
23*5113495bSYour Name  * This file contains dfs target interface for full offload
24*5113495bSYour Name  */
25*5113495bSYour Name 
26*5113495bSYour Name #include <target_if.h>
27*5113495bSYour Name #include <target_if_dfs.h>
28*5113495bSYour Name #include <wmi_unified_dfs_api.h>
29*5113495bSYour Name #include <init_deinit_lmac.h>
30*5113495bSYour Name #include <wlan_module_ids.h>
31*5113495bSYour Name #include <target_if_dfs_full_offload.h>
32*5113495bSYour Name #include <wlan_dfs_tgt_api.h>
33*5113495bSYour Name #include <wlan_objmgr_pdev_obj.h>
34*5113495bSYour Name 
35*5113495bSYour Name #if defined(QCA_SUPPORT_AGILE_DFS)
36*5113495bSYour Name #include <wlan_mlme_dispatcher.h>
37*5113495bSYour Name #endif
38*5113495bSYour Name /**
39*5113495bSYour Name  * target_if_dfs_cac_complete_event_handler() - CAC complete indication.
40*5113495bSYour Name  * @scn: scn handle.
41*5113495bSYour Name  * @data: Pointer to data buffer.
42*5113495bSYour Name  * @datalen: data length.
43*5113495bSYour Name  *
44*5113495bSYour Name  * Return: 0 on successful indication.
45*5113495bSYour Name  */
target_if_dfs_cac_complete_event_handler(ol_scn_t scn,uint8_t * data,uint32_t datalen)46*5113495bSYour Name static int target_if_dfs_cac_complete_event_handler(
47*5113495bSYour Name 		ol_scn_t scn, uint8_t *data, uint32_t datalen)
48*5113495bSYour Name {
49*5113495bSYour Name 	struct wlan_lmac_if_dfs_rx_ops *dfs_rx_ops;
50*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
51*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
52*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
53*5113495bSYour Name 	int ret = 0;
54*5113495bSYour Name 	uint32_t vdev_id = 0;
55*5113495bSYour Name 	struct wmi_unified *wmi_handle;
56*5113495bSYour Name 
57*5113495bSYour Name 	if (!scn || !data) {
58*5113495bSYour Name 		target_if_err("scn: %pK, data: %pK", scn, data);
59*5113495bSYour Name 		return -EINVAL;
60*5113495bSYour Name 	}
61*5113495bSYour Name 
62*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
63*5113495bSYour Name 	if (!psoc) {
64*5113495bSYour Name 		target_if_err("null psoc");
65*5113495bSYour Name 		return -EINVAL;
66*5113495bSYour Name 	}
67*5113495bSYour Name 
68*5113495bSYour Name 	dfs_rx_ops = target_if_dfs_get_rx_ops(psoc);
69*5113495bSYour Name 	if (!dfs_rx_ops || !dfs_rx_ops->dfs_dfs_cac_complete_ind) {
70*5113495bSYour Name 		target_if_err("Invalid dfs_rx_ops: %pK", dfs_rx_ops);
71*5113495bSYour Name 		return -EINVAL;
72*5113495bSYour Name 	}
73*5113495bSYour Name 
74*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
75*5113495bSYour Name 	if (!wmi_handle) {
76*5113495bSYour Name 		target_if_err("Invalid WMI handle");
77*5113495bSYour Name 		return -EINVAL;
78*5113495bSYour Name 	}
79*5113495bSYour Name 
80*5113495bSYour Name 	if (wmi_extract_dfs_cac_complete_event(wmi_handle, data, &vdev_id,
81*5113495bSYour Name 					       datalen) != QDF_STATUS_SUCCESS) {
82*5113495bSYour Name 		target_if_err("failed to extract cac complete event");
83*5113495bSYour Name 		return -EFAULT;
84*5113495bSYour Name 	}
85*5113495bSYour Name 
86*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_DFS_ID);
87*5113495bSYour Name 	if (!vdev) {
88*5113495bSYour Name 		target_if_err("null vdev");
89*5113495bSYour Name 		return -EINVAL;
90*5113495bSYour Name 	}
91*5113495bSYour Name 
92*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
93*5113495bSYour Name 	if (!pdev) {
94*5113495bSYour Name 		target_if_err("null pdev");
95*5113495bSYour Name 		ret = -EINVAL;
96*5113495bSYour Name 	}
97*5113495bSYour Name 
98*5113495bSYour Name 	if (!ret && (QDF_STATUS_SUCCESS !=
99*5113495bSYour Name 	    dfs_rx_ops->dfs_dfs_cac_complete_ind(pdev, vdev_id))) {
100*5113495bSYour Name 		target_if_err("dfs_dfs_cac_complete_ind failed");
101*5113495bSYour Name 		ret = -EINVAL;
102*5113495bSYour Name 	}
103*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID);
104*5113495bSYour Name 
105*5113495bSYour Name 	return ret;
106*5113495bSYour Name }
107*5113495bSYour Name 
108*5113495bSYour Name #if defined(QCA_SUPPORT_AGILE_DFS)
109*5113495bSYour Name /**
110*5113495bSYour Name  * target_if_dfs_ocac_complete_event_handler() - Off Channel CAC complete
111*5113495bSYour Name  *						 indication.
112*5113495bSYour Name  * @scn: scn handle.
113*5113495bSYour Name  * @data: Pointer to data buffer.
114*5113495bSYour Name  * @datalen: data length.
115*5113495bSYour Name  *
116*5113495bSYour Name  * Return: 0 on successful indication.
117*5113495bSYour Name  */
target_if_dfs_ocac_complete_event_handler(ol_scn_t scn,uint8_t * data,uint32_t datalen)118*5113495bSYour Name static int target_if_dfs_ocac_complete_event_handler(
119*5113495bSYour Name 		ol_scn_t scn, uint8_t *data, uint32_t datalen)
120*5113495bSYour Name {
121*5113495bSYour Name 	struct wlan_lmac_if_dfs_rx_ops *dfs_rx_ops;
122*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
123*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
124*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
125*5113495bSYour Name 	struct vdev_adfs_complete_status ocac_status;
126*5113495bSYour Name 	int ret = 0;
127*5113495bSYour Name 	struct wmi_unified *wmi_handle;
128*5113495bSYour Name 
129*5113495bSYour Name 	if (!scn || !data) {
130*5113495bSYour Name 		target_if_err("scn: %pK, data: %pK", scn, data);
131*5113495bSYour Name 		return -EINVAL;
132*5113495bSYour Name 	}
133*5113495bSYour Name 
134*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
135*5113495bSYour Name 	if (!psoc) {
136*5113495bSYour Name 		target_if_err("null psoc");
137*5113495bSYour Name 		return -EINVAL;
138*5113495bSYour Name 	}
139*5113495bSYour Name 
140*5113495bSYour Name 	dfs_rx_ops = target_if_dfs_get_rx_ops(psoc);
141*5113495bSYour Name 	if (!dfs_rx_ops || !dfs_rx_ops->dfs_dfs_ocac_complete_ind) {
142*5113495bSYour Name 		target_if_err("Invalid dfs_rx_ops: %pK", dfs_rx_ops);
143*5113495bSYour Name 		return -EINVAL;
144*5113495bSYour Name 	}
145*5113495bSYour Name 
146*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
147*5113495bSYour Name 	if (!wmi_handle) {
148*5113495bSYour Name 		target_if_err("Invalid WMI handle");
149*5113495bSYour Name 		return -EINVAL;
150*5113495bSYour Name 	}
151*5113495bSYour Name 
152*5113495bSYour Name 	if (wmi_extract_dfs_ocac_complete_event(wmi_handle,
153*5113495bSYour Name 						data,
154*5113495bSYour Name 						&ocac_status)
155*5113495bSYour Name 						!= QDF_STATUS_SUCCESS) {
156*5113495bSYour Name 		target_if_err("failed to extract off channel cac complete event");
157*5113495bSYour Name 		return -EFAULT;
158*5113495bSYour Name 	}
159*5113495bSYour Name 
160*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc,
161*5113495bSYour Name 						    ocac_status.vdev_id,
162*5113495bSYour Name 						    WLAN_DFS_ID);
163*5113495bSYour Name 	if (!vdev) {
164*5113495bSYour Name 		target_if_err("null vdev");
165*5113495bSYour Name 		return -EINVAL;
166*5113495bSYour Name 	}
167*5113495bSYour Name 
168*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
169*5113495bSYour Name 	if (!pdev) {
170*5113495bSYour Name 		target_if_err("null pdev");
171*5113495bSYour Name 		ret = -EINVAL;
172*5113495bSYour Name 		goto free_vdevref;
173*5113495bSYour Name 	}
174*5113495bSYour Name 
175*5113495bSYour Name 	if (!ret && (QDF_STATUS_SUCCESS !=
176*5113495bSYour Name 	    dfs_rx_ops->dfs_dfs_ocac_complete_ind(pdev, &ocac_status))) {
177*5113495bSYour Name 		target_if_err("dfs_dfs_ocac_complete_ind failed");
178*5113495bSYour Name 		ret = -EINVAL;
179*5113495bSYour Name 	}
180*5113495bSYour Name 
181*5113495bSYour Name free_vdevref:
182*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID);
183*5113495bSYour Name 
184*5113495bSYour Name 	return ret;
185*5113495bSYour Name }
186*5113495bSYour Name #endif
187*5113495bSYour Name 
188*5113495bSYour Name #ifdef MOBILE_DFS_SUPPORT
189*5113495bSYour Name /**
190*5113495bSYour Name  * target_if_dfs_get_pdev() -  retrieve pdev by id
191*5113495bSYour Name  * @psoc: PSOC object
192*5113495bSYour Name  * @id: pdev id
193*5113495bSYour Name  * @dbg_id: id of the caller
194*5113495bSYour Name  *
195*5113495bSYour Name  * Return: pdev pointer
196*5113495bSYour Name  *         NULL on FAILURE
197*5113495bSYour Name  */
target_if_dfs_get_pdev(struct wlan_objmgr_psoc * psoc,uint8_t id,wlan_objmgr_ref_dbgid dbg_id)198*5113495bSYour Name static struct wlan_objmgr_pdev *target_if_dfs_get_pdev(
199*5113495bSYour Name 		struct wlan_objmgr_psoc *psoc, uint8_t id,
200*5113495bSYour Name 		wlan_objmgr_ref_dbgid dbg_id)
201*5113495bSYour Name {
202*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
203*5113495bSYour Name 
204*5113495bSYour Name 	pdev = wlan_objmgr_get_pdev_by_id(psoc, id, dbg_id);
205*5113495bSYour Name 	if (!pdev) {
206*5113495bSYour Name 		pdev = wlan_objmgr_get_pdev_by_id(psoc, TGT_WMI_PDEV_ID_SOC,
207*5113495bSYour Name 						  dbg_id);
208*5113495bSYour Name 		if (!pdev)
209*5113495bSYour Name 			target_if_err("pdev id %d null pdev",
210*5113495bSYour Name 				      TGT_WMI_PDEV_ID_SOC);
211*5113495bSYour Name 	}
212*5113495bSYour Name 
213*5113495bSYour Name 	return pdev;
214*5113495bSYour Name }
215*5113495bSYour Name #else
target_if_dfs_get_pdev(struct wlan_objmgr_psoc * psoc,uint8_t id,wlan_objmgr_ref_dbgid dbg_id)216*5113495bSYour Name static struct wlan_objmgr_pdev *target_if_dfs_get_pdev(
217*5113495bSYour Name 		struct wlan_objmgr_psoc *psoc, uint8_t id,
218*5113495bSYour Name 		wlan_objmgr_ref_dbgid dbg_id)
219*5113495bSYour Name {
220*5113495bSYour Name 	return wlan_objmgr_get_pdev_by_id(psoc, id, dbg_id);
221*5113495bSYour Name }
222*5113495bSYour Name #endif
223*5113495bSYour Name 
224*5113495bSYour Name /**
225*5113495bSYour Name  * target_if_dfs_radar_detection_event_handler() - Indicate RADAR detection and
226*5113495bSYour Name  * process RADAR detection.
227*5113495bSYour Name  * @scn: scn handle.
228*5113495bSYour Name  * @data: pointer to data buffer.
229*5113495bSYour Name  * @datalen: data length.
230*5113495bSYour Name  *
231*5113495bSYour Name  * Return: 0 on successful indication.
232*5113495bSYour Name  */
target_if_dfs_radar_detection_event_handler(ol_scn_t scn,uint8_t * data,uint32_t datalen)233*5113495bSYour Name static int target_if_dfs_radar_detection_event_handler(
234*5113495bSYour Name 		ol_scn_t scn, uint8_t *data, uint32_t datalen)
235*5113495bSYour Name {
236*5113495bSYour Name 	struct radar_found_info radar;
237*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
238*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
239*5113495bSYour Name 	struct wlan_lmac_if_dfs_rx_ops *dfs_rx_ops;
240*5113495bSYour Name 	int ret = 0;
241*5113495bSYour Name 	struct wmi_unified *wmi_handle;
242*5113495bSYour Name 
243*5113495bSYour Name 	if (!scn || !data) {
244*5113495bSYour Name 		target_if_err("scn: %pK, data: %pK", scn, data);
245*5113495bSYour Name 		return -EINVAL;
246*5113495bSYour Name 	}
247*5113495bSYour Name 
248*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
249*5113495bSYour Name 	if (!psoc) {
250*5113495bSYour Name 		target_if_err("null psoc");
251*5113495bSYour Name 		return -EINVAL;
252*5113495bSYour Name 	}
253*5113495bSYour Name 
254*5113495bSYour Name 	dfs_rx_ops = target_if_dfs_get_rx_ops(psoc);
255*5113495bSYour Name 	if (!dfs_rx_ops || !dfs_rx_ops->dfs_process_radar_ind) {
256*5113495bSYour Name 		target_if_err("Invalid dfs_rx_ops: %pK", dfs_rx_ops);
257*5113495bSYour Name 		return -EINVAL;
258*5113495bSYour Name 	}
259*5113495bSYour Name 
260*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
261*5113495bSYour Name 	if (!wmi_handle) {
262*5113495bSYour Name 		target_if_err("Invalid WMI handle");
263*5113495bSYour Name 		return -EINVAL;
264*5113495bSYour Name 	}
265*5113495bSYour Name 
266*5113495bSYour Name 	if (wmi_extract_dfs_radar_detection_event(wmi_handle, data, &radar,
267*5113495bSYour Name 						  datalen)
268*5113495bSYour Name 	    != QDF_STATUS_SUCCESS) {
269*5113495bSYour Name 		target_if_err("failed to extract cac complete event");
270*5113495bSYour Name 		return -EFAULT;
271*5113495bSYour Name 	}
272*5113495bSYour Name 
273*5113495bSYour Name 	pdev = target_if_dfs_get_pdev(psoc, radar.pdev_id, WLAN_DFS_ID);
274*5113495bSYour Name 	if (!pdev) {
275*5113495bSYour Name 		target_if_err("pdev id %d null pdev", radar.pdev_id);
276*5113495bSYour Name 		return -EINVAL;
277*5113495bSYour Name 	}
278*5113495bSYour Name 
279*5113495bSYour Name 	if (dfs_rx_ops->dfs_process_radar_ind(pdev,
280*5113495bSYour Name 				&radar) != QDF_STATUS_SUCCESS) {
281*5113495bSYour Name 		target_if_err("dfs_process_radar_ind failed pdev_id=%d",
282*5113495bSYour Name 			      radar.pdev_id);
283*5113495bSYour Name 		ret = -EINVAL;
284*5113495bSYour Name 	}
285*5113495bSYour Name 
286*5113495bSYour Name 	wlan_objmgr_pdev_release_ref(pdev, WLAN_DFS_ID);
287*5113495bSYour Name 
288*5113495bSYour Name 	return ret;
289*5113495bSYour Name }
290*5113495bSYour Name 
291*5113495bSYour Name /**
292*5113495bSYour Name  * target_if_dfs_reg_ocac_event() - registers dfs off channel event
293*5113495bSYour Name  * for full offload.
294*5113495bSYour Name  * @psoc: Pointer to psoc object.
295*5113495bSYour Name  *
296*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on successful registration.
297*5113495bSYour Name  */
298*5113495bSYour Name #if defined(QCA_SUPPORT_AGILE_DFS)
target_if_dfs_reg_ocac_event(struct wlan_objmgr_psoc * psoc)299*5113495bSYour Name static QDF_STATUS target_if_dfs_reg_ocac_event(struct wlan_objmgr_psoc *psoc)
300*5113495bSYour Name {
301*5113495bSYour Name 	return wmi_unified_register_event(
302*5113495bSYour Name 			get_wmi_unified_hdl_from_psoc(psoc),
303*5113495bSYour Name 			wmi_vdev_ocac_complete_event_id,
304*5113495bSYour Name 			target_if_dfs_ocac_complete_event_handler);
305*5113495bSYour Name }
306*5113495bSYour Name #else
target_if_dfs_reg_ocac_event(struct wlan_objmgr_psoc * psoc)307*5113495bSYour Name static QDF_STATUS target_if_dfs_reg_ocac_event(struct wlan_objmgr_psoc *psoc)
308*5113495bSYour Name {
309*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
310*5113495bSYour Name }
311*5113495bSYour Name #endif
312*5113495bSYour Name 
313*5113495bSYour Name #if defined(WLAN_DFS_FULL_OFFLOAD)
target_if_dfs_reg_offload_events(struct wlan_objmgr_psoc * psoc)314*5113495bSYour Name QDF_STATUS target_if_dfs_reg_offload_events(
315*5113495bSYour Name 		struct wlan_objmgr_psoc *psoc)
316*5113495bSYour Name {
317*5113495bSYour Name 	QDF_STATUS ret1, ret2, ret3;
318*5113495bSYour Name 
319*5113495bSYour Name 	ret1 = wmi_unified_register_event(
320*5113495bSYour Name 			get_wmi_unified_hdl_from_psoc(psoc),
321*5113495bSYour Name 			wmi_dfs_radar_detection_event_id,
322*5113495bSYour Name 			target_if_dfs_radar_detection_event_handler);
323*5113495bSYour Name 	target_if_debug("wmi_dfs_radar_detection_event_id ret=%d", ret1);
324*5113495bSYour Name 
325*5113495bSYour Name 	ret2 = wmi_unified_register_event(
326*5113495bSYour Name 			get_wmi_unified_hdl_from_psoc(psoc),
327*5113495bSYour Name 			wmi_dfs_cac_complete_id,
328*5113495bSYour Name 			target_if_dfs_cac_complete_event_handler);
329*5113495bSYour Name 	target_if_debug("wmi_dfs_cac_complete_id ret=%d", ret2);
330*5113495bSYour Name 
331*5113495bSYour Name 	ret3 = target_if_dfs_reg_ocac_event(psoc);
332*5113495bSYour Name 	target_if_debug("wmi_vdev_ocac_complete_event_id ret=%d", ret3);
333*5113495bSYour Name 
334*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret1) || QDF_IS_STATUS_ERROR(ret2) ||
335*5113495bSYour Name 	    QDF_IS_STATUS_ERROR(ret3))
336*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
337*5113495bSYour Name 	else
338*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
339*5113495bSYour Name }
340*5113495bSYour Name #endif
341*5113495bSYour Name 
342*5113495bSYour Name #if defined(QCA_SUPPORT_AGILE_DFS)
target_send_ocac_abort_cmd(struct wlan_objmgr_pdev * pdev)343*5113495bSYour Name QDF_STATUS target_send_ocac_abort_cmd(struct wlan_objmgr_pdev *pdev)
344*5113495bSYour Name {
345*5113495bSYour Name 	wmi_unified_t wmi_handle;
346*5113495bSYour Name 	struct vdev_adfs_abort_params param;
347*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
348*5113495bSYour Name 	QDF_STATUS status;
349*5113495bSYour Name 
350*5113495bSYour Name 	if (!pdev) {
351*5113495bSYour Name 		target_if_err("null pdev");
352*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
353*5113495bSYour Name 	}
354*5113495bSYour Name 
355*5113495bSYour Name 	vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_DFS_ID);
356*5113495bSYour Name 
357*5113495bSYour Name 	if (!vdev) {
358*5113495bSYour Name 		target_if_err("null vdev");
359*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
360*5113495bSYour Name 	}
361*5113495bSYour Name 
362*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
363*5113495bSYour Name 	if (!wmi_handle) {
364*5113495bSYour Name 		target_if_err("null wmi_handle");
365*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
366*5113495bSYour Name 		goto free_vdevref;
367*5113495bSYour Name 	}
368*5113495bSYour Name 
369*5113495bSYour Name 	qdf_mem_set(&param, sizeof(param), 0);
370*5113495bSYour Name 	param.vdev_id = wlan_vdev_get_id(vdev);
371*5113495bSYour Name 	utils_dfs_cancel_precac_timer(pdev);
372*5113495bSYour Name 
373*5113495bSYour Name 	status = wmi_unified_send_vdev_adfs_ocac_abort_cmd(wmi_handle, &param);
374*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
375*5113495bSYour Name 		target_if_err("dfs: unit_test_cmd send failed %d", status);
376*5113495bSYour Name 
377*5113495bSYour Name free_vdevref:
378*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID);
379*5113495bSYour Name 
380*5113495bSYour Name 	return status;
381*5113495bSYour Name }
382*5113495bSYour Name 
target_send_agile_ch_cfg_cmd(struct wlan_objmgr_pdev * pdev,struct dfs_agile_cac_params * adfs_param)383*5113495bSYour Name QDF_STATUS target_send_agile_ch_cfg_cmd(struct wlan_objmgr_pdev *pdev,
384*5113495bSYour Name 					struct dfs_agile_cac_params *adfs_param)
385*5113495bSYour Name {
386*5113495bSYour Name 	wmi_unified_t wmi_handle;
387*5113495bSYour Name 	struct vdev_adfs_ch_cfg_params param;
388*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
389*5113495bSYour Name 	QDF_STATUS status;
390*5113495bSYour Name 
391*5113495bSYour Name 	if (!pdev) {
392*5113495bSYour Name 		target_if_err("null pdev");
393*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
394*5113495bSYour Name 	}
395*5113495bSYour Name 
396*5113495bSYour Name 	vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_DFS_ID);
397*5113495bSYour Name 
398*5113495bSYour Name 	if (!vdev) {
399*5113495bSYour Name 		target_if_err("null vdev");
400*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
401*5113495bSYour Name 	}
402*5113495bSYour Name 
403*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
404*5113495bSYour Name 	if (!wmi_handle) {
405*5113495bSYour Name 		target_if_err("null wmi_handle");
406*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
407*5113495bSYour Name 		goto free_vdevref;
408*5113495bSYour Name 	}
409*5113495bSYour Name 
410*5113495bSYour Name 	qdf_mem_set(&param, sizeof(param), 0);
411*5113495bSYour Name 	param.vdev_id = wlan_vdev_get_id(vdev);
412*5113495bSYour Name 	param.ocac_mode = adfs_param->ocac_mode;
413*5113495bSYour Name 	param.min_duration_ms = adfs_param->min_precac_timeout;
414*5113495bSYour Name 	param.max_duration_ms = adfs_param->max_precac_timeout;
415*5113495bSYour Name 	param.chan_freq = adfs_param->precac_center_freq_1;
416*5113495bSYour Name 	param.chan_width = adfs_param->precac_chwidth;
417*5113495bSYour Name 	param.center_freq1 = adfs_param->precac_center_freq_1;
418*5113495bSYour Name 	param.center_freq2 = adfs_param->precac_center_freq_2;
419*5113495bSYour Name 
420*5113495bSYour Name 	status = wmi_unified_send_vdev_adfs_ch_cfg_cmd(wmi_handle, &param);
421*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
422*5113495bSYour Name 		target_if_err("dfs: unit_test_cmd send failed %d", status);
423*5113495bSYour Name 
424*5113495bSYour Name free_vdevref:
425*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID);
426*5113495bSYour Name 
427*5113495bSYour Name 	return status;
428*5113495bSYour Name }
429*5113495bSYour Name #endif
430*5113495bSYour Name 
431*5113495bSYour Name #if (defined(WLAN_DFS_FULL_OFFLOAD) || defined(QCA_WIFI_QCA8074) || \
432*5113495bSYour Name 	defined(QCA_WIFI_QCA6018) || defined(QCA_WIFI_QCA5018) || \
433*5113495bSYour Name 	defined(QCA_WIFI_QCA9574) || defined(QCA_WIFI_QCA5332))
target_process_bang_radar_cmd(struct wlan_objmgr_pdev * pdev,struct dfs_emulate_bang_radar_test_cmd * dfs_unit_test)434*5113495bSYour Name QDF_STATUS target_process_bang_radar_cmd(
435*5113495bSYour Name 		struct wlan_objmgr_pdev *pdev,
436*5113495bSYour Name 		struct dfs_emulate_bang_radar_test_cmd *dfs_unit_test)
437*5113495bSYour Name {
438*5113495bSYour Name 	QDF_STATUS status;
439*5113495bSYour Name 	struct wmi_unit_test_cmd wmi_utest;
440*5113495bSYour Name 	int i;
441*5113495bSYour Name 	wmi_unified_t wmi_handle;
442*5113495bSYour Name 	uint32_t target_pdev_id = 0;
443*5113495bSYour Name 
444*5113495bSYour Name 	if (!pdev) {
445*5113495bSYour Name 		target_if_err("null pdev");
446*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
447*5113495bSYour Name 	}
448*5113495bSYour Name 
449*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
450*5113495bSYour Name 	if (!wmi_handle) {
451*5113495bSYour Name 		target_if_err("null wmi_handle");
452*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
453*5113495bSYour Name 	}
454*5113495bSYour Name 
455*5113495bSYour Name 	wmi_utest.vdev_id = dfs_unit_test->vdev_id;
456*5113495bSYour Name 	wmi_utest.module_id = WLAN_MODULE_PHYERR_DFS;
457*5113495bSYour Name 	wmi_utest.num_args = dfs_unit_test->num_args;
458*5113495bSYour Name 
459*5113495bSYour Name 	for (i = 0; i < dfs_unit_test->num_args; i++)
460*5113495bSYour Name 		wmi_utest.args[i] = dfs_unit_test->args[i];
461*5113495bSYour Name 	/*
462*5113495bSYour Name 	 * Host to Target  conversion for pdev id required
463*5113495bSYour Name 	 * before we send a wmi unit test command
464*5113495bSYour Name 	 */
465*5113495bSYour Name 	if (wmi_convert_pdev_id_host_to_target(
466*5113495bSYour Name 				wmi_handle, pdev->pdev_objmgr.wlan_pdev_id,
467*5113495bSYour Name 				&target_pdev_id) != QDF_STATUS_SUCCESS) {
468*5113495bSYour Name 		target_if_err("failed to convert host pdev id to target");
469*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
470*5113495bSYour Name 	}
471*5113495bSYour Name 
472*5113495bSYour Name 	wmi_utest.args[IDX_PDEV_ID] = target_pdev_id;
473*5113495bSYour Name 
474*5113495bSYour Name 	status = wmi_unified_unit_test_cmd(wmi_handle, &wmi_utest);
475*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
476*5113495bSYour Name 		target_if_err("dfs: unit_test_cmd send failed %d", status);
477*5113495bSYour Name 	return status;
478*5113495bSYour Name }
479*5113495bSYour Name #endif
480*5113495bSYour Name 
481*5113495bSYour Name #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD)
target_send_usenol_pdev_param(struct wlan_objmgr_pdev * pdev,bool usenol)482*5113495bSYour Name QDF_STATUS target_send_usenol_pdev_param(struct wlan_objmgr_pdev *pdev,
483*5113495bSYour Name 					 bool usenol)
484*5113495bSYour Name {
485*5113495bSYour Name 	QDF_STATUS status;
486*5113495bSYour Name 	wmi_unified_t wmi_handle;
487*5113495bSYour Name 
488*5113495bSYour Name 	if (!pdev) {
489*5113495bSYour Name 		target_if_err("null pdev");
490*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
491*5113495bSYour Name 	}
492*5113495bSYour Name 
493*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
494*5113495bSYour Name 	if (!wmi_handle) {
495*5113495bSYour Name 		target_if_err("null wmi_handle");
496*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
497*5113495bSYour Name 	}
498*5113495bSYour Name 	status = wmi_send_usenol_pdev_param(wmi_handle, usenol, pdev);
499*5113495bSYour Name 
500*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
501*5113495bSYour Name 		target_if_err("dfs: usenol_pdev_param send failed %d", status);
502*5113495bSYour Name 	return status;
503*5113495bSYour Name }
504*5113495bSYour Name 
505*5113495bSYour Name QDF_STATUS
target_send_subchan_marking_pdev_param(struct wlan_objmgr_pdev * pdev,bool subchanmark)506*5113495bSYour Name target_send_subchan_marking_pdev_param(struct wlan_objmgr_pdev *pdev,
507*5113495bSYour Name 				       bool subchanmark)
508*5113495bSYour Name {
509*5113495bSYour Name 	QDF_STATUS status;
510*5113495bSYour Name 	wmi_unified_t wmi_handle;
511*5113495bSYour Name 
512*5113495bSYour Name 	if (!pdev) {
513*5113495bSYour Name 		target_if_err("null pdev");
514*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
515*5113495bSYour Name 	}
516*5113495bSYour Name 
517*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
518*5113495bSYour Name 	if (!wmi_handle) {
519*5113495bSYour Name 		target_if_err("null wmi_handle");
520*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
521*5113495bSYour Name 	}
522*5113495bSYour Name 	status = wmi_send_subchan_marking_pdev_param(wmi_handle,
523*5113495bSYour Name 						     subchanmark, pdev);
524*5113495bSYour Name 
525*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
526*5113495bSYour Name 		target_if_err("dfs: subchan_marking_pdev_param send failed %d",
527*5113495bSYour Name 			      status);
528*5113495bSYour Name 
529*5113495bSYour Name 	return status;
530*5113495bSYour Name }
531*5113495bSYour Name #endif
532