xref: /wlan-dirver/qca-wifi-host-cmn/spectral/dispatcher/src/wlan_spectral_utils_api.c (revision 6ecd284e5a94a1c96e26d571dd47419ac305990d)
1 /*
2  * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
3  *
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #include <wlan_spectral_utils_api.h>
21 #include <qdf_module.h>
22 #include "../../core/spectral_cmn_api_i.h"
23 #include <wlan_spectral_tgt_api.h>
24 
25 QDF_STATUS
26 wlan_spectral_init(void)
27 {
28 	if (wlan_objmgr_register_psoc_create_handler(
29 		WLAN_UMAC_COMP_SPECTRAL,
30 		wlan_spectral_psoc_obj_create_handler,
31 		NULL) !=
32 	    QDF_STATUS_SUCCESS) {
33 		return QDF_STATUS_E_FAILURE;
34 	}
35 	if (wlan_objmgr_register_psoc_destroy_handler(
36 		WLAN_UMAC_COMP_SPECTRAL,
37 		wlan_spectral_psoc_obj_destroy_handler,
38 		NULL) !=
39 	    QDF_STATUS_SUCCESS) {
40 		return QDF_STATUS_E_FAILURE;
41 	}
42 	if (wlan_objmgr_register_pdev_create_handler(
43 		WLAN_UMAC_COMP_SPECTRAL,
44 		wlan_spectral_pdev_obj_create_handler,
45 		NULL) !=
46 	    QDF_STATUS_SUCCESS) {
47 		return QDF_STATUS_E_FAILURE;
48 	}
49 	if (wlan_objmgr_register_pdev_destroy_handler(
50 		WLAN_UMAC_COMP_SPECTRAL,
51 		wlan_spectral_pdev_obj_destroy_handler,
52 		NULL) !=
53 	    QDF_STATUS_SUCCESS) {
54 		return QDF_STATUS_E_FAILURE;
55 	}
56 
57 	return QDF_STATUS_SUCCESS;
58 }
59 
60 QDF_STATUS
61 wlan_spectral_deinit(void)
62 {
63 	if (wlan_objmgr_unregister_psoc_create_handler(
64 		WLAN_UMAC_COMP_SPECTRAL,
65 		wlan_spectral_psoc_obj_create_handler,
66 		NULL) !=
67 	    QDF_STATUS_SUCCESS) {
68 		return QDF_STATUS_E_FAILURE;
69 	}
70 	if (wlan_objmgr_unregister_psoc_destroy_handler(
71 		WLAN_UMAC_COMP_SPECTRAL,
72 		wlan_spectral_psoc_obj_destroy_handler,
73 		NULL) !=
74 	    QDF_STATUS_SUCCESS) {
75 		return QDF_STATUS_E_FAILURE;
76 	}
77 	if (wlan_objmgr_unregister_pdev_create_handler(
78 		WLAN_UMAC_COMP_SPECTRAL,
79 		wlan_spectral_pdev_obj_create_handler,
80 		NULL) !=
81 	    QDF_STATUS_SUCCESS) {
82 		return QDF_STATUS_E_FAILURE;
83 	}
84 	if (wlan_objmgr_unregister_pdev_destroy_handler(
85 		WLAN_UMAC_COMP_SPECTRAL,
86 		wlan_spectral_pdev_obj_destroy_handler,
87 		NULL) !=
88 	    QDF_STATUS_SUCCESS) {
89 		return QDF_STATUS_E_FAILURE;
90 	}
91 	return QDF_STATUS_SUCCESS;
92 }
93 
94 QDF_STATUS
95 spectral_register_legacy_cb(struct wlan_objmgr_psoc *psoc,
96 			    struct spectral_legacy_cbacks *legacy_cbacks)
97 {
98 	struct spectral_context *sc;
99 
100 	sc = spectral_get_spectral_ctx_from_psoc(psoc);
101 	if (!sc) {
102 		spectral_err("Invalid Context");
103 		return QDF_STATUS_E_FAILURE;
104 	}
105 
106 	sc->legacy_cbacks.vdev_get_chan_freq =
107 	    legacy_cbacks->vdev_get_chan_freq;
108 	sc->legacy_cbacks.vdev_get_ch_width = legacy_cbacks->vdev_get_ch_width;
109 	sc->legacy_cbacks.vdev_get_sec20chan_freq_mhz =
110 	    legacy_cbacks->vdev_get_sec20chan_freq_mhz;
111 
112 	return QDF_STATUS_SUCCESS;
113 }
114 qdf_export_symbol(spectral_register_legacy_cb);
115 
116 int16_t
117 spectral_vdev_get_chan_freq(struct wlan_objmgr_vdev *vdev)
118 {
119 	struct spectral_context *sc;
120 
121 	sc = spectral_get_spectral_ctx_from_vdev(vdev);
122 	if (!sc) {
123 		spectral_err("spectral context is Null");
124 		return -EINVAL;
125 	}
126 
127 	return sc->legacy_cbacks.vdev_get_chan_freq(vdev);
128 }
129 
130 enum phy_ch_width
131 spectral_vdev_get_ch_width(struct wlan_objmgr_vdev *vdev)
132 {
133 	struct spectral_context *sc;
134 
135 	sc = spectral_get_spectral_ctx_from_vdev(vdev);
136 	if (!sc) {
137 		spectral_err("spectral context is Null");
138 		return CH_WIDTH_INVALID;
139 	}
140 
141 	return sc->legacy_cbacks.vdev_get_ch_width(vdev);
142 }
143 
144 int
145 spectral_vdev_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
146 				     uint16_t *sec20chan_freq)
147 {
148 	struct spectral_context *sc;
149 
150 	sc = spectral_get_spectral_ctx_from_vdev(vdev);
151 	if (!sc) {
152 		spectral_err("spectral context is Null");
153 		return -EINVAL;
154 	}
155 
156 	return sc->legacy_cbacks.vdev_get_sec20chan_freq_mhz(vdev,
157 							     sec20chan_freq);
158 }
159 
160 void
161 wlan_lmac_if_sptrl_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
162 {
163 	struct wlan_lmac_if_sptrl_rx_ops *sptrl_rx_ops = &rx_ops->sptrl_rx_ops;
164 
165 	/* Spectral rx ops */
166 	sptrl_rx_ops->sptrlro_get_target_handle = tgt_get_target_handle;
167 	sptrl_rx_ops->sptrlro_vdev_get_chan_freq = spectral_vdev_get_chan_freq;
168 	sptrl_rx_ops->sptrlro_vdev_get_ch_width = spectral_vdev_get_ch_width;
169 	sptrl_rx_ops->sptrlro_vdev_get_sec20chan_freq_mhz =
170 	    spectral_vdev_get_sec20chan_freq_mhz;
171 }
172 
173 void
174 wlan_register_wmi_spectral_cmd_ops(struct wlan_objmgr_pdev *pdev,
175 				   struct wmi_spectral_cmd_ops *cmd_ops)
176 {
177 	struct spectral_context *sc;
178 
179 	if (!pdev) {
180 		spectral_err("PDEV is NULL!");
181 		return;
182 	}
183 
184 	sc = spectral_get_spectral_ctx_from_pdev(pdev);
185 	if (!sc) {
186 		spectral_err("spectral context is NULL!");
187 		return;
188 	}
189 
190 	return sc->sptrlc_register_wmi_spectral_cmd_ops(pdev, cmd_ops);
191 }
192 qdf_export_symbol(wlan_register_wmi_spectral_cmd_ops);
193 
194 #ifdef DIRECT_BUF_RX_ENABLE
195 int spectral_dbr_event_handler(struct wlan_objmgr_pdev *pdev,
196 			       struct direct_buf_rx_data *payload)
197 {
198 	struct spectral_context *sc;
199 
200 	if (!pdev) {
201 		spectral_err("PDEV is NULL!");
202 		return -EINVAL;
203 	}
204 	sc = spectral_get_spectral_ctx_from_pdev(pdev);
205 	if (!sc) {
206 		spectral_err("spectral context is NULL!");
207 		return -EINVAL;
208 	}
209 
210 	return sc->sptrlc_process_spectral_report(pdev, payload);
211 }
212 #endif
213 
214 QDF_STATUS spectral_pdev_open(struct wlan_objmgr_pdev *pdev)
215 {
216 	QDF_STATUS status;
217 
218 	status = tgt_spectral_register_to_dbr(pdev);
219 
220 	return QDF_STATUS_SUCCESS;
221 }
222