xref: /wlan-driver/qca-wifi-host-cmn/spectral/dispatcher/src/wlan_spectral_tgt_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2011,2017-2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  *
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #include <wlan_spectral_tgt_api.h>
21*5113495bSYour Name #include <wlan_spectral_utils_api.h>
22*5113495bSYour Name #include <target_type.h>
23*5113495bSYour Name 
24*5113495bSYour Name #ifdef DIRECT_BUF_RX_ENABLE
25*5113495bSYour Name #include <target_if_direct_buf_rx_api.h>
26*5113495bSYour Name 
27*5113495bSYour Name #define DBR_EVENT_TIMEOUT_IN_MS_SPECTRAL 1
28*5113495bSYour Name #define DBR_NUM_RESP_PER_EVENT_SPECTRAL 2
29*5113495bSYour Name #endif
30*5113495bSYour Name 
31*5113495bSYour Name void *
tgt_get_pdev_target_handle(struct wlan_objmgr_pdev * pdev)32*5113495bSYour Name tgt_get_pdev_target_handle(struct wlan_objmgr_pdev *pdev)
33*5113495bSYour Name {
34*5113495bSYour Name 	struct pdev_spectral *ps;
35*5113495bSYour Name 
36*5113495bSYour Name 	if (!pdev) {
37*5113495bSYour Name 		spectral_err("PDEV is NULL!");
38*5113495bSYour Name 		return NULL;
39*5113495bSYour Name 	}
40*5113495bSYour Name 	ps = wlan_objmgr_pdev_get_comp_private_obj(pdev,
41*5113495bSYour Name 						   WLAN_UMAC_COMP_SPECTRAL);
42*5113495bSYour Name 	if (!ps) {
43*5113495bSYour Name 		spectral_err("PDEV SPECTRAL object is NULL!");
44*5113495bSYour Name 		return NULL;
45*5113495bSYour Name 	}
46*5113495bSYour Name 	return ps->psptrl_target_handle;
47*5113495bSYour Name }
48*5113495bSYour Name 
49*5113495bSYour Name void *
tgt_get_psoc_target_handle(struct wlan_objmgr_psoc * psoc)50*5113495bSYour Name tgt_get_psoc_target_handle(struct wlan_objmgr_psoc *psoc)
51*5113495bSYour Name {
52*5113495bSYour Name 	struct spectral_context *sc;
53*5113495bSYour Name 
54*5113495bSYour Name 	if (!psoc) {
55*5113495bSYour Name 		spectral_err("psoc is NULL!");
56*5113495bSYour Name 		return NULL;
57*5113495bSYour Name 	}
58*5113495bSYour Name 
59*5113495bSYour Name 	sc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
60*5113495bSYour Name 						   WLAN_UMAC_COMP_SPECTRAL);
61*5113495bSYour Name 	if (!sc) {
62*5113495bSYour Name 		spectral_err("psoc Spectral object is NULL!");
63*5113495bSYour Name 		return NULL;
64*5113495bSYour Name 	}
65*5113495bSYour Name 
66*5113495bSYour Name 	return sc->psoc_target_handle;
67*5113495bSYour Name }
68*5113495bSYour Name 
69*5113495bSYour Name QDF_STATUS
tgt_spectral_control(struct wlan_objmgr_pdev * pdev,struct spectral_cp_request * sscan_req)70*5113495bSYour Name tgt_spectral_control(
71*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev,
72*5113495bSYour Name 	struct spectral_cp_request *sscan_req)
73*5113495bSYour Name {
74*5113495bSYour Name 	struct spectral_context *sc;
75*5113495bSYour Name 
76*5113495bSYour Name 	if (!pdev) {
77*5113495bSYour Name 		spectral_err("PDEV is NULL!");
78*5113495bSYour Name 		return -EPERM;
79*5113495bSYour Name 	}
80*5113495bSYour Name 	sc = spectral_get_spectral_ctx_from_pdev(pdev);
81*5113495bSYour Name 	if (!sc) {
82*5113495bSYour Name 		spectral_err("spectral context is NULL!");
83*5113495bSYour Name 		return -EPERM;
84*5113495bSYour Name 	}
85*5113495bSYour Name 	return spectral_control_cmn(pdev, sscan_req);
86*5113495bSYour Name }
87*5113495bSYour Name 
88*5113495bSYour Name void *
tgt_pdev_spectral_init(struct wlan_objmgr_pdev * pdev)89*5113495bSYour Name tgt_pdev_spectral_init(struct wlan_objmgr_pdev *pdev)
90*5113495bSYour Name {
91*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
92*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
93*5113495bSYour Name 
94*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
95*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
96*5113495bSYour Name 	if (!tx_ops) {
97*5113495bSYour Name 		spectral_err("tx_ops is NULL");
98*5113495bSYour Name 		return NULL;
99*5113495bSYour Name 	}
100*5113495bSYour Name 
101*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_pdev_spectral_init(pdev);
102*5113495bSYour Name }
103*5113495bSYour Name 
104*5113495bSYour Name void
tgt_pdev_spectral_deinit(struct wlan_objmgr_pdev * pdev)105*5113495bSYour Name tgt_pdev_spectral_deinit(struct wlan_objmgr_pdev *pdev)
106*5113495bSYour Name {
107*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
108*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
109*5113495bSYour Name 
110*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
111*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
112*5113495bSYour Name 	if (!tx_ops) {
113*5113495bSYour Name 		spectral_err("tx_ops is NULL");
114*5113495bSYour Name 		return;
115*5113495bSYour Name 	}
116*5113495bSYour Name 
117*5113495bSYour Name 	tx_ops->sptrl_tx_ops.sptrlto_pdev_spectral_deinit(pdev);
118*5113495bSYour Name }
119*5113495bSYour Name 
120*5113495bSYour Name void *
tgt_psoc_spectral_init(struct wlan_objmgr_psoc * psoc)121*5113495bSYour Name tgt_psoc_spectral_init(struct wlan_objmgr_psoc *psoc)
122*5113495bSYour Name {
123*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
124*5113495bSYour Name 
125*5113495bSYour Name 	if (!psoc) {
126*5113495bSYour Name 		spectral_err("psoc is null");
127*5113495bSYour Name 		return NULL;
128*5113495bSYour Name 	}
129*5113495bSYour Name 
130*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
131*5113495bSYour Name 	if (!tx_ops) {
132*5113495bSYour Name 		spectral_err("tx_ops is NULL");
133*5113495bSYour Name 		return NULL;
134*5113495bSYour Name 	}
135*5113495bSYour Name 
136*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_psoc_spectral_init(psoc);
137*5113495bSYour Name }
138*5113495bSYour Name 
139*5113495bSYour Name void
tgt_psoc_spectral_deinit(struct wlan_objmgr_psoc * psoc)140*5113495bSYour Name tgt_psoc_spectral_deinit(struct wlan_objmgr_psoc *psoc)
141*5113495bSYour Name {
142*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
143*5113495bSYour Name 
144*5113495bSYour Name 	if (!psoc) {
145*5113495bSYour Name 		spectral_err("psoc is null");
146*5113495bSYour Name 		return;
147*5113495bSYour Name 	}
148*5113495bSYour Name 
149*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
150*5113495bSYour Name 	if (!tx_ops) {
151*5113495bSYour Name 		spectral_err("tx_ops is NULL");
152*5113495bSYour Name 		return;
153*5113495bSYour Name 	}
154*5113495bSYour Name 
155*5113495bSYour Name 	tx_ops->sptrl_tx_ops.sptrlto_psoc_spectral_deinit(psoc);
156*5113495bSYour Name }
157*5113495bSYour Name 
158*5113495bSYour Name QDF_STATUS
tgt_set_spectral_config(struct wlan_objmgr_pdev * pdev,const struct spectral_cp_param * param,const enum spectral_scan_mode smode,enum spectral_cp_error_code * err)159*5113495bSYour Name tgt_set_spectral_config(struct wlan_objmgr_pdev *pdev,
160*5113495bSYour Name 			const struct spectral_cp_param *param,
161*5113495bSYour Name 			const enum spectral_scan_mode smode,
162*5113495bSYour Name 			enum spectral_cp_error_code *err)
163*5113495bSYour Name {
164*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
165*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
166*5113495bSYour Name 
167*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
168*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
169*5113495bSYour Name 	if (!tx_ops) {
170*5113495bSYour Name 		spectral_err("tx_ops is NULL");
171*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
172*5113495bSYour Name 	}
173*5113495bSYour Name 
174*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_set_spectral_config(pdev, param,
175*5113495bSYour Name 			smode, err);
176*5113495bSYour Name }
177*5113495bSYour Name 
178*5113495bSYour Name QDF_STATUS
tgt_get_spectral_config(struct wlan_objmgr_pdev * pdev,struct spectral_config * sptrl_config,const enum spectral_scan_mode smode)179*5113495bSYour Name tgt_get_spectral_config(struct wlan_objmgr_pdev *pdev,
180*5113495bSYour Name 			struct spectral_config *sptrl_config,
181*5113495bSYour Name 			const enum spectral_scan_mode smode)
182*5113495bSYour Name {
183*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
184*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
185*5113495bSYour Name 
186*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
187*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
188*5113495bSYour Name 	if (!tx_ops) {
189*5113495bSYour Name 		spectral_err("tx_ops is NULL");
190*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
191*5113495bSYour Name 	}
192*5113495bSYour Name 
193*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_get_spectral_config(pdev,
194*5113495bSYour Name 			sptrl_config,
195*5113495bSYour Name 			smode);
196*5113495bSYour Name }
197*5113495bSYour Name 
198*5113495bSYour Name QDF_STATUS
tgt_start_spectral_scan(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,enum spectral_scan_mode smode,enum spectral_cp_error_code * err)199*5113495bSYour Name tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
200*5113495bSYour Name 			uint8_t vdev_id,
201*5113495bSYour Name 			enum spectral_scan_mode smode,
202*5113495bSYour Name 			enum spectral_cp_error_code *err)
203*5113495bSYour Name {
204*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
205*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
206*5113495bSYour Name 
207*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
208*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
209*5113495bSYour Name 	if (!tx_ops) {
210*5113495bSYour Name 		spectral_err("tx_ops is NULL");
211*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
212*5113495bSYour Name 	}
213*5113495bSYour Name 
214*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_start_spectral_scan(pdev, vdev_id,
215*5113495bSYour Name 								smode, err);
216*5113495bSYour Name }
217*5113495bSYour Name 
218*5113495bSYour Name QDF_STATUS
tgt_stop_spectral_scan(struct wlan_objmgr_pdev * pdev,enum spectral_scan_mode smode,enum spectral_cp_error_code * err)219*5113495bSYour Name tgt_stop_spectral_scan(struct wlan_objmgr_pdev *pdev,
220*5113495bSYour Name 		       enum spectral_scan_mode smode,
221*5113495bSYour Name 		       enum spectral_cp_error_code *err)
222*5113495bSYour Name {
223*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
224*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
225*5113495bSYour Name 
226*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
227*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
228*5113495bSYour Name 	if (!tx_ops) {
229*5113495bSYour Name 		spectral_err("tx_ops is NULL");
230*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
231*5113495bSYour Name 	}
232*5113495bSYour Name 
233*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_stop_spectral_scan(pdev, smode,
234*5113495bSYour Name 			err);
235*5113495bSYour Name }
236*5113495bSYour Name 
237*5113495bSYour Name bool
tgt_is_spectral_active(struct wlan_objmgr_pdev * pdev,enum spectral_scan_mode smode)238*5113495bSYour Name tgt_is_spectral_active(struct wlan_objmgr_pdev *pdev,
239*5113495bSYour Name 		       enum spectral_scan_mode smode)
240*5113495bSYour Name {
241*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
242*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
243*5113495bSYour Name 
244*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
245*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
246*5113495bSYour Name 	if (!tx_ops) {
247*5113495bSYour Name 		spectral_err("tx_ops is NULL");
248*5113495bSYour Name 		return false;
249*5113495bSYour Name 	}
250*5113495bSYour Name 
251*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_is_spectral_active(pdev, smode);
252*5113495bSYour Name }
253*5113495bSYour Name 
254*5113495bSYour Name bool
tgt_is_spectral_enabled(struct wlan_objmgr_pdev * pdev,enum spectral_scan_mode smode)255*5113495bSYour Name tgt_is_spectral_enabled(struct wlan_objmgr_pdev *pdev,
256*5113495bSYour Name 			enum spectral_scan_mode smode)
257*5113495bSYour Name {
258*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
259*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
260*5113495bSYour Name 
261*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
262*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
263*5113495bSYour Name 	if (!tx_ops) {
264*5113495bSYour Name 		spectral_err("tx_ops is NULL");
265*5113495bSYour Name 		return false;
266*5113495bSYour Name 	}
267*5113495bSYour Name 
268*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_is_spectral_enabled(pdev, smode);
269*5113495bSYour Name }
270*5113495bSYour Name 
271*5113495bSYour Name QDF_STATUS
tgt_set_debug_level(struct wlan_objmgr_pdev * pdev,u_int32_t debug_level)272*5113495bSYour Name tgt_set_debug_level(struct wlan_objmgr_pdev *pdev, u_int32_t debug_level)
273*5113495bSYour Name {
274*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
275*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
276*5113495bSYour Name 
277*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
278*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
279*5113495bSYour Name 	if (!tx_ops) {
280*5113495bSYour Name 		spectral_err("tx_ops is NULL");
281*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
282*5113495bSYour Name 	}
283*5113495bSYour Name 
284*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_set_debug_level(pdev, debug_level);
285*5113495bSYour Name }
286*5113495bSYour Name 
287*5113495bSYour Name u_int32_t
tgt_get_debug_level(struct wlan_objmgr_pdev * pdev)288*5113495bSYour Name tgt_get_debug_level(struct wlan_objmgr_pdev *pdev)
289*5113495bSYour Name {
290*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
291*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
292*5113495bSYour Name 
293*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
294*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
295*5113495bSYour Name 	if (!tx_ops) {
296*5113495bSYour Name 		spectral_err("tx_ops is NULL");
297*5113495bSYour Name 		return -EINVAL;
298*5113495bSYour Name 	}
299*5113495bSYour Name 
300*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_get_debug_level(pdev);
301*5113495bSYour Name }
302*5113495bSYour Name 
303*5113495bSYour Name QDF_STATUS
tgt_get_spectral_capinfo(struct wlan_objmgr_pdev * pdev,struct spectral_caps * scaps)304*5113495bSYour Name tgt_get_spectral_capinfo(struct wlan_objmgr_pdev *pdev,
305*5113495bSYour Name 			 struct spectral_caps *scaps)
306*5113495bSYour Name {
307*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
308*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
309*5113495bSYour Name 
310*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
311*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
312*5113495bSYour Name 	if (!tx_ops) {
313*5113495bSYour Name 		spectral_err("tx_ops is NULL");
314*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
315*5113495bSYour Name 	}
316*5113495bSYour Name 
317*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_get_spectral_capinfo(pdev, scaps);
318*5113495bSYour Name }
319*5113495bSYour Name 
320*5113495bSYour Name QDF_STATUS
tgt_get_spectral_diagstats(struct wlan_objmgr_pdev * pdev,struct spectral_diag_stats * stats)321*5113495bSYour Name tgt_get_spectral_diagstats(struct wlan_objmgr_pdev *pdev,
322*5113495bSYour Name 			   struct spectral_diag_stats *stats)
323*5113495bSYour Name {
324*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
325*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
326*5113495bSYour Name 
327*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
328*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
329*5113495bSYour Name 	if (!tx_ops) {
330*5113495bSYour Name 		spectral_err("tx_ops is NULL");
331*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
332*5113495bSYour Name 	}
333*5113495bSYour Name 
334*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_get_spectral_diagstats(pdev, stats);
335*5113495bSYour Name }
336*5113495bSYour Name 
337*5113495bSYour Name QDF_STATUS
tgt_register_spectral_wmi_ops(struct wlan_objmgr_psoc * psoc,struct spectral_wmi_ops * wmi_ops)338*5113495bSYour Name tgt_register_spectral_wmi_ops(struct wlan_objmgr_psoc *psoc,
339*5113495bSYour Name 			      struct spectral_wmi_ops *wmi_ops)
340*5113495bSYour Name {
341*5113495bSYour Name 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
342*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
343*5113495bSYour Name 
344*5113495bSYour Name 	if (!psoc) {
345*5113495bSYour Name 		spectral_err("psoc is null");
346*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
347*5113495bSYour Name 	}
348*5113495bSYour Name 
349*5113495bSYour Name 	if (!wmi_ops) {
350*5113495bSYour Name 		spectral_err("WMI operations table is null");
351*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
352*5113495bSYour Name 	}
353*5113495bSYour Name 
354*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
355*5113495bSYour Name 	if (!tx_ops) {
356*5113495bSYour Name 		spectral_err("tx_ops is NULL");
357*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
358*5113495bSYour Name 	}
359*5113495bSYour Name 
360*5113495bSYour Name 	psptrl_tx_ops = &tx_ops->sptrl_tx_ops;
361*5113495bSYour Name 
362*5113495bSYour Name 	return psptrl_tx_ops->sptrlto_register_spectral_wmi_ops(psoc, wmi_ops);
363*5113495bSYour Name }
364*5113495bSYour Name 
365*5113495bSYour Name QDF_STATUS
tgt_register_spectral_tgt_ops(struct wlan_objmgr_psoc * psoc,struct spectral_tgt_ops * tgt_ops)366*5113495bSYour Name tgt_register_spectral_tgt_ops(struct wlan_objmgr_psoc *psoc,
367*5113495bSYour Name 			      struct spectral_tgt_ops *tgt_ops)
368*5113495bSYour Name {
369*5113495bSYour Name 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops;
370*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
371*5113495bSYour Name 
372*5113495bSYour Name 	if (!psoc) {
373*5113495bSYour Name 		spectral_err("psoc is null");
374*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
375*5113495bSYour Name 	}
376*5113495bSYour Name 
377*5113495bSYour Name 	if (!tgt_ops) {
378*5113495bSYour Name 		spectral_err("Target operations table is null");
379*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
380*5113495bSYour Name 	}
381*5113495bSYour Name 
382*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
383*5113495bSYour Name 	if (!tx_ops) {
384*5113495bSYour Name 		spectral_err("tx_ops is NULL");
385*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
386*5113495bSYour Name 	}
387*5113495bSYour Name 
388*5113495bSYour Name 	psptrl_tx_ops = &tx_ops->sptrl_tx_ops;
389*5113495bSYour Name 
390*5113495bSYour Name 	return psptrl_tx_ops->sptrlto_register_spectral_tgt_ops(psoc, tgt_ops);
391*5113495bSYour Name }
392*5113495bSYour Name 
393*5113495bSYour Name void
tgt_spectral_register_nl_cb(struct wlan_objmgr_pdev * pdev,struct spectral_nl_cb * nl_cb)394*5113495bSYour Name tgt_spectral_register_nl_cb(
395*5113495bSYour Name 		struct wlan_objmgr_pdev *pdev,
396*5113495bSYour Name 		struct spectral_nl_cb *nl_cb)
397*5113495bSYour Name {
398*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
399*5113495bSYour Name 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
400*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
401*5113495bSYour Name 
402*5113495bSYour Name 	if (!pdev) {
403*5113495bSYour Name 		spectral_err("PDEV is NULL!");
404*5113495bSYour Name 		return;
405*5113495bSYour Name 	}
406*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
407*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
408*5113495bSYour Name 	if (!tx_ops) {
409*5113495bSYour Name 		spectral_err("tx_ops is NULL");
410*5113495bSYour Name 		return;
411*5113495bSYour Name 	}
412*5113495bSYour Name 
413*5113495bSYour Name 	psptrl_tx_ops = &tx_ops->sptrl_tx_ops;
414*5113495bSYour Name 
415*5113495bSYour Name 	return psptrl_tx_ops->sptrlto_register_netlink_cb(pdev, nl_cb);
416*5113495bSYour Name }
417*5113495bSYour Name 
418*5113495bSYour Name bool
tgt_spectral_use_nl_bcast(struct wlan_objmgr_pdev * pdev)419*5113495bSYour Name tgt_spectral_use_nl_bcast(struct wlan_objmgr_pdev *pdev)
420*5113495bSYour Name {
421*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
422*5113495bSYour Name 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
423*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
424*5113495bSYour Name 
425*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
426*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
427*5113495bSYour Name 	if (!tx_ops) {
428*5113495bSYour Name 		spectral_err("tx_ops is NULL");
429*5113495bSYour Name 		return false;
430*5113495bSYour Name 	}
431*5113495bSYour Name 
432*5113495bSYour Name 	psptrl_tx_ops = &tx_ops->sptrl_tx_ops;
433*5113495bSYour Name 
434*5113495bSYour Name 	return psptrl_tx_ops->sptrlto_use_nl_bcast(pdev);
435*5113495bSYour Name }
436*5113495bSYour Name 
tgt_spectral_deregister_nl_cb(struct wlan_objmgr_pdev * pdev)437*5113495bSYour Name void tgt_spectral_deregister_nl_cb(struct wlan_objmgr_pdev *pdev)
438*5113495bSYour Name {
439*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
440*5113495bSYour Name 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
441*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
442*5113495bSYour Name 
443*5113495bSYour Name 	if (!pdev) {
444*5113495bSYour Name 		spectral_err("PDEV is NULL!");
445*5113495bSYour Name 		return;
446*5113495bSYour Name 	}
447*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
448*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
449*5113495bSYour Name 	if (!tx_ops) {
450*5113495bSYour Name 		spectral_err("tx_ops is NULL");
451*5113495bSYour Name 		return;
452*5113495bSYour Name 	}
453*5113495bSYour Name 
454*5113495bSYour Name 	psptrl_tx_ops = &tx_ops->sptrl_tx_ops;
455*5113495bSYour Name 
456*5113495bSYour Name 	psptrl_tx_ops->sptrlto_deregister_netlink_cb(pdev);
457*5113495bSYour Name }
458*5113495bSYour Name 
459*5113495bSYour Name int
tgt_spectral_process_report(struct wlan_objmgr_pdev * pdev,void * payload)460*5113495bSYour Name tgt_spectral_process_report(struct wlan_objmgr_pdev *pdev,
461*5113495bSYour Name 			    void *payload)
462*5113495bSYour Name {
463*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc = NULL;
464*5113495bSYour Name 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
465*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
466*5113495bSYour Name 
467*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
468*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
469*5113495bSYour Name 	if (!tx_ops) {
470*5113495bSYour Name 		spectral_err("tx_ops is NULL");
471*5113495bSYour Name 		return -EINVAL;
472*5113495bSYour Name 	}
473*5113495bSYour Name 
474*5113495bSYour Name 	psptrl_tx_ops = &tx_ops->sptrl_tx_ops;
475*5113495bSYour Name 
476*5113495bSYour Name 	return psptrl_tx_ops->sptrlto_process_spectral_report(pdev, payload);
477*5113495bSYour Name }
478*5113495bSYour Name 
479*5113495bSYour Name uint32_t
tgt_spectral_get_target_type(struct wlan_objmgr_psoc * psoc)480*5113495bSYour Name tgt_spectral_get_target_type(struct wlan_objmgr_psoc *psoc)
481*5113495bSYour Name {
482*5113495bSYour Name 	uint32_t target_type = 0;
483*5113495bSYour Name 	struct wlan_lmac_if_target_tx_ops *target_type_tx_ops;
484*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
485*5113495bSYour Name 
486*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
487*5113495bSYour Name 	if (!tx_ops) {
488*5113495bSYour Name 		spectral_err("tx_ops is NULL");
489*5113495bSYour Name 		return target_type;
490*5113495bSYour Name 	}
491*5113495bSYour Name 
492*5113495bSYour Name 	target_type_tx_ops = &tx_ops->target_tx_ops;
493*5113495bSYour Name 
494*5113495bSYour Name 	if (target_type_tx_ops->tgt_get_tgt_type)
495*5113495bSYour Name 		target_type = target_type_tx_ops->tgt_get_tgt_type(psoc);
496*5113495bSYour Name 
497*5113495bSYour Name 	return target_type;
498*5113495bSYour Name }
499*5113495bSYour Name 
500*5113495bSYour Name #ifdef DIRECT_BUF_RX_ENABLE
501*5113495bSYour Name QDF_STATUS
tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev * pdev)502*5113495bSYour Name tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev)
503*5113495bSYour Name {
504*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
505*5113495bSYour Name 	struct wlan_lmac_if_direct_buf_rx_tx_ops *dbr_tx_ops = NULL;
506*5113495bSYour Name 	struct wlan_lmac_if_sptrl_tx_ops *sptrl_tx_ops = NULL;
507*5113495bSYour Name 	struct dbr_module_config dbr_config = {0};
508*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
509*5113495bSYour Name 
510*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
511*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
512*5113495bSYour Name 	if (!tx_ops) {
513*5113495bSYour Name 		spectral_err("tx_ops is NULL");
514*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
515*5113495bSYour Name 	}
516*5113495bSYour Name 
517*5113495bSYour Name 	dbr_tx_ops = &tx_ops->dbr_tx_ops;
518*5113495bSYour Name 	sptrl_tx_ops = &tx_ops->sptrl_tx_ops;
519*5113495bSYour Name 	dbr_config.num_resp_per_event = DBR_NUM_RESP_PER_EVENT_SPECTRAL;
520*5113495bSYour Name 	dbr_config.event_timeout_in_ms = DBR_EVENT_TIMEOUT_IN_MS_SPECTRAL;
521*5113495bSYour Name 
522*5113495bSYour Name 	if ((sptrl_tx_ops->sptrlto_direct_dma_support) &&
523*5113495bSYour Name 	    (sptrl_tx_ops->sptrlto_direct_dma_support(pdev))) {
524*5113495bSYour Name 		if (sptrl_tx_ops->sptrlto_check_and_do_dbr_buff_debug)
525*5113495bSYour Name 			sptrl_tx_ops->sptrlto_check_and_do_dbr_buff_debug(pdev);
526*5113495bSYour Name 		if (dbr_tx_ops->direct_buf_rx_module_register)
527*5113495bSYour Name 			dbr_tx_ops->direct_buf_rx_module_register
528*5113495bSYour Name 				(pdev, 0, &dbr_config,
529*5113495bSYour Name 				 spectral_dbr_event_handler);
530*5113495bSYour Name 		if (sptrl_tx_ops->sptrlto_check_and_do_dbr_ring_debug)
531*5113495bSYour Name 			sptrl_tx_ops->sptrlto_check_and_do_dbr_ring_debug(pdev);
532*5113495bSYour Name 	}
533*5113495bSYour Name 
534*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
535*5113495bSYour Name }
536*5113495bSYour Name 
537*5113495bSYour Name QDF_STATUS
tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev * pdev)538*5113495bSYour Name tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev *pdev)
539*5113495bSYour Name {
540*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
541*5113495bSYour Name 	struct wlan_lmac_if_direct_buf_rx_tx_ops *dbr_tx_ops = NULL;
542*5113495bSYour Name 	struct wlan_lmac_if_sptrl_tx_ops *sptrl_tx_ops = NULL;
543*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
544*5113495bSYour Name 
545*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
546*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
547*5113495bSYour Name 	if (!tx_ops) {
548*5113495bSYour Name 		spectral_err("tx_ops is NULL");
549*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
550*5113495bSYour Name 	}
551*5113495bSYour Name 
552*5113495bSYour Name 	dbr_tx_ops = &tx_ops->dbr_tx_ops;
553*5113495bSYour Name 	sptrl_tx_ops = &tx_ops->sptrl_tx_ops;
554*5113495bSYour Name 
555*5113495bSYour Name 	if ((sptrl_tx_ops->sptrlto_direct_dma_support) &&
556*5113495bSYour Name 	    (sptrl_tx_ops->sptrlto_direct_dma_support(pdev))) {
557*5113495bSYour Name 		/* Stop DBR debug as the buffers itself are freed now */
558*5113495bSYour Name 		if (dbr_tx_ops->direct_buf_rx_stop_ring_debug)
559*5113495bSYour Name 			dbr_tx_ops->direct_buf_rx_stop_ring_debug(pdev, 0);
560*5113495bSYour Name 
561*5113495bSYour Name 		/*No need to zero-out as buffers are anyway getting freed*/
562*5113495bSYour Name 		if (dbr_tx_ops->direct_buf_rx_stop_buffer_poisoning)
563*5113495bSYour Name 			dbr_tx_ops->direct_buf_rx_stop_buffer_poisoning
564*5113495bSYour Name 				(pdev, 0);
565*5113495bSYour Name 		if (dbr_tx_ops->direct_buf_rx_module_unregister)
566*5113495bSYour Name 			dbr_tx_ops->direct_buf_rx_module_unregister
567*5113495bSYour Name 				(pdev, 0);
568*5113495bSYour Name 
569*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
570*5113495bSYour Name 	}
571*5113495bSYour Name 
572*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
573*5113495bSYour Name }
574*5113495bSYour Name #else
575*5113495bSYour Name QDF_STATUS
tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev * pdev)576*5113495bSYour Name tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev)
577*5113495bSYour Name {
578*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
579*5113495bSYour Name }
580*5113495bSYour Name 
581*5113495bSYour Name QDF_STATUS
tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev * pdev)582*5113495bSYour Name tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev *pdev)
583*5113495bSYour Name {
584*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
585*5113495bSYour Name }
586*5113495bSYour Name #endif /* DIRECT_BUF_RX_ENABLE */
587*5113495bSYour Name 
588*5113495bSYour Name #ifdef DIRECT_BUF_RX_DEBUG
tgt_set_spectral_dma_debug(struct wlan_objmgr_pdev * pdev,enum spectral_dma_debug dma_debug_type,bool dma_debug_enable)589*5113495bSYour Name QDF_STATUS tgt_set_spectral_dma_debug(struct wlan_objmgr_pdev *pdev,
590*5113495bSYour Name 				      enum spectral_dma_debug dma_debug_type,
591*5113495bSYour Name 				      bool dma_debug_enable)
592*5113495bSYour Name {
593*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
594*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
595*5113495bSYour Name 
596*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
597*5113495bSYour Name 	if (!psoc) {
598*5113495bSYour Name 		spectral_err("psoc is NULL!");
599*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
600*5113495bSYour Name 	}
601*5113495bSYour Name 
602*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
603*5113495bSYour Name 	if (!tx_ops) {
604*5113495bSYour Name 		spectral_err("tx_ops is NULL");
605*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
606*5113495bSYour Name 	}
607*5113495bSYour Name 
608*5113495bSYour Name 	return tx_ops->sptrl_tx_ops.sptrlto_set_dma_debug(pdev, dma_debug_type,
609*5113495bSYour Name 			dma_debug_enable);
610*5113495bSYour Name }
611*5113495bSYour Name #else
tgt_set_spectral_dma_debug(struct wlan_objmgr_pdev * pdev,enum spectral_dma_debug dma_debug_type,bool dma_debug_enable)612*5113495bSYour Name QDF_STATUS tgt_set_spectral_dma_debug(struct wlan_objmgr_pdev *pdev,
613*5113495bSYour Name 				      enum spectral_dma_debug dma_debug_type,
614*5113495bSYour Name 				      bool dma_debug_enable)
615*5113495bSYour Name {
616*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
617*5113495bSYour Name }
618*5113495bSYour Name #endif
619*5113495bSYour Name 
620*5113495bSYour Name QDF_STATUS
tgt_spectral_register_events(struct wlan_objmgr_psoc * psoc)621*5113495bSYour Name tgt_spectral_register_events(struct wlan_objmgr_psoc *psoc)
622*5113495bSYour Name {
623*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
624*5113495bSYour Name 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops;
625*5113495bSYour Name 
626*5113495bSYour Name 	if (!psoc) {
627*5113495bSYour Name 		spectral_err("psoc is null");
628*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
629*5113495bSYour Name 	}
630*5113495bSYour Name 
631*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
632*5113495bSYour Name 	if (!tx_ops) {
633*5113495bSYour Name 		spectral_err("tx_ops is NULL");
634*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
635*5113495bSYour Name 	}
636*5113495bSYour Name 
637*5113495bSYour Name 	psptrl_tx_ops = &tx_ops->sptrl_tx_ops;
638*5113495bSYour Name 
639*5113495bSYour Name 	return psptrl_tx_ops->sptrlto_register_events(psoc);
640*5113495bSYour Name }
641*5113495bSYour Name 
642*5113495bSYour Name QDF_STATUS
tgt_spectral_unregister_events(struct wlan_objmgr_psoc * psoc)643*5113495bSYour Name tgt_spectral_unregister_events(struct wlan_objmgr_psoc *psoc)
644*5113495bSYour Name {
645*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
646*5113495bSYour Name 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops;
647*5113495bSYour Name 
648*5113495bSYour Name 	if (!psoc) {
649*5113495bSYour Name 		spectral_err("psoc is null");
650*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
651*5113495bSYour Name 	}
652*5113495bSYour Name 
653*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
654*5113495bSYour Name 	if (!tx_ops) {
655*5113495bSYour Name 		spectral_err("tx_ops is NULL");
656*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
657*5113495bSYour Name 	}
658*5113495bSYour Name 
659*5113495bSYour Name 	psptrl_tx_ops = &tx_ops->sptrl_tx_ops;
660*5113495bSYour Name 
661*5113495bSYour Name 	return psptrl_tx_ops->sptrlto_unregister_events(psoc);
662*5113495bSYour Name }
663*5113495bSYour Name 
664*5113495bSYour Name QDF_STATUS
tgt_spectral_init_pdev_feature_caps(struct wlan_objmgr_pdev * pdev)665*5113495bSYour Name tgt_spectral_init_pdev_feature_caps(struct wlan_objmgr_pdev *pdev)
666*5113495bSYour Name {
667*5113495bSYour Name 	struct wlan_lmac_if_sptrl_tx_ops *spectral_tx_ops;
668*5113495bSYour Name 
669*5113495bSYour Name 	if (!pdev) {
670*5113495bSYour Name 		spectral_err("pdev is NULL!");
671*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
672*5113495bSYour Name 	}
673*5113495bSYour Name 
674*5113495bSYour Name 	spectral_tx_ops = wlan_spectral_pdev_get_lmac_if_txops(pdev);
675*5113495bSYour Name 	if (!spectral_tx_ops) {
676*5113495bSYour Name 		spectral_err("Spectral txops is null");
677*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
678*5113495bSYour Name 	}
679*5113495bSYour Name 
680*5113495bSYour Name 	return spectral_tx_ops->sptrlto_init_pdev_feature_caps(pdev);
681*5113495bSYour Name }
682