xref: /wlan-driver/qca-wifi-host-cmn/spectral/dispatcher/src/wlan_spectral_utils_api.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-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 #include <wlan_spectral_utils_api.h>
22*5113495bSYour Name #include <qdf_module.h>
23*5113495bSYour Name #include "../../core/spectral_cmn_api_i.h"
24*5113495bSYour Name #include <wlan_spectral_tgt_api.h>
25*5113495bSYour Name #include <cfg_ucfg_api.h>
26*5113495bSYour Name 
wlan_spectral_is_mode_disabled_pdev(struct wlan_objmgr_pdev * pdev,enum spectral_scan_mode smode)27*5113495bSYour Name bool wlan_spectral_is_mode_disabled_pdev(struct wlan_objmgr_pdev *pdev,
28*5113495bSYour Name 					 enum spectral_scan_mode smode)
29*5113495bSYour Name {
30*5113495bSYour Name 	bool spectral_mode_disable;
31*5113495bSYour Name 
32*5113495bSYour Name 	if (!pdev) {
33*5113495bSYour Name 		spectral_err("pdev is NULL!");
34*5113495bSYour Name 		return true;
35*5113495bSYour Name 	}
36*5113495bSYour Name 
37*5113495bSYour Name 	switch (smode) {
38*5113495bSYour Name 	case SPECTRAL_SCAN_MODE_NORMAL:
39*5113495bSYour Name 		spectral_mode_disable = wlan_pdev_nif_feat_ext_cap_get(
40*5113495bSYour Name 			pdev, WLAN_PDEV_FEXT_NORMAL_SPECTRAL_SCAN_DIS);
41*5113495bSYour Name 		break;
42*5113495bSYour Name 
43*5113495bSYour Name 	case SPECTRAL_SCAN_MODE_AGILE:
44*5113495bSYour Name 		spectral_mode_disable = wlan_pdev_nif_feat_ext_cap_get(
45*5113495bSYour Name 			pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_DIS) &&
46*5113495bSYour Name 					wlan_pdev_nif_feat_ext_cap_get(
47*5113495bSYour Name 			pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_160_DIS) &&
48*5113495bSYour Name 					wlan_pdev_nif_feat_ext_cap_get(
49*5113495bSYour Name 			pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_80P80_DIS) &&
50*5113495bSYour Name 					wlan_pdev_nif_feat_ext_cap_get(
51*5113495bSYour Name 			pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_320_DIS);
52*5113495bSYour Name 		break;
53*5113495bSYour Name 
54*5113495bSYour Name 	default:
55*5113495bSYour Name 		spectral_err("Invalid Spectral scan mode %d", smode);
56*5113495bSYour Name 		spectral_mode_disable = true;
57*5113495bSYour Name 		break;
58*5113495bSYour Name 	}
59*5113495bSYour Name 
60*5113495bSYour Name 	return spectral_mode_disable;
61*5113495bSYour Name }
62*5113495bSYour Name 
63*5113495bSYour Name bool
wlan_spectral_is_feature_disabled_ini(struct wlan_objmgr_psoc * psoc)64*5113495bSYour Name wlan_spectral_is_feature_disabled_ini(struct wlan_objmgr_psoc *psoc)
65*5113495bSYour Name {
66*5113495bSYour Name 	if (!psoc) {
67*5113495bSYour Name 		spectral_err("PSOC is NULL!");
68*5113495bSYour Name 		return true;
69*5113495bSYour Name 	}
70*5113495bSYour Name 
71*5113495bSYour Name 	return wlan_psoc_nif_feat_cap_get(psoc,
72*5113495bSYour Name 					  WLAN_SOC_F_SPECTRAL_INI_DISABLE);
73*5113495bSYour Name }
74*5113495bSYour Name 
75*5113495bSYour Name bool
wlan_spectral_is_feature_disabled_psoc(struct wlan_objmgr_psoc * psoc)76*5113495bSYour Name wlan_spectral_is_feature_disabled_psoc(struct wlan_objmgr_psoc *psoc)
77*5113495bSYour Name {
78*5113495bSYour Name 	if (!psoc) {
79*5113495bSYour Name 		spectral_err("psoc is NULL!");
80*5113495bSYour Name 		return true;
81*5113495bSYour Name 	}
82*5113495bSYour Name 
83*5113495bSYour Name 	return wlan_spectral_is_feature_disabled_ini(psoc);
84*5113495bSYour Name }
85*5113495bSYour Name 
86*5113495bSYour Name bool
wlan_spectral_is_feature_disabled_pdev(struct wlan_objmgr_pdev * pdev)87*5113495bSYour Name wlan_spectral_is_feature_disabled_pdev(struct wlan_objmgr_pdev *pdev)
88*5113495bSYour Name {
89*5113495bSYour Name 	enum spectral_scan_mode smode;
90*5113495bSYour Name 
91*5113495bSYour Name 	if (!pdev) {
92*5113495bSYour Name 		spectral_err("pdev is NULL!");
93*5113495bSYour Name 		return true;
94*5113495bSYour Name 	}
95*5113495bSYour Name 
96*5113495bSYour Name 	smode = SPECTRAL_SCAN_MODE_NORMAL;
97*5113495bSYour Name 	for (; smode < SPECTRAL_SCAN_MODE_MAX; smode++)
98*5113495bSYour Name 		if (!wlan_spectral_is_mode_disabled_pdev(pdev, smode))
99*5113495bSYour Name 			return false;
100*5113495bSYour Name 
101*5113495bSYour Name 	return true;
102*5113495bSYour Name }
103*5113495bSYour Name 
104*5113495bSYour Name QDF_STATUS
wlan_spectral_init_pdev_feature_caps(struct wlan_objmgr_pdev * pdev)105*5113495bSYour Name wlan_spectral_init_pdev_feature_caps(struct wlan_objmgr_pdev *pdev)
106*5113495bSYour Name {
107*5113495bSYour Name 	return tgt_spectral_init_pdev_feature_caps(pdev);
108*5113495bSYour Name }
109*5113495bSYour Name 
110*5113495bSYour Name QDF_STATUS
wlan_spectral_init_psoc_feature_cap(struct wlan_objmgr_psoc * psoc)111*5113495bSYour Name wlan_spectral_init_psoc_feature_cap(struct wlan_objmgr_psoc *psoc)
112*5113495bSYour Name {
113*5113495bSYour Name 	if (!psoc) {
114*5113495bSYour Name 		spectral_err("PSOC is NULL!");
115*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
116*5113495bSYour Name 	}
117*5113495bSYour Name 
118*5113495bSYour Name 	if (cfg_get(psoc, CFG_SPECTRAL_DISABLE))
119*5113495bSYour Name 		wlan_psoc_nif_feat_cap_set(psoc,
120*5113495bSYour Name 					   WLAN_SOC_F_SPECTRAL_INI_DISABLE);
121*5113495bSYour Name 	else
122*5113495bSYour Name 		wlan_psoc_nif_feat_cap_clear(psoc,
123*5113495bSYour Name 					     WLAN_SOC_F_SPECTRAL_INI_DISABLE);
124*5113495bSYour Name 
125*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
126*5113495bSYour Name }
127*5113495bSYour Name 
128*5113495bSYour Name QDF_STATUS
wlan_spectral_init(void)129*5113495bSYour Name wlan_spectral_init(void)
130*5113495bSYour Name {
131*5113495bSYour Name 	if (wlan_objmgr_register_psoc_create_handler(
132*5113495bSYour Name 		WLAN_UMAC_COMP_SPECTRAL,
133*5113495bSYour Name 		wlan_spectral_psoc_obj_create_handler,
134*5113495bSYour Name 		NULL) !=
135*5113495bSYour Name 	    QDF_STATUS_SUCCESS) {
136*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
137*5113495bSYour Name 	}
138*5113495bSYour Name 	if (wlan_objmgr_register_psoc_destroy_handler(
139*5113495bSYour Name 		WLAN_UMAC_COMP_SPECTRAL,
140*5113495bSYour Name 		wlan_spectral_psoc_obj_destroy_handler,
141*5113495bSYour Name 		NULL) !=
142*5113495bSYour Name 	    QDF_STATUS_SUCCESS) {
143*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
144*5113495bSYour Name 	}
145*5113495bSYour Name 	if (wlan_objmgr_register_pdev_create_handler(
146*5113495bSYour Name 		WLAN_UMAC_COMP_SPECTRAL,
147*5113495bSYour Name 		wlan_spectral_pdev_obj_create_handler,
148*5113495bSYour Name 		NULL) !=
149*5113495bSYour Name 	    QDF_STATUS_SUCCESS) {
150*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
151*5113495bSYour Name 	}
152*5113495bSYour Name 	if (wlan_objmgr_register_pdev_destroy_handler(
153*5113495bSYour Name 		WLAN_UMAC_COMP_SPECTRAL,
154*5113495bSYour Name 		wlan_spectral_pdev_obj_destroy_handler,
155*5113495bSYour Name 		NULL) !=
156*5113495bSYour Name 	    QDF_STATUS_SUCCESS) {
157*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
158*5113495bSYour Name 	}
159*5113495bSYour Name 
160*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
161*5113495bSYour Name }
162*5113495bSYour Name 
163*5113495bSYour Name QDF_STATUS
wlan_spectral_deinit(void)164*5113495bSYour Name wlan_spectral_deinit(void)
165*5113495bSYour Name {
166*5113495bSYour Name 	if (wlan_objmgr_unregister_psoc_create_handler(
167*5113495bSYour Name 		WLAN_UMAC_COMP_SPECTRAL,
168*5113495bSYour Name 		wlan_spectral_psoc_obj_create_handler,
169*5113495bSYour Name 		NULL) !=
170*5113495bSYour Name 	    QDF_STATUS_SUCCESS) {
171*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
172*5113495bSYour Name 	}
173*5113495bSYour Name 	if (wlan_objmgr_unregister_psoc_destroy_handler(
174*5113495bSYour Name 		WLAN_UMAC_COMP_SPECTRAL,
175*5113495bSYour Name 		wlan_spectral_psoc_obj_destroy_handler,
176*5113495bSYour Name 		NULL) !=
177*5113495bSYour Name 	    QDF_STATUS_SUCCESS) {
178*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
179*5113495bSYour Name 	}
180*5113495bSYour Name 	if (wlan_objmgr_unregister_pdev_create_handler(
181*5113495bSYour Name 		WLAN_UMAC_COMP_SPECTRAL,
182*5113495bSYour Name 		wlan_spectral_pdev_obj_create_handler,
183*5113495bSYour Name 		NULL) !=
184*5113495bSYour Name 	    QDF_STATUS_SUCCESS) {
185*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
186*5113495bSYour Name 	}
187*5113495bSYour Name 	if (wlan_objmgr_unregister_pdev_destroy_handler(
188*5113495bSYour Name 		WLAN_UMAC_COMP_SPECTRAL,
189*5113495bSYour Name 		wlan_spectral_pdev_obj_destroy_handler,
190*5113495bSYour Name 		NULL) !=
191*5113495bSYour Name 	    QDF_STATUS_SUCCESS) {
192*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
193*5113495bSYour Name 	}
194*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
195*5113495bSYour Name }
196*5113495bSYour Name 
197*5113495bSYour Name QDF_STATUS
spectral_register_legacy_cb(struct wlan_objmgr_psoc * psoc,struct spectral_legacy_cbacks * legacy_cbacks)198*5113495bSYour Name spectral_register_legacy_cb(struct wlan_objmgr_psoc *psoc,
199*5113495bSYour Name 			    struct spectral_legacy_cbacks *legacy_cbacks)
200*5113495bSYour Name {
201*5113495bSYour Name 	struct spectral_context *sc;
202*5113495bSYour Name 
203*5113495bSYour Name 	if (!psoc) {
204*5113495bSYour Name 		spectral_err("psoc is null");
205*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
206*5113495bSYour Name 	}
207*5113495bSYour Name 
208*5113495bSYour Name 	if (wlan_spectral_is_feature_disabled_psoc(psoc)) {
209*5113495bSYour Name 		spectral_info("Spectral feature is disabled");
210*5113495bSYour Name 		return QDF_STATUS_COMP_DISABLED;
211*5113495bSYour Name 	}
212*5113495bSYour Name 
213*5113495bSYour Name 	sc = spectral_get_spectral_ctx_from_psoc(psoc);
214*5113495bSYour Name 	if (!sc) {
215*5113495bSYour Name 		spectral_err("Invalid Context");
216*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
217*5113495bSYour Name 	}
218*5113495bSYour Name 
219*5113495bSYour Name 	sc->legacy_cbacks.vdev_get_chan_freq =
220*5113495bSYour Name 	    legacy_cbacks->vdev_get_chan_freq;
221*5113495bSYour Name 	sc->legacy_cbacks.vdev_get_chan_freq_seg2 =
222*5113495bSYour Name 	    legacy_cbacks->vdev_get_chan_freq_seg2;
223*5113495bSYour Name 	sc->legacy_cbacks.vdev_get_ch_width = legacy_cbacks->vdev_get_ch_width;
224*5113495bSYour Name 	sc->legacy_cbacks.vdev_get_sec20chan_freq_mhz =
225*5113495bSYour Name 	    legacy_cbacks->vdev_get_sec20chan_freq_mhz;
226*5113495bSYour Name 
227*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
228*5113495bSYour Name }
229*5113495bSYour Name qdf_export_symbol(spectral_register_legacy_cb);
230*5113495bSYour Name 
231*5113495bSYour Name int16_t
spectral_vdev_get_chan_freq(struct wlan_objmgr_vdev * vdev)232*5113495bSYour Name spectral_vdev_get_chan_freq(struct wlan_objmgr_vdev *vdev)
233*5113495bSYour Name {
234*5113495bSYour Name 	struct spectral_context *sc;
235*5113495bSYour Name 
236*5113495bSYour Name 	sc = spectral_get_spectral_ctx_from_vdev(vdev);
237*5113495bSYour Name 	if (!sc) {
238*5113495bSYour Name 		spectral_err("spectral context is Null");
239*5113495bSYour Name 		return -EINVAL;
240*5113495bSYour Name 	}
241*5113495bSYour Name 
242*5113495bSYour Name 	if (!sc->legacy_cbacks.vdev_get_chan_freq) {
243*5113495bSYour Name 		spectral_err("vdev_get_chan_freq is not supported");
244*5113495bSYour Name 		return -ENOTSUPP;
245*5113495bSYour Name 	}
246*5113495bSYour Name 
247*5113495bSYour Name 	return sc->legacy_cbacks.vdev_get_chan_freq(vdev);
248*5113495bSYour Name }
249*5113495bSYour Name 
250*5113495bSYour Name int16_t
spectral_vdev_get_chan_freq_seg2(struct wlan_objmgr_vdev * vdev)251*5113495bSYour Name spectral_vdev_get_chan_freq_seg2(struct wlan_objmgr_vdev *vdev)
252*5113495bSYour Name {
253*5113495bSYour Name 	struct spectral_context *sc;
254*5113495bSYour Name 	struct wlan_channel *des_chan;
255*5113495bSYour Name 
256*5113495bSYour Name 	sc = spectral_get_spectral_ctx_from_vdev(vdev);
257*5113495bSYour Name 	if (!sc) {
258*5113495bSYour Name 		spectral_err("spectral context is null");
259*5113495bSYour Name 		return -EINVAL;
260*5113495bSYour Name 	}
261*5113495bSYour Name 
262*5113495bSYour Name 	if (!sc->legacy_cbacks.vdev_get_chan_freq_seg2) {
263*5113495bSYour Name 		des_chan = wlan_vdev_mlme_get_des_chan(vdev);
264*5113495bSYour Name 		if (des_chan->ch_width == CH_WIDTH_80P80MHZ)
265*5113495bSYour Name 			return des_chan->ch_freq_seg2;
266*5113495bSYour Name 		else
267*5113495bSYour Name 			return 0;
268*5113495bSYour Name 	}
269*5113495bSYour Name 
270*5113495bSYour Name 	return sc->legacy_cbacks.vdev_get_chan_freq_seg2(vdev);
271*5113495bSYour Name }
272*5113495bSYour Name 
273*5113495bSYour Name enum phy_ch_width
spectral_vdev_get_ch_width(struct wlan_objmgr_vdev * vdev)274*5113495bSYour Name spectral_vdev_get_ch_width(struct wlan_objmgr_vdev *vdev)
275*5113495bSYour Name {
276*5113495bSYour Name 	struct spectral_context *sc;
277*5113495bSYour Name 
278*5113495bSYour Name 	sc = spectral_get_spectral_ctx_from_vdev(vdev);
279*5113495bSYour Name 	if (!sc) {
280*5113495bSYour Name 		spectral_err("spectral context is Null");
281*5113495bSYour Name 		return CH_WIDTH_INVALID;
282*5113495bSYour Name 	}
283*5113495bSYour Name 
284*5113495bSYour Name 	if (!sc->legacy_cbacks.vdev_get_ch_width) {
285*5113495bSYour Name 		spectral_err("vdev_get_ch_width is not supported");
286*5113495bSYour Name 		return -ENOTSUPP;
287*5113495bSYour Name 	}
288*5113495bSYour Name 
289*5113495bSYour Name 	return sc->legacy_cbacks.vdev_get_ch_width(vdev);
290*5113495bSYour Name }
291*5113495bSYour Name 
292*5113495bSYour Name int
spectral_vdev_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev * vdev,uint16_t * sec20chan_freq)293*5113495bSYour Name spectral_vdev_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
294*5113495bSYour Name 				     uint16_t *sec20chan_freq)
295*5113495bSYour Name {
296*5113495bSYour Name 	struct spectral_context *sc;
297*5113495bSYour Name 
298*5113495bSYour Name 	sc = spectral_get_spectral_ctx_from_vdev(vdev);
299*5113495bSYour Name 	if (!sc) {
300*5113495bSYour Name 		spectral_err("spectral context is Null");
301*5113495bSYour Name 		return -EINVAL;
302*5113495bSYour Name 	}
303*5113495bSYour Name 
304*5113495bSYour Name 	if (!sc->legacy_cbacks.vdev_get_sec20chan_freq_mhz) {
305*5113495bSYour Name 		spectral_err("vdev_get_sec20chan_freq_mhz is not supported");
306*5113495bSYour Name 		return -ENOTSUPP;
307*5113495bSYour Name 	}
308*5113495bSYour Name 
309*5113495bSYour Name 	return sc->legacy_cbacks.vdev_get_sec20chan_freq_mhz(vdev,
310*5113495bSYour Name 							     sec20chan_freq);
311*5113495bSYour Name }
312*5113495bSYour Name 
313*5113495bSYour Name void
wlan_lmac_if_sptrl_register_rx_ops(struct wlan_lmac_if_rx_ops * rx_ops)314*5113495bSYour Name wlan_lmac_if_sptrl_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
315*5113495bSYour Name {
316*5113495bSYour Name 	struct wlan_lmac_if_sptrl_rx_ops *sptrl_rx_ops = &rx_ops->sptrl_rx_ops;
317*5113495bSYour Name 
318*5113495bSYour Name 	/* Spectral rx ops */
319*5113495bSYour Name 	sptrl_rx_ops->sptrlro_get_pdev_target_handle =
320*5113495bSYour Name 					tgt_get_pdev_target_handle;
321*5113495bSYour Name 	sptrl_rx_ops->sptrlro_get_psoc_target_handle =
322*5113495bSYour Name 					tgt_get_psoc_target_handle;
323*5113495bSYour Name 	sptrl_rx_ops->sptrlro_vdev_get_chan_freq = spectral_vdev_get_chan_freq;
324*5113495bSYour Name 	sptrl_rx_ops->sptrlro_vdev_get_chan_freq_seg2 =
325*5113495bSYour Name 					spectral_vdev_get_chan_freq_seg2;
326*5113495bSYour Name 	sptrl_rx_ops->sptrlro_vdev_get_ch_width = spectral_vdev_get_ch_width;
327*5113495bSYour Name 	sptrl_rx_ops->sptrlro_vdev_get_sec20chan_freq_mhz =
328*5113495bSYour Name 	    spectral_vdev_get_sec20chan_freq_mhz;
329*5113495bSYour Name 	sptrl_rx_ops->sptrlro_spectral_is_feature_disabled_pdev =
330*5113495bSYour Name 		wlan_spectral_is_feature_disabled_pdev;
331*5113495bSYour Name 	sptrl_rx_ops->sptrlro_spectral_is_feature_disabled_psoc =
332*5113495bSYour Name 		wlan_spectral_is_feature_disabled_psoc;
333*5113495bSYour Name }
334*5113495bSYour Name 
335*5113495bSYour Name QDF_STATUS
wlan_register_spectral_wmi_ops(struct wlan_objmgr_psoc * psoc,struct spectral_wmi_ops * wmi_ops)336*5113495bSYour Name wlan_register_spectral_wmi_ops(struct wlan_objmgr_psoc *psoc,
337*5113495bSYour Name 			       struct spectral_wmi_ops *wmi_ops)
338*5113495bSYour Name {
339*5113495bSYour Name 	struct spectral_context *sc;
340*5113495bSYour Name 
341*5113495bSYour Name 	if (!psoc) {
342*5113495bSYour Name 		spectral_err("psoc is NULL!");
343*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
344*5113495bSYour Name 	}
345*5113495bSYour Name 
346*5113495bSYour Name 	if (wlan_spectral_is_feature_disabled_psoc(psoc)) {
347*5113495bSYour Name 		spectral_info("Spectral feature is disabled");
348*5113495bSYour Name 		return QDF_STATUS_COMP_DISABLED;
349*5113495bSYour Name 	}
350*5113495bSYour Name 
351*5113495bSYour Name 	sc = spectral_get_spectral_ctx_from_psoc(psoc);
352*5113495bSYour Name 	if (!sc) {
353*5113495bSYour Name 		spectral_err("spectral context is NULL!");
354*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
355*5113495bSYour Name 	}
356*5113495bSYour Name 
357*5113495bSYour Name 	return sc->sptrlc_register_spectral_wmi_ops(psoc, wmi_ops);
358*5113495bSYour Name }
359*5113495bSYour Name 
360*5113495bSYour Name qdf_export_symbol(wlan_register_spectral_wmi_ops);
361*5113495bSYour Name 
362*5113495bSYour Name QDF_STATUS
wlan_register_spectral_tgt_ops(struct wlan_objmgr_psoc * psoc,struct spectral_tgt_ops * tgt_ops)363*5113495bSYour Name wlan_register_spectral_tgt_ops(struct wlan_objmgr_psoc *psoc,
364*5113495bSYour Name 			       struct spectral_tgt_ops *tgt_ops)
365*5113495bSYour Name {
366*5113495bSYour Name 	struct spectral_context *sc;
367*5113495bSYour Name 
368*5113495bSYour Name 	if (!psoc) {
369*5113495bSYour Name 		spectral_err("psoc is NULL!");
370*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
371*5113495bSYour Name 	}
372*5113495bSYour Name 
373*5113495bSYour Name 	if (wlan_spectral_is_feature_disabled_psoc(psoc)) {
374*5113495bSYour Name 		spectral_info("Spectral feature is disabled");
375*5113495bSYour Name 		return QDF_STATUS_COMP_DISABLED;
376*5113495bSYour Name 	}
377*5113495bSYour Name 
378*5113495bSYour Name 	sc = spectral_get_spectral_ctx_from_psoc(psoc);
379*5113495bSYour Name 	if (!sc) {
380*5113495bSYour Name 		spectral_err("spectral context is NULL!");
381*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
382*5113495bSYour Name 	}
383*5113495bSYour Name 
384*5113495bSYour Name 	return sc->sptrlc_register_spectral_tgt_ops(psoc, tgt_ops);
385*5113495bSYour Name }
386*5113495bSYour Name 
387*5113495bSYour Name qdf_export_symbol(wlan_register_spectral_tgt_ops);
388*5113495bSYour Name 
389*5113495bSYour Name /**
390*5113495bSYour Name  * wlan_spectral_psoc_target_attach() - Spectral psoc target attach
391*5113495bSYour Name  * @psoc:  pointer to psoc object
392*5113495bSYour Name  *
393*5113495bSYour Name  * API to initialize Spectral psoc target object
394*5113495bSYour Name  *
395*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS upon successful registration,
396*5113495bSYour Name  *         QDF_STATUS_E_FAILURE upon failure
397*5113495bSYour Name  */
398*5113495bSYour Name static QDF_STATUS
wlan_spectral_psoc_target_attach(struct wlan_objmgr_psoc * psoc)399*5113495bSYour Name wlan_spectral_psoc_target_attach(struct wlan_objmgr_psoc *psoc)
400*5113495bSYour Name {
401*5113495bSYour Name 	struct spectral_context *sc = NULL;
402*5113495bSYour Name 
403*5113495bSYour Name 	if (!psoc) {
404*5113495bSYour Name 		spectral_err("psoc is null");
405*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
406*5113495bSYour Name 	}
407*5113495bSYour Name 
408*5113495bSYour Name 	sc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
409*5113495bSYour Name 						   WLAN_UMAC_COMP_SPECTRAL);
410*5113495bSYour Name 	if (!sc) {
411*5113495bSYour Name 		spectral_err("Spectral context is null");
412*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
413*5113495bSYour Name 	}
414*5113495bSYour Name 
415*5113495bSYour Name 	if (sc->sptrlc_psoc_spectral_init) {
416*5113495bSYour Name 		void *target_handle;
417*5113495bSYour Name 
418*5113495bSYour Name 		target_handle = sc->sptrlc_psoc_spectral_init(psoc);
419*5113495bSYour Name 		if (!target_handle) {
420*5113495bSYour Name 			spectral_err("Spectral psoc lmac object is NULL!");
421*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
422*5113495bSYour Name 		}
423*5113495bSYour Name 		sc->psoc_target_handle = target_handle;
424*5113495bSYour Name 	}
425*5113495bSYour Name 
426*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
427*5113495bSYour Name }
428*5113495bSYour Name 
429*5113495bSYour Name /**
430*5113495bSYour Name  * wlan_spectral_psoc_target_detach() - Spectral psoc target detach
431*5113495bSYour Name  * @psoc:  pointer to psoc object
432*5113495bSYour Name  *
433*5113495bSYour Name  * API to destroy Spectral psoc target object
434*5113495bSYour Name  *
435*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS upon successful registration,
436*5113495bSYour Name  *         QDF_STATUS_E_FAILURE upon failure
437*5113495bSYour Name  */
438*5113495bSYour Name static QDF_STATUS
wlan_spectral_psoc_target_detach(struct wlan_objmgr_psoc * psoc)439*5113495bSYour Name wlan_spectral_psoc_target_detach(struct wlan_objmgr_psoc *psoc)
440*5113495bSYour Name {
441*5113495bSYour Name 	struct spectral_context *sc = NULL;
442*5113495bSYour Name 
443*5113495bSYour Name 	if (!psoc) {
444*5113495bSYour Name 		spectral_err("psoc is null");
445*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
446*5113495bSYour Name 	}
447*5113495bSYour Name 
448*5113495bSYour Name 	sc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
449*5113495bSYour Name 						   WLAN_UMAC_COMP_SPECTRAL);
450*5113495bSYour Name 	if (!sc) {
451*5113495bSYour Name 		spectral_err("Spectral context is null");
452*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
453*5113495bSYour Name 	}
454*5113495bSYour Name 
455*5113495bSYour Name 	if (sc->sptrlc_psoc_spectral_deinit)
456*5113495bSYour Name 		sc->sptrlc_psoc_spectral_deinit(psoc);
457*5113495bSYour Name 	sc->psoc_target_handle = NULL;
458*5113495bSYour Name 
459*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
460*5113495bSYour Name }
461*5113495bSYour Name 
462*5113495bSYour Name #ifdef DIRECT_BUF_RX_ENABLE
spectral_dbr_event_handler(struct wlan_objmgr_pdev * pdev,struct direct_buf_rx_data * payload)463*5113495bSYour Name bool spectral_dbr_event_handler(struct wlan_objmgr_pdev *pdev,
464*5113495bSYour Name 				struct direct_buf_rx_data *payload)
465*5113495bSYour Name {
466*5113495bSYour Name 	struct spectral_context *sc;
467*5113495bSYour Name 
468*5113495bSYour Name 	if (!pdev) {
469*5113495bSYour Name 		spectral_err("PDEV is NULL!");
470*5113495bSYour Name 		return -EINVAL;
471*5113495bSYour Name 	}
472*5113495bSYour Name 	sc = spectral_get_spectral_ctx_from_pdev(pdev);
473*5113495bSYour Name 	if (!sc) {
474*5113495bSYour Name 		spectral_err("spectral context is NULL!");
475*5113495bSYour Name 		return -EINVAL;
476*5113495bSYour Name 	}
477*5113495bSYour Name 
478*5113495bSYour Name 	sc->sptrlc_process_spectral_report(pdev, payload);
479*5113495bSYour Name 
480*5113495bSYour Name 	return true;
481*5113495bSYour Name }
482*5113495bSYour Name #endif
483*5113495bSYour Name 
spectral_pdev_open(struct wlan_objmgr_pdev * pdev)484*5113495bSYour Name QDF_STATUS spectral_pdev_open(struct wlan_objmgr_pdev *pdev)
485*5113495bSYour Name {
486*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
487*5113495bSYour Name 	QDF_STATUS status;
488*5113495bSYour Name 
489*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
490*5113495bSYour Name 
491*5113495bSYour Name 	if (wlan_spectral_is_feature_disabled_pdev(pdev)) {
492*5113495bSYour Name 		spectral_info("Spectral feature is disabled");
493*5113495bSYour Name 		return QDF_STATUS_COMP_DISABLED;
494*5113495bSYour Name 	}
495*5113495bSYour Name 
496*5113495bSYour Name 	if (cfg_get(psoc, CFG_SPECTRAL_POISON_BUFS))
497*5113495bSYour Name 		tgt_set_spectral_dma_debug(pdev, SPECTRAL_DMA_BUFFER_DEBUG, 1);
498*5113495bSYour Name 
499*5113495bSYour Name 	status = spectral_register_dbr(pdev);
500*5113495bSYour Name 	return status;
501*5113495bSYour Name }
502*5113495bSYour Name 
spectral_register_dbr(struct wlan_objmgr_pdev * pdev)503*5113495bSYour Name QDF_STATUS spectral_register_dbr(struct wlan_objmgr_pdev *pdev)
504*5113495bSYour Name {
505*5113495bSYour Name 	if (wlan_spectral_is_feature_disabled_pdev(pdev)) {
506*5113495bSYour Name 		spectral_info("spectral feature is disabled");
507*5113495bSYour Name 		return QDF_STATUS_COMP_DISABLED;
508*5113495bSYour Name 	}
509*5113495bSYour Name 
510*5113495bSYour Name 	return tgt_spectral_register_to_dbr(pdev);
511*5113495bSYour Name }
512*5113495bSYour Name 
513*5113495bSYour Name qdf_export_symbol(spectral_register_dbr);
514*5113495bSYour Name 
spectral_unregister_dbr(struct wlan_objmgr_pdev * pdev)515*5113495bSYour Name QDF_STATUS spectral_unregister_dbr(struct wlan_objmgr_pdev *pdev)
516*5113495bSYour Name {
517*5113495bSYour Name 	QDF_STATUS status;
518*5113495bSYour Name 
519*5113495bSYour Name 	if (wlan_spectral_is_feature_disabled_pdev(pdev)) {
520*5113495bSYour Name 		spectral_info("spectral feature is disabled");
521*5113495bSYour Name 		return QDF_STATUS_COMP_DISABLED;
522*5113495bSYour Name 	}
523*5113495bSYour Name 	status = tgt_spectral_unregister_to_dbr(pdev);
524*5113495bSYour Name 
525*5113495bSYour Name 	return status;
526*5113495bSYour Name }
527*5113495bSYour Name 
528*5113495bSYour Name qdf_export_symbol(spectral_unregister_dbr);
529*5113495bSYour Name 
wlan_spectral_psoc_open(struct wlan_objmgr_psoc * psoc)530*5113495bSYour Name QDF_STATUS wlan_spectral_psoc_open(struct wlan_objmgr_psoc *psoc)
531*5113495bSYour Name {
532*5113495bSYour Name 	if (!psoc) {
533*5113495bSYour Name 		spectral_err("psoc is null");
534*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
535*5113495bSYour Name 	}
536*5113495bSYour Name 
537*5113495bSYour Name 	if (wlan_spectral_is_feature_disabled_psoc(psoc)) {
538*5113495bSYour Name 		spectral_info("Spectral feature is disabled");
539*5113495bSYour Name 		return QDF_STATUS_COMP_DISABLED;
540*5113495bSYour Name 	}
541*5113495bSYour Name 
542*5113495bSYour Name 	return wlan_spectral_psoc_target_attach(psoc);
543*5113495bSYour Name }
544*5113495bSYour Name 
wlan_spectral_psoc_close(struct wlan_objmgr_psoc * psoc)545*5113495bSYour Name QDF_STATUS wlan_spectral_psoc_close(struct wlan_objmgr_psoc *psoc)
546*5113495bSYour Name {
547*5113495bSYour Name 	if (!psoc) {
548*5113495bSYour Name 		spectral_err("psoc is null");
549*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
550*5113495bSYour Name 	}
551*5113495bSYour Name 
552*5113495bSYour Name 	if (wlan_spectral_is_feature_disabled_psoc(psoc)) {
553*5113495bSYour Name 		spectral_info("Spectral feature is disabled");
554*5113495bSYour Name 		return QDF_STATUS_COMP_DISABLED;
555*5113495bSYour Name 	}
556*5113495bSYour Name 
557*5113495bSYour Name 	return wlan_spectral_psoc_target_detach(psoc);
558*5113495bSYour Name }
559*5113495bSYour Name 
wlan_spectral_psoc_enable(struct wlan_objmgr_psoc * psoc)560*5113495bSYour Name QDF_STATUS wlan_spectral_psoc_enable(struct wlan_objmgr_psoc *psoc)
561*5113495bSYour Name {
562*5113495bSYour Name 	if (!psoc) {
563*5113495bSYour Name 		spectral_err("psoc is null");
564*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
565*5113495bSYour Name 	}
566*5113495bSYour Name 
567*5113495bSYour Name 	if (wlan_spectral_is_feature_disabled_psoc(psoc)) {
568*5113495bSYour Name 		spectral_info("Spectral feature is disabled");
569*5113495bSYour Name 		return QDF_STATUS_COMP_DISABLED;
570*5113495bSYour Name 	}
571*5113495bSYour Name 
572*5113495bSYour Name 	return tgt_spectral_register_events(psoc);
573*5113495bSYour Name }
574*5113495bSYour Name 
wlan_spectral_psoc_disable(struct wlan_objmgr_psoc * psoc)575*5113495bSYour Name QDF_STATUS wlan_spectral_psoc_disable(struct wlan_objmgr_psoc *psoc)
576*5113495bSYour Name {
577*5113495bSYour Name 	if (!psoc) {
578*5113495bSYour Name 		spectral_err("psoc is null");
579*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
580*5113495bSYour Name 	}
581*5113495bSYour Name 
582*5113495bSYour Name 	if (wlan_spectral_is_feature_disabled_psoc(psoc)) {
583*5113495bSYour Name 		spectral_info("Spectral feature is disabled");
584*5113495bSYour Name 		return QDF_STATUS_COMP_DISABLED;
585*5113495bSYour Name 	}
586*5113495bSYour Name 
587*5113495bSYour Name 	return tgt_spectral_unregister_events(psoc);
588*5113495bSYour Name }
589*5113495bSYour Name 
590*5113495bSYour Name struct wlan_lmac_if_sptrl_tx_ops *
wlan_spectral_pdev_get_lmac_if_txops(struct wlan_objmgr_pdev * pdev)591*5113495bSYour Name wlan_spectral_pdev_get_lmac_if_txops(struct wlan_objmgr_pdev *pdev)
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 	if (!pdev) {
597*5113495bSYour Name 		spectral_err("pdev is NULL!");
598*5113495bSYour Name 		return NULL;
599*5113495bSYour Name 	}
600*5113495bSYour Name 
601*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
602*5113495bSYour Name 	if (!psoc) {
603*5113495bSYour Name 		spectral_err("psoc is NULL!");
604*5113495bSYour Name 		return NULL;
605*5113495bSYour Name 	}
606*5113495bSYour Name 
607*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
608*5113495bSYour Name 	if (!tx_ops) {
609*5113495bSYour Name 		spectral_err("tx_ops is NULL");
610*5113495bSYour Name 		return NULL;
611*5113495bSYour Name 	}
612*5113495bSYour Name 
613*5113495bSYour Name 	return &tx_ops->sptrl_tx_ops;
614*5113495bSYour Name }
615