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