xref: /wlan-driver/qca-wifi-host-cmn/target_if/scan/src/target_if_scan.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: offload lmac interface APIs definitions for scan
22*5113495bSYour Name  */
23*5113495bSYour Name 
24*5113495bSYour Name #include <qdf_mem.h>
25*5113495bSYour Name #include <qdf_status.h>
26*5113495bSYour Name #include <target_if_scan.h>
27*5113495bSYour Name #include <wmi_unified_priv.h>
28*5113495bSYour Name #include <wmi_unified_param.h>
29*5113495bSYour Name #include <wlan_objmgr_psoc_obj.h>
30*5113495bSYour Name #include <wlan_scan_tgt_api.h>
31*5113495bSYour Name #include <target_if.h>
32*5113495bSYour Name 
33*5113495bSYour Name static inline struct wlan_lmac_if_scan_rx_ops *
target_if_scan_get_rx_ops(struct wlan_objmgr_psoc * psoc)34*5113495bSYour Name target_if_scan_get_rx_ops(struct wlan_objmgr_psoc *psoc)
35*5113495bSYour Name {
36*5113495bSYour Name 	struct wlan_lmac_if_rx_ops *rx_ops;
37*5113495bSYour Name 
38*5113495bSYour Name 	rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
39*5113495bSYour Name 	if (!rx_ops) {
40*5113495bSYour Name 		target_if_err("rx_ops is NULL");
41*5113495bSYour Name 		return NULL;
42*5113495bSYour Name 	}
43*5113495bSYour Name 
44*5113495bSYour Name 	return &rx_ops->scan;
45*5113495bSYour Name }
46*5113495bSYour Name 
target_if_update_aux_support(struct wlan_objmgr_psoc * psoc)47*5113495bSYour Name QDF_STATUS target_if_update_aux_support(struct wlan_objmgr_psoc *psoc)
48*5113495bSYour Name {
49*5113495bSYour Name 	struct wmi_unified *wmi_handle;
50*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
51*5113495bSYour Name 
52*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
53*5113495bSYour Name 
54*5113495bSYour Name 	if (!wmi_handle) {
55*5113495bSYour Name 		target_if_err("null wmi handle");
56*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
57*5113495bSYour Name 	}
58*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
59*5113495bSYour Name 
60*5113495bSYour Name 	if (!scan_obj) {
61*5113495bSYour Name 		target_if_err("Failed to get scan object");
62*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
63*5113495bSYour Name 	}
64*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_aux_mac_support))
65*5113495bSYour Name 		scan_obj->aux_mac_support = true;
66*5113495bSYour Name 	else
67*5113495bSYour Name 		scan_obj->aux_mac_support = false;
68*5113495bSYour Name 
69*5113495bSYour Name 	target_if_debug("aux_mac_support:%d", scan_obj->aux_mac_support);
70*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
71*5113495bSYour Name }
72*5113495bSYour Name 
73*5113495bSYour Name static int
target_if_scan_event_handler(ol_scn_t scn,uint8_t * data,uint32_t datalen)74*5113495bSYour Name target_if_scan_event_handler(ol_scn_t scn, uint8_t *data, uint32_t datalen)
75*5113495bSYour Name {
76*5113495bSYour Name 	struct scan_event_info *event_info;
77*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
78*5113495bSYour Name 	struct wmi_unified *wmi_handle;
79*5113495bSYour Name 	struct wlan_lmac_if_scan_rx_ops *scan_rx_ops;
80*5113495bSYour Name 	QDF_STATUS status;
81*5113495bSYour Name 
82*5113495bSYour Name 	if (!scn || !data) {
83*5113495bSYour Name 		target_if_err("scn: 0x%pK, data: 0x%pK\n", scn, data);
84*5113495bSYour Name 		return -EINVAL;
85*5113495bSYour Name 	}
86*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
87*5113495bSYour Name 	if (!psoc) {
88*5113495bSYour Name 		target_if_err("null psoc\n");
89*5113495bSYour Name 		return -EINVAL;
90*5113495bSYour Name 	}
91*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
92*5113495bSYour Name 
93*5113495bSYour Name 	if (!wmi_handle) {
94*5113495bSYour Name 		target_if_err("wmi_handle is NULL");
95*5113495bSYour Name 		return -EINVAL;
96*5113495bSYour Name 	}
97*5113495bSYour Name 
98*5113495bSYour Name 	event_info = qdf_mem_malloc(sizeof(*event_info));
99*5113495bSYour Name 
100*5113495bSYour Name 	if (!event_info)
101*5113495bSYour Name 		return -ENOMEM;
102*5113495bSYour Name 
103*5113495bSYour Name 	if (wmi_extract_vdev_scan_ev_param(wmi_handle, data,
104*5113495bSYour Name 	   &(event_info->event))) {
105*5113495bSYour Name 		target_if_err("Failed to extract wmi scan event");
106*5113495bSYour Name 		qdf_mem_free(event_info);
107*5113495bSYour Name 		return -EINVAL;
108*5113495bSYour Name 	}
109*5113495bSYour Name 
110*5113495bSYour Name 	scan_rx_ops = target_if_scan_get_rx_ops(psoc);
111*5113495bSYour Name 	if (!scan_rx_ops) {
112*5113495bSYour Name 		target_if_err("scan_rx_ops is NULL");
113*5113495bSYour Name 		return -EINVAL;
114*5113495bSYour Name 	}
115*5113495bSYour Name 
116*5113495bSYour Name 	if (scan_rx_ops->scan_ev_handler) {
117*5113495bSYour Name 		status = scan_rx_ops->scan_ev_handler(psoc, event_info);
118*5113495bSYour Name 		if (status != QDF_STATUS_SUCCESS) {
119*5113495bSYour Name 			qdf_mem_free(event_info);
120*5113495bSYour Name 			return -EINVAL;
121*5113495bSYour Name 		}
122*5113495bSYour Name 	} else {
123*5113495bSYour Name 		qdf_mem_free(event_info);
124*5113495bSYour Name 		return -EINVAL;
125*5113495bSYour Name 	}
126*5113495bSYour Name 
127*5113495bSYour Name 	return 0;
128*5113495bSYour Name }
129*5113495bSYour Name 
130*5113495bSYour Name #ifdef FEATURE_WLAN_SCAN_PNO
131*5113495bSYour Name 
target_if_nlo_complete_handler(ol_scn_t scn,uint8_t * data,uint32_t len)132*5113495bSYour Name int target_if_nlo_complete_handler(ol_scn_t scn, uint8_t *data,
133*5113495bSYour Name 	uint32_t len)
134*5113495bSYour Name {
135*5113495bSYour Name 	struct scan_event_info *event_info;
136*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
137*5113495bSYour Name 	struct wmi_unified *wmi_handle;
138*5113495bSYour Name 	struct wlan_lmac_if_scan_rx_ops *scan_rx_ops;
139*5113495bSYour Name 	QDF_STATUS status;
140*5113495bSYour Name 
141*5113495bSYour Name 	if (!scn || !data) {
142*5113495bSYour Name 		target_if_err("scn: 0x%pK, data: 0x%pK", scn, data);
143*5113495bSYour Name 		return -EINVAL;
144*5113495bSYour Name 	}
145*5113495bSYour Name 
146*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
147*5113495bSYour Name 	if (!psoc) {
148*5113495bSYour Name 		target_if_err("null psoc");
149*5113495bSYour Name 		return -EINVAL;
150*5113495bSYour Name 	}
151*5113495bSYour Name 
152*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
153*5113495bSYour Name 	if (!wmi_handle) {
154*5113495bSYour Name 		target_if_err("wmi_handle is NULL");
155*5113495bSYour Name 		return -EINVAL;
156*5113495bSYour Name 	}
157*5113495bSYour Name 
158*5113495bSYour Name 	event_info = qdf_mem_malloc(sizeof(*event_info));
159*5113495bSYour Name 	if (!event_info)
160*5113495bSYour Name 		return -ENOMEM;
161*5113495bSYour Name 
162*5113495bSYour Name 	if (wmi_extract_nlo_complete_ev_param(wmi_handle, data,
163*5113495bSYour Name 					      &event_info->event)) {
164*5113495bSYour Name 		target_if_err("Failed to extract WMI PNO complete event");
165*5113495bSYour Name 		qdf_mem_free(event_info);
166*5113495bSYour Name 		return -EINVAL;
167*5113495bSYour Name 	}
168*5113495bSYour Name 
169*5113495bSYour Name 	target_if_debug("PNO complete event received for vdev %d",
170*5113495bSYour Name 			event_info->event.vdev_id);
171*5113495bSYour Name 
172*5113495bSYour Name 	scan_rx_ops = target_if_scan_get_rx_ops(psoc);
173*5113495bSYour Name 	if (!scan_rx_ops) {
174*5113495bSYour Name 		target_if_err("scan_rx_ops is NULL");
175*5113495bSYour Name 		return -EINVAL;
176*5113495bSYour Name 	}
177*5113495bSYour Name 
178*5113495bSYour Name 	if (scan_rx_ops->scan_ev_handler) {
179*5113495bSYour Name 		status = scan_rx_ops->scan_ev_handler(psoc, event_info);
180*5113495bSYour Name 		if (status != QDF_STATUS_SUCCESS) {
181*5113495bSYour Name 			qdf_mem_free(event_info);
182*5113495bSYour Name 			return -EINVAL;
183*5113495bSYour Name 		}
184*5113495bSYour Name 	} else {
185*5113495bSYour Name 		qdf_mem_free(event_info);
186*5113495bSYour Name 		return -EINVAL;
187*5113495bSYour Name 	}
188*5113495bSYour Name 
189*5113495bSYour Name 	return 0;
190*5113495bSYour Name }
191*5113495bSYour Name 
target_if_nlo_match_event_handler(ol_scn_t scn,uint8_t * data,uint32_t len)192*5113495bSYour Name int target_if_nlo_match_event_handler(ol_scn_t scn, uint8_t *data,
193*5113495bSYour Name 	uint32_t len)
194*5113495bSYour Name {
195*5113495bSYour Name 	struct scan_event_info *event_info;
196*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
197*5113495bSYour Name 	struct wmi_unified *wmi_handle;
198*5113495bSYour Name 	struct wlan_lmac_if_scan_rx_ops *scan_rx_ops;
199*5113495bSYour Name 	QDF_STATUS status;
200*5113495bSYour Name 
201*5113495bSYour Name 	if (!scn || !data) {
202*5113495bSYour Name 		target_if_err("scn: 0x%pK, data: 0x%pK", scn, data);
203*5113495bSYour Name 		return -EINVAL;
204*5113495bSYour Name 	}
205*5113495bSYour Name 
206*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
207*5113495bSYour Name 	if (!psoc) {
208*5113495bSYour Name 		target_if_err("null psoc");
209*5113495bSYour Name 		return -EINVAL;
210*5113495bSYour Name 	}
211*5113495bSYour Name 
212*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
213*5113495bSYour Name 	if (!wmi_handle) {
214*5113495bSYour Name 		target_if_err("wmi_handle is NULL");
215*5113495bSYour Name 		return -EINVAL;
216*5113495bSYour Name 	}
217*5113495bSYour Name 
218*5113495bSYour Name 	event_info = qdf_mem_malloc(sizeof(*event_info));
219*5113495bSYour Name 	if (!event_info)
220*5113495bSYour Name 		return -ENOMEM;
221*5113495bSYour Name 
222*5113495bSYour Name 	if (wmi_extract_nlo_match_ev_param(wmi_handle, data,
223*5113495bSYour Name 					   &event_info->event)) {
224*5113495bSYour Name 		target_if_err("Failed to extract WMI PNO match event");
225*5113495bSYour Name 		qdf_mem_free(event_info);
226*5113495bSYour Name 		return -EINVAL;
227*5113495bSYour Name 	}
228*5113495bSYour Name 
229*5113495bSYour Name 	target_if_debug("PNO match event received for vdev %d",
230*5113495bSYour Name 			event_info->event.vdev_id);
231*5113495bSYour Name 
232*5113495bSYour Name 	scan_rx_ops = target_if_scan_get_rx_ops(psoc);
233*5113495bSYour Name 	if (!scan_rx_ops) {
234*5113495bSYour Name 		target_if_err("scan_rx_ops is NULL");
235*5113495bSYour Name 		return -EINVAL;
236*5113495bSYour Name 	}
237*5113495bSYour Name 
238*5113495bSYour Name 	if (scan_rx_ops->scan_ev_handler) {
239*5113495bSYour Name 		status = scan_rx_ops->scan_ev_handler(psoc, event_info);
240*5113495bSYour Name 		if (status != QDF_STATUS_SUCCESS) {
241*5113495bSYour Name 			qdf_mem_free(event_info);
242*5113495bSYour Name 			return -EINVAL;
243*5113495bSYour Name 		}
244*5113495bSYour Name 	} else {
245*5113495bSYour Name 		qdf_mem_free(event_info);
246*5113495bSYour Name 		return -EINVAL;
247*5113495bSYour Name 	}
248*5113495bSYour Name 
249*5113495bSYour Name 	return 0;
250*5113495bSYour Name }
251*5113495bSYour Name 
252*5113495bSYour Name static QDF_STATUS
target_if_scan_register_pno_event_handler(struct wlan_objmgr_psoc * psoc,void * arg)253*5113495bSYour Name target_if_scan_register_pno_event_handler(struct wlan_objmgr_psoc *psoc,
254*5113495bSYour Name 	void *arg)
255*5113495bSYour Name {
256*5113495bSYour Name 	QDF_STATUS status;
257*5113495bSYour Name 	struct wmi_unified *wmi_handle;
258*5113495bSYour Name 
259*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
260*5113495bSYour Name 	if (!wmi_handle) {
261*5113495bSYour Name 		target_if_err("Invalid WMI handle");
262*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
263*5113495bSYour Name 	}
264*5113495bSYour Name 
265*5113495bSYour Name 	status = wmi_unified_register_event(
266*5113495bSYour Name 			wmi_handle,
267*5113495bSYour Name 			wmi_nlo_match_event_id,
268*5113495bSYour Name 			target_if_nlo_match_event_handler);
269*5113495bSYour Name 	if (status) {
270*5113495bSYour Name 		target_if_err("Failed to register nlo match event cb");
271*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
272*5113495bSYour Name 	}
273*5113495bSYour Name 
274*5113495bSYour Name 	status = wmi_unified_register_event(
275*5113495bSYour Name 			wmi_handle,
276*5113495bSYour Name 			wmi_nlo_scan_complete_event_id,
277*5113495bSYour Name 			target_if_nlo_complete_handler);
278*5113495bSYour Name 	if (status) {
279*5113495bSYour Name 		target_if_err("Failed to register nlo scan comp event cb");
280*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
281*5113495bSYour Name 	}
282*5113495bSYour Name 
283*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
284*5113495bSYour Name }
285*5113495bSYour Name 
286*5113495bSYour Name static QDF_STATUS
target_if_scan_unregister_pno_event_handler(struct wlan_objmgr_psoc * psoc,void * arg)287*5113495bSYour Name target_if_scan_unregister_pno_event_handler(struct wlan_objmgr_psoc *psoc,
288*5113495bSYour Name 		void *arg)
289*5113495bSYour Name {
290*5113495bSYour Name 	QDF_STATUS status;
291*5113495bSYour Name 	struct wmi_unified *wmi_handle;
292*5113495bSYour Name 
293*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
294*5113495bSYour Name 	if (!wmi_handle) {
295*5113495bSYour Name 		target_if_err("Invalid WMI handle");
296*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
297*5113495bSYour Name 	}
298*5113495bSYour Name 
299*5113495bSYour Name 	status = wmi_unified_unregister_event(
300*5113495bSYour Name 			wmi_handle,
301*5113495bSYour Name 			wmi_nlo_match_event_id);
302*5113495bSYour Name 	if (status) {
303*5113495bSYour Name 		target_if_err("Failed to unregister nlo match event cb");
304*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
305*5113495bSYour Name 	}
306*5113495bSYour Name 
307*5113495bSYour Name 	status = wmi_unified_unregister_event(
308*5113495bSYour Name 			wmi_handle,
309*5113495bSYour Name 			wmi_nlo_scan_complete_event_id);
310*5113495bSYour Name 	if (status) {
311*5113495bSYour Name 		target_if_err("Failed to unregister nlo scan comp event cb");
312*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
313*5113495bSYour Name 	}
314*5113495bSYour Name 
315*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
316*5113495bSYour Name }
317*5113495bSYour Name 
318*5113495bSYour Name static QDF_STATUS
target_if_pno_start(struct wlan_objmgr_psoc * psoc,struct pno_scan_req_params * req)319*5113495bSYour Name target_if_pno_start(struct wlan_objmgr_psoc *psoc,
320*5113495bSYour Name 	struct pno_scan_req_params *req)
321*5113495bSYour Name {
322*5113495bSYour Name 	QDF_STATUS status;
323*5113495bSYour Name 	struct wmi_unified *wmi_handle;
324*5113495bSYour Name 
325*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
326*5113495bSYour Name 	if (!wmi_handle) {
327*5113495bSYour Name 		target_if_err("Invalid WMI handle");
328*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
329*5113495bSYour Name 	}
330*5113495bSYour Name 
331*5113495bSYour Name 	status = wmi_unified_pno_start_cmd(wmi_handle, req);
332*5113495bSYour Name 	if (status == QDF_STATUS_SUCCESS) {
333*5113495bSYour Name 		if (req->mawc_params.enable)
334*5113495bSYour Name 			status = wmi_unified_nlo_mawc_cmd(wmi_handle,
335*5113495bSYour Name 							  &req->mawc_params);
336*5113495bSYour Name 	}
337*5113495bSYour Name 
338*5113495bSYour Name 	return status;
339*5113495bSYour Name }
340*5113495bSYour Name 
341*5113495bSYour Name static QDF_STATUS
target_if_pno_stop(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)342*5113495bSYour Name target_if_pno_stop(struct wlan_objmgr_psoc *psoc,
343*5113495bSYour Name 	uint8_t vdev_id)
344*5113495bSYour Name {
345*5113495bSYour Name 	struct wmi_unified *wmi_handle;
346*5113495bSYour Name 
347*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
348*5113495bSYour Name 	if (!wmi_handle) {
349*5113495bSYour Name 		target_if_err("Invalid WMI handle");
350*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
351*5113495bSYour Name 	}
352*5113495bSYour Name 
353*5113495bSYour Name 	return wmi_unified_pno_stop_cmd(wmi_handle, vdev_id);
354*5113495bSYour Name }
355*5113495bSYour Name 
356*5113495bSYour Name #else
357*5113495bSYour Name 
358*5113495bSYour Name static inline QDF_STATUS
target_if_scan_register_pno_event_handler(struct wlan_objmgr_psoc * psoc,void * arg)359*5113495bSYour Name target_if_scan_register_pno_event_handler(struct wlan_objmgr_psoc *psoc,
360*5113495bSYour Name 	void *arg)
361*5113495bSYour Name {
362*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
363*5113495bSYour Name }
364*5113495bSYour Name 
365*5113495bSYour Name static inline QDF_STATUS
target_if_scan_unregister_pno_event_handler(struct wlan_objmgr_psoc * psoc,void * arg)366*5113495bSYour Name target_if_scan_unregister_pno_event_handler(struct wlan_objmgr_psoc *psoc,
367*5113495bSYour Name 	void *arg)
368*5113495bSYour Name {
369*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
370*5113495bSYour Name }
371*5113495bSYour Name 
372*5113495bSYour Name static inline QDF_STATUS
target_if_pno_start(struct wlan_objmgr_psoc * psoc,struct pno_scan_req_params * req)373*5113495bSYour Name target_if_pno_start(struct wlan_objmgr_psoc *psoc,
374*5113495bSYour Name 	struct pno_scan_req_params *req)
375*5113495bSYour Name {
376*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
377*5113495bSYour Name }
378*5113495bSYour Name 
379*5113495bSYour Name static inline QDF_STATUS
target_if_pno_stop(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)380*5113495bSYour Name target_if_pno_stop(struct wlan_objmgr_psoc *psoc,
381*5113495bSYour Name 	uint8_t vdev_id)
382*5113495bSYour Name {
383*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
384*5113495bSYour Name }
385*5113495bSYour Name #endif
386*5113495bSYour Name 
387*5113495bSYour Name static QDF_STATUS
target_if_obss_scan_disable(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)388*5113495bSYour Name target_if_obss_scan_disable(struct wlan_objmgr_psoc *psoc,
389*5113495bSYour Name 			    uint8_t vdev_id)
390*5113495bSYour Name {
391*5113495bSYour Name 	struct wmi_unified *wmi_handle;
392*5113495bSYour Name 
393*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
394*5113495bSYour Name 	if (!wmi_handle) {
395*5113495bSYour Name 		target_if_err("Invalid WMI handle");
396*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
397*5113495bSYour Name 	}
398*5113495bSYour Name 
399*5113495bSYour Name 	return wmi_unified_obss_disable_cmd(wmi_handle, vdev_id);
400*5113495bSYour Name }
401*5113495bSYour Name 
402*5113495bSYour Name QDF_STATUS
target_if_scan_register_event_handler(struct wlan_objmgr_psoc * psoc,void * arg)403*5113495bSYour Name target_if_scan_register_event_handler(struct wlan_objmgr_psoc *psoc, void *arg)
404*5113495bSYour Name {
405*5113495bSYour Name 	QDF_STATUS status;
406*5113495bSYour Name 	struct wmi_unified *wmi_handle;
407*5113495bSYour Name 
408*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
409*5113495bSYour Name 	if (!wmi_handle) {
410*5113495bSYour Name 		target_if_err("Invalid WMI handle");
411*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
412*5113495bSYour Name 	}
413*5113495bSYour Name 
414*5113495bSYour Name 	status = wmi_unified_register_event(
415*5113495bSYour Name 			wmi_handle,
416*5113495bSYour Name 			wmi_scan_event_id,
417*5113495bSYour Name 			target_if_scan_event_handler);
418*5113495bSYour Name 	if (status) {
419*5113495bSYour Name 		target_if_err("Failed to register Scan match event cb");
420*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
421*5113495bSYour Name 	}
422*5113495bSYour Name 
423*5113495bSYour Name 	status = target_if_scan_register_pno_event_handler(psoc, arg);
424*5113495bSYour Name 
425*5113495bSYour Name 	return status;
426*5113495bSYour Name }
427*5113495bSYour Name 
428*5113495bSYour Name QDF_STATUS
target_if_scan_unregister_event_handler(struct wlan_objmgr_psoc * psoc,void * arg)429*5113495bSYour Name target_if_scan_unregister_event_handler(struct wlan_objmgr_psoc *psoc,
430*5113495bSYour Name 		void *arg)
431*5113495bSYour Name {
432*5113495bSYour Name 	QDF_STATUS status;
433*5113495bSYour Name 	struct wmi_unified *wmi_handle;
434*5113495bSYour Name 
435*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
436*5113495bSYour Name 	if (!wmi_handle) {
437*5113495bSYour Name 		target_if_err("Invalid WMI handle");
438*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
439*5113495bSYour Name 	}
440*5113495bSYour Name 
441*5113495bSYour Name 	status = wmi_unified_unregister_event(
442*5113495bSYour Name 			wmi_handle,
443*5113495bSYour Name 			wmi_scan_event_id);
444*5113495bSYour Name 	if (status) {
445*5113495bSYour Name 		target_if_err("Failed to unregister Scan match event cb");
446*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
447*5113495bSYour Name 	}
448*5113495bSYour Name 
449*5113495bSYour Name 	status = target_if_scan_unregister_pno_event_handler(psoc, arg);
450*5113495bSYour Name 
451*5113495bSYour Name 	return status;
452*5113495bSYour Name }
453*5113495bSYour Name 
454*5113495bSYour Name QDF_STATUS
target_if_scan_start(struct wlan_objmgr_pdev * pdev,struct scan_start_request * req)455*5113495bSYour Name target_if_scan_start(struct wlan_objmgr_pdev *pdev,
456*5113495bSYour Name 		struct scan_start_request *req)
457*5113495bSYour Name {
458*5113495bSYour Name 	wmi_unified_t pdev_wmi_handle;
459*5113495bSYour Name 
460*5113495bSYour Name 	pdev_wmi_handle = GET_WMI_HDL_FROM_PDEV(pdev);
461*5113495bSYour Name 	if (!pdev_wmi_handle) {
462*5113495bSYour Name 		target_if_err("Invalid PDEV WMI handle");
463*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
464*5113495bSYour Name 	}
465*5113495bSYour Name 	return wmi_unified_scan_start_cmd_send(pdev_wmi_handle, &req->scan_req);
466*5113495bSYour Name }
467*5113495bSYour Name 
468*5113495bSYour Name QDF_STATUS
target_if_scan_cancel(struct wlan_objmgr_pdev * pdev,struct scan_cancel_param * req)469*5113495bSYour Name target_if_scan_cancel(struct wlan_objmgr_pdev *pdev,
470*5113495bSYour Name 		struct scan_cancel_param *req)
471*5113495bSYour Name {
472*5113495bSYour Name 	wmi_unified_t pdev_wmi_handle;
473*5113495bSYour Name 
474*5113495bSYour Name 	pdev_wmi_handle = GET_WMI_HDL_FROM_PDEV(pdev);
475*5113495bSYour Name 	if (!pdev_wmi_handle) {
476*5113495bSYour Name 		target_if_err("Invalid PDEV WMI handle");
477*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
478*5113495bSYour Name 	}
479*5113495bSYour Name 	return wmi_unified_scan_stop_cmd_send(pdev_wmi_handle, req);
480*5113495bSYour Name }
481*5113495bSYour Name 
482*5113495bSYour Name #if defined(WLAN_FEATURE_11BE) && defined(WLAN_FEATURE_11BE_MLO_MBSSID)
target_if_is_platform_eht_capable(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id)483*5113495bSYour Name bool target_if_is_platform_eht_capable(struct wlan_objmgr_psoc *psoc,
484*5113495bSYour Name 				       uint8_t pdev_id)
485*5113495bSYour Name {
486*5113495bSYour Name 	struct wlan_psoc_host_mac_phy_caps *mac_phy_cap_arr, *mac_phy_cap;
487*5113495bSYour Name 
488*5113495bSYour Name 	if (psoc->tgt_if_handle) {
489*5113495bSYour Name 		mac_phy_cap_arr =
490*5113495bSYour Name 			target_psoc_get_mac_phy_cap(psoc->tgt_if_handle);
491*5113495bSYour Name 		if (!mac_phy_cap_arr)
492*5113495bSYour Name 			return false;
493*5113495bSYour Name 
494*5113495bSYour Name 		mac_phy_cap = &mac_phy_cap_arr[pdev_id];
495*5113495bSYour Name 		if (mac_phy_cap && mac_phy_cap->supports_11be)
496*5113495bSYour Name 			return true;
497*5113495bSYour Name 	}
498*5113495bSYour Name 
499*5113495bSYour Name 	return false;
500*5113495bSYour Name }
501*5113495bSYour Name #else
target_if_is_platform_eht_capable(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id)502*5113495bSYour Name bool target_if_is_platform_eht_capable(struct wlan_objmgr_psoc *psoc,
503*5113495bSYour Name 				       uint8_t pdev_id)
504*5113495bSYour Name {
505*5113495bSYour Name 	return false;
506*5113495bSYour Name }
507*5113495bSYour Name #endif
508*5113495bSYour Name 
509*5113495bSYour Name QDF_STATUS
target_if_scan_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)510*5113495bSYour Name target_if_scan_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
511*5113495bSYour Name {
512*5113495bSYour Name 	struct wlan_lmac_if_scan_tx_ops *scan;
513*5113495bSYour Name 
514*5113495bSYour Name 	scan = &tx_ops->scan;
515*5113495bSYour Name 	if (!scan) {
516*5113495bSYour Name 		target_if_err("Scan txops NULL");
517*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
518*5113495bSYour Name 	}
519*5113495bSYour Name 
520*5113495bSYour Name 	scan->scan_start = target_if_scan_start;
521*5113495bSYour Name 	scan->scan_cancel = target_if_scan_cancel;
522*5113495bSYour Name 	scan->pno_start = target_if_pno_start;
523*5113495bSYour Name 	scan->pno_stop = target_if_pno_stop;
524*5113495bSYour Name 	scan->obss_disable = target_if_obss_scan_disable;
525*5113495bSYour Name 	scan->scan_reg_ev_handler = target_if_scan_register_event_handler;
526*5113495bSYour Name 	scan->scan_unreg_ev_handler = target_if_scan_unregister_event_handler;
527*5113495bSYour Name 	scan->is_platform_eht_capable = target_if_is_platform_eht_capable;
528*5113495bSYour Name 
529*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
530*5113495bSYour Name }
531*5113495bSYour Name 
532*5113495bSYour Name QDF_STATUS
target_if_scan_set_max_active_scans(struct wlan_objmgr_psoc * psoc,uint32_t max_active_scans)533*5113495bSYour Name target_if_scan_set_max_active_scans(struct wlan_objmgr_psoc *psoc,
534*5113495bSYour Name 		uint32_t max_active_scans)
535*5113495bSYour Name {
536*5113495bSYour Name 	struct wlan_lmac_if_scan_rx_ops *scan_rx_ops;
537*5113495bSYour Name 	QDF_STATUS status;
538*5113495bSYour Name 
539*5113495bSYour Name 	scan_rx_ops = target_if_scan_get_rx_ops(psoc);
540*5113495bSYour Name 	if (!scan_rx_ops) {
541*5113495bSYour Name 		target_if_err("scan_rx_ops is NULL");
542*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
543*5113495bSYour Name 	}
544*5113495bSYour Name 
545*5113495bSYour Name 	if (scan_rx_ops->scan_set_max_active_scans) {
546*5113495bSYour Name 		status = scan_rx_ops->scan_set_max_active_scans(psoc,
547*5113495bSYour Name 				max_active_scans);
548*5113495bSYour Name 	} else {
549*5113495bSYour Name 		target_if_err("scan_set_max_active_scans uninitialized");
550*5113495bSYour Name 		status = QDF_STATUS_E_FAULT;
551*5113495bSYour Name 	}
552*5113495bSYour Name 
553*5113495bSYour Name 	return status;
554*5113495bSYour Name }
555