xref: /wlan-dirver/qca-wifi-host-cmn/spectral/dispatcher/src/wlan_spectral_tgt_api.c (revision 8ddef7dd9a290d4a9b1efd5d3efacf51d78a1a0d)
1 /*
2  * Copyright (c) 2011,2017-2019 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_tgt_api.h>
21 #include <wlan_spectral_utils_api.h>
22 #include <target_type.h>
23 
24 void *
25 tgt_get_target_handle(struct wlan_objmgr_pdev *pdev)
26 {
27 	struct pdev_spectral *ps;
28 
29 	if (!pdev) {
30 		spectral_err("PDEV is NULL!");
31 		return NULL;
32 	}
33 	ps = wlan_objmgr_pdev_get_comp_private_obj(pdev,
34 						   WLAN_UMAC_COMP_SPECTRAL);
35 	if (!ps) {
36 		spectral_err("PDEV SPECTRAL object is NULL!");
37 		return NULL;
38 	}
39 	return ps->psptrl_target_handle;
40 }
41 
42 int
43 tgt_spectral_control(
44 	struct wlan_objmgr_pdev *pdev,
45 	u_int id,
46 	void *indata,
47 	u_int32_t insize, void *outdata, u_int32_t *outsize)
48 {
49 	struct spectral_context *sc;
50 
51 	if (!pdev) {
52 		spectral_err("PDEV is NULL!");
53 		return -EPERM;
54 	}
55 	sc = spectral_get_spectral_ctx_from_pdev(pdev);
56 	if (!sc) {
57 		spectral_err("spectral context is NULL!");
58 		return -EPERM;
59 	}
60 	return spectral_control_cmn(pdev, id, indata, insize, outdata, outsize);
61 }
62 
63 void *
64 tgt_pdev_spectral_init(struct wlan_objmgr_pdev *pdev)
65 {
66 	struct wlan_objmgr_psoc *psoc = NULL;
67 
68 	psoc = wlan_pdev_get_psoc(pdev);
69 	return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_pdev_spectral_init(
70 		pdev);
71 }
72 
73 void
74 tgt_pdev_spectral_deinit(struct wlan_objmgr_pdev *pdev)
75 {
76 	struct wlan_objmgr_psoc *psoc = NULL;
77 
78 	psoc = wlan_pdev_get_psoc(pdev);
79 	psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_pdev_spectral_deinit(pdev);
80 }
81 
82 int
83 tgt_set_spectral_config(
84 	struct wlan_objmgr_pdev *pdev,
85 	const u_int32_t threshtype, const u_int32_t value)
86 {
87 	struct wlan_objmgr_psoc *psoc = NULL;
88 
89 	psoc = wlan_pdev_get_psoc(pdev);
90 	return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_set_spectral_config(
91 		pdev, threshtype, value);
92 }
93 
94 void
95 tgt_get_spectral_config(
96 	struct wlan_objmgr_pdev *pdev,
97 	struct spectral_config *sptrl_config)
98 {
99 	struct wlan_objmgr_psoc *psoc = NULL;
100 
101 	psoc = wlan_pdev_get_psoc(pdev);
102 	psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_config(
103 			pdev,
104 			sptrl_config);
105 }
106 
107 int
108 tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev)
109 {
110 	struct wlan_objmgr_psoc *psoc = NULL;
111 
112 	psoc = wlan_pdev_get_psoc(pdev);
113 	return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_start_spectral_scan(
114 		pdev);
115 }
116 
117 void
118 tgt_stop_spectral_scan(struct wlan_objmgr_pdev *pdev)
119 {
120 	struct wlan_objmgr_psoc *psoc = NULL;
121 
122 	psoc = wlan_pdev_get_psoc(pdev);
123 	psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_stop_spectral_scan(pdev);
124 }
125 
126 bool
127 tgt_is_spectral_active(struct wlan_objmgr_pdev *pdev)
128 {
129 	struct wlan_objmgr_psoc *psoc = NULL;
130 
131 	psoc = wlan_pdev_get_psoc(pdev);
132 	return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_is_spectral_active(
133 		pdev);
134 }
135 
136 bool
137 tgt_is_spectral_enabled(struct wlan_objmgr_pdev *pdev)
138 {
139 	struct wlan_objmgr_psoc *psoc = NULL;
140 
141 	psoc = wlan_pdev_get_psoc(pdev);
142 	return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_is_spectral_enabled(
143 		pdev);
144 }
145 
146 int
147 tgt_set_debug_level(struct wlan_objmgr_pdev *pdev, u_int32_t debug_level)
148 {
149 	struct wlan_objmgr_psoc *psoc = NULL;
150 
151 	psoc = wlan_pdev_get_psoc(pdev);
152 	return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_set_debug_level(
153 			pdev,
154 			debug_level);
155 }
156 
157 u_int32_t
158 tgt_get_debug_level(struct wlan_objmgr_pdev *pdev)
159 {
160 	struct wlan_objmgr_psoc *psoc = NULL;
161 
162 	psoc = wlan_pdev_get_psoc(pdev);
163 	return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_debug_level(pdev);
164 }
165 
166 void
167 tgt_get_spectral_capinfo(struct wlan_objmgr_pdev *pdev, void *outdata)
168 {
169 	struct wlan_objmgr_psoc *psoc = NULL;
170 
171 	psoc = wlan_pdev_get_psoc(pdev);
172 	return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_capinfo(
173 		pdev, outdata);
174 }
175 
176 void
177 tgt_get_spectral_diagstats(struct wlan_objmgr_pdev *pdev, void *outdata)
178 {
179 	struct wlan_objmgr_psoc *psoc = NULL;
180 
181 	psoc = wlan_pdev_get_psoc(pdev);
182 	return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_diagstats(
183 		pdev, outdata);
184 }
185 
186 void
187 tgt_register_wmi_spectral_cmd_ops(
188 	struct wlan_objmgr_pdev *pdev,
189 	struct wmi_spectral_cmd_ops *cmd_ops)
190 {
191 	struct wlan_objmgr_psoc *psoc = NULL;
192 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
193 
194 	psoc = wlan_pdev_get_psoc(pdev);
195 
196 	psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
197 
198 	return psptrl_tx_ops->sptrlto_register_wmi_spectral_cmd_ops(pdev,
199 								    cmd_ops);
200 }
201 
202 void
203 tgt_spectral_register_nl_cb(
204 	struct wlan_objmgr_pdev *pdev,
205 	struct spectral_nl_cb *nl_cb)
206 {
207 	struct wlan_objmgr_psoc *psoc = NULL;
208 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
209 
210 	if (!pdev) {
211 		spectral_err("PDEV is NULL!");
212 		return;
213 	}
214 	psoc = wlan_pdev_get_psoc(pdev);
215 
216 	psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
217 
218 	return psptrl_tx_ops->sptrlto_register_netlink_cb(pdev,
219 							  nl_cb);
220 }
221 
222 bool
223 tgt_spectral_use_nl_bcast(struct wlan_objmgr_pdev *pdev)
224 {
225 	struct wlan_objmgr_psoc *psoc = NULL;
226 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
227 
228 	psoc = wlan_pdev_get_psoc(pdev);
229 
230 	psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
231 
232 	return psptrl_tx_ops->sptrlto_use_nl_bcast(pdev);
233 }
234 
235 void tgt_spectral_deregister_nl_cb(struct wlan_objmgr_pdev *pdev)
236 {
237 	struct wlan_objmgr_psoc *psoc = NULL;
238 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
239 
240 	if (!pdev) {
241 		spectral_err("PDEV is NULL!");
242 		return;
243 	}
244 	psoc = wlan_pdev_get_psoc(pdev);
245 
246 	psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
247 
248 	psptrl_tx_ops->sptrlto_deregister_netlink_cb(pdev);
249 }
250 
251 int
252 tgt_spectral_process_report(struct wlan_objmgr_pdev *pdev,
253 			    void *payload)
254 {
255 	struct wlan_objmgr_psoc *psoc = NULL;
256 	struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
257 
258 	psoc = wlan_pdev_get_psoc(pdev);
259 
260 	psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
261 
262 	return psptrl_tx_ops->sptrlto_process_spectral_report(pdev, payload);
263 }
264 
265 uint32_t
266 tgt_spectral_get_target_type(struct wlan_objmgr_psoc *psoc)
267 {
268 	uint32_t target_type = 0;
269 	struct wlan_lmac_if_target_tx_ops *target_type_tx_ops;
270 
271 	target_type_tx_ops = &psoc->soc_cb.tx_ops.target_tx_ops;
272 
273 	if (target_type_tx_ops->tgt_get_tgt_type)
274 		target_type = target_type_tx_ops->tgt_get_tgt_type(psoc);
275 
276 	return target_type;
277 }
278 
279 #ifdef DIRECT_BUF_RX_ENABLE
280 QDF_STATUS
281 tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev)
282 {
283 	struct wlan_objmgr_psoc *psoc;
284 	struct wlan_lmac_if_direct_buf_rx_tx_ops *dbr_tx_ops = NULL;
285 
286 	psoc = wlan_pdev_get_psoc(pdev);
287 	dbr_tx_ops = &psoc->soc_cb.tx_ops.dbr_tx_ops;
288 
289 	if ((tgt_spectral_get_target_type(psoc) == TARGET_TYPE_QCA8074) ||
290 	    (tgt_spectral_get_target_type(psoc) == TARGET_TYPE_QCA8074V2) ||
291 	    (tgt_spectral_get_target_type(psoc) == TARGET_TYPE_QCA6018))
292 		if (dbr_tx_ops->direct_buf_rx_module_register)
293 			return dbr_tx_ops->direct_buf_rx_module_register
294 				(pdev, 0,
295 				 spectral_dbr_event_handler);
296 
297 	return QDF_STATUS_SUCCESS;
298 }
299 
300 QDF_STATUS
301 tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev *pdev)
302 {
303 	struct wlan_objmgr_psoc *psoc;
304 	struct wlan_lmac_if_direct_buf_rx_tx_ops *dbr_tx_ops = NULL;
305 
306 	psoc = wlan_pdev_get_psoc(pdev);
307 	dbr_tx_ops = &psoc->soc_cb.tx_ops.dbr_tx_ops;
308 
309 	if ((tgt_spectral_get_target_type(psoc) == TARGET_TYPE_QCA8074) ||
310 	    (tgt_spectral_get_target_type(psoc) == TARGET_TYPE_QCA8074V2) ||
311 	    (tgt_spectral_get_target_type(psoc) == TARGET_TYPE_QCA6018))
312 		if (dbr_tx_ops->direct_buf_rx_module_unregister)
313 			return dbr_tx_ops->direct_buf_rx_module_unregister
314 				(pdev, 0);
315 
316 	return QDF_STATUS_E_FAILURE;
317 }
318 #else
319 QDF_STATUS
320 tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev)
321 {
322 	return QDF_STATUS_SUCCESS;
323 }
324 
325 QDF_STATUS
326 tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev *pdev)
327 {
328 	return QDF_STATUS_SUCCESS;
329 }
330 #endif
331