1 /*
2 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
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 /**
21 * DOC: cdp_txrx_mon.h
22 * Define the monitor mode API functions
23 * called by the host control SW and the OS interface module
24 */
25
26 #ifndef _CDP_TXRX_MON_H_
27 #define _CDP_TXRX_MON_H_
28 #include "cdp_txrx_handle.h"
29 #include <cdp_txrx_cmn.h>
30
cdp_reset_monitor_mode(ol_txrx_soc_handle soc,uint8_t pdev_id,u_int8_t smart_monitor)31 static inline QDF_STATUS cdp_reset_monitor_mode(ol_txrx_soc_handle soc,
32 uint8_t pdev_id,
33 u_int8_t smart_monitor)
34 {
35 if (!soc || !soc->ops) {
36 dp_cdp_debug("Invalid Instance");
37 QDF_BUG(0);
38 return 0;
39 }
40
41 if (!soc->ops->mon_ops ||
42 !soc->ops->mon_ops->txrx_reset_monitor_mode)
43 return 0;
44
45 return soc->ops->mon_ops->txrx_reset_monitor_mode(soc, pdev_id,
46 smart_monitor);
47 }
48
49 /**
50 * cdp_deliver_tx_mgmt() - Deliver mgmt frame for tx capture
51 * @soc: Datapath SOC handle
52 * @pdev_id: id of datapath PDEV handle
53 * @nbuf: Management frame buffer
54 */
55 static inline QDF_STATUS
cdp_deliver_tx_mgmt(ol_txrx_soc_handle soc,uint8_t pdev_id,qdf_nbuf_t nbuf)56 cdp_deliver_tx_mgmt(ol_txrx_soc_handle soc, uint8_t pdev_id,
57 qdf_nbuf_t nbuf)
58 {
59 if (!soc || !soc->ops) {
60 dp_cdp_debug("Invalid Instance");
61 QDF_BUG(0);
62 return QDF_STATUS_E_FAILURE;
63 }
64
65 if (!soc->ops->mon_ops ||
66 !soc->ops->mon_ops->txrx_deliver_tx_mgmt)
67 return QDF_STATUS_E_FAILURE;
68
69 return soc->ops->mon_ops->txrx_deliver_tx_mgmt(soc, pdev_id, nbuf);
70 }
71
72 #ifdef QCA_SUPPORT_LITE_MONITOR
73 /**
74 * cdp_set_lite_mon_config() - Set lite monitor config/filter
75 *
76 * @soc: dp soc handle
77 * @config: lite monitor config
78 * @pdev_id: pdev id
79 *
80 * This API is used to enable/disable lite monitor feature
81 *
82 * Return: QDF_STATUS_SUCCESS if value set successfully
83 * QDF_STATUS_E_INVAL false if error
84 */
85 static inline QDF_STATUS
cdp_set_lite_mon_config(ol_txrx_soc_handle soc,struct cdp_lite_mon_filter_config * config,uint8_t pdev_id)86 cdp_set_lite_mon_config(ol_txrx_soc_handle soc,
87 struct cdp_lite_mon_filter_config *config,
88 uint8_t pdev_id)
89 {
90 if (!soc || !soc->ops) {
91 dp_cdp_debug("Invalid Instance");
92 return QDF_STATUS_E_INVAL;
93 }
94
95 if (!soc->ops->mon_ops ||
96 !soc->ops->mon_ops->txrx_set_lite_mon_config)
97 return QDF_STATUS_E_INVAL;
98
99 return soc->ops->mon_ops->txrx_set_lite_mon_config(soc, config,
100 pdev_id);
101 }
102
103 /**
104 * cdp_get_lite_mon_config() - Get lite monitor config
105 *
106 * @soc: dp soc handle
107 * @config: lite monitor config
108 * @pdev_id: pdev id
109 *
110 * This API is used to get lite monitor feature config
111 *
112 * Return: QDF_STATUS_SUCCESS if get is successfully
113 * QDF_STATUS_E_INVAL false if error
114 */
115 static inline QDF_STATUS
cdp_get_lite_mon_config(ol_txrx_soc_handle soc,struct cdp_lite_mon_filter_config * config,uint8_t pdev_id)116 cdp_get_lite_mon_config(ol_txrx_soc_handle soc,
117 struct cdp_lite_mon_filter_config *config,
118 uint8_t pdev_id)
119 {
120 if (!soc || !soc->ops) {
121 dp_cdp_debug("Invalid Instance");
122 return QDF_STATUS_E_INVAL;
123 }
124
125 if (!soc->ops->mon_ops ||
126 !soc->ops->mon_ops->txrx_get_lite_mon_config)
127 return QDF_STATUS_E_INVAL;
128
129 return soc->ops->mon_ops->txrx_get_lite_mon_config(soc, config,
130 pdev_id);
131 }
132
133 /**
134 * cdp_set_lite_mon_peer_config() - Set lite monitor peer config
135 *
136 * @soc: dp soc handle
137 * @config: lite monitor peer config
138 * @pdev_id: pdev id
139 *
140 * This API is used to add/del lite monitor peers
141 *
142 * Return: QDF_STATUS_SUCCESS if value set successfully
143 * QDF_STATUS_E_INVAL false if error
144 */
145 static inline QDF_STATUS
cdp_set_lite_mon_peer_config(ol_txrx_soc_handle soc,struct cdp_lite_mon_peer_config * config,uint8_t pdev_id)146 cdp_set_lite_mon_peer_config(ol_txrx_soc_handle soc,
147 struct cdp_lite_mon_peer_config *config,
148 uint8_t pdev_id)
149 {
150 if (!soc || !soc->ops) {
151 dp_cdp_debug("Invalid Instance");
152 return QDF_STATUS_E_INVAL;
153 }
154
155 if (!soc->ops->mon_ops ||
156 !soc->ops->mon_ops->txrx_set_lite_mon_peer_config)
157 return QDF_STATUS_E_INVAL;
158
159 return soc->ops->mon_ops->txrx_set_lite_mon_peer_config(soc, config,
160 pdev_id);
161 }
162
163 /**
164 * cdp_get_lite_mon_peer_config() - Get lite monitor peer list
165 *
166 * @soc: dp soc handle
167 * @info: lite monitor peer info
168 * @pdev_id: pdev id
169 *
170 * This API is used to get lite monitor peers
171 *
172 * Return: QDF_STATUS_SUCCESS if value set successfully
173 * QDF_STATUS_E_INVAL false if error
174 */
175 static inline QDF_STATUS
cdp_get_lite_mon_peer_config(ol_txrx_soc_handle soc,struct cdp_lite_mon_peer_info * info,uint8_t pdev_id)176 cdp_get_lite_mon_peer_config(ol_txrx_soc_handle soc,
177 struct cdp_lite_mon_peer_info *info,
178 uint8_t pdev_id)
179 {
180 if (!soc || !soc->ops) {
181 dp_cdp_debug("Invalid Instance");
182 return QDF_STATUS_E_INVAL;
183 }
184
185 if (!soc->ops->mon_ops ||
186 !soc->ops->mon_ops->txrx_get_lite_mon_peer_config)
187 return QDF_STATUS_E_INVAL;
188
189 return soc->ops->mon_ops->txrx_get_lite_mon_peer_config(soc, info,
190 pdev_id);
191 }
192
193 /**
194 * cdp_is_lite_mon_enabled() - Get lite monitor enable status
195 *
196 * @soc: dp soc handle
197 * @pdev_id: pdev id
198 * @dir: direction tx/rx
199 *
200 * This API is used to get lite monitor enable status
201 *
202 * Return: 0 if disabled
203 * 1 if enabled
204 */
205 static inline int
cdp_is_lite_mon_enabled(ol_txrx_soc_handle soc,uint8_t pdev_id,uint8_t dir)206 cdp_is_lite_mon_enabled(ol_txrx_soc_handle soc,
207 uint8_t pdev_id, uint8_t dir)
208 {
209 if (!soc || !soc->ops) {
210 dp_cdp_debug("Invalid Instance");
211 return 0;
212 }
213
214 if (!soc->ops->mon_ops ||
215 !soc->ops->mon_ops->txrx_is_lite_mon_enabled)
216 return 0;
217
218 return soc->ops->mon_ops->txrx_is_lite_mon_enabled(soc, pdev_id, dir);
219 }
220
221 /*
222 * cdp_get_lite_mon_legacy_feature_enabled() - Get the legacy feature enabled
223 *
224 * @soc: dp soc handle
225 * @pdev_id: pdev id
226 * @dir: direction tx/rx
227 *
228 * This API is used to get the legacy feature enabled using lite_mon
229 *
230 * Return: legacy feature enabled
231 */
232 static inline int
cdp_get_lite_mon_legacy_feature_enabled(ol_txrx_soc_handle soc,uint8_t pdev_id,uint8_t dir)233 cdp_get_lite_mon_legacy_feature_enabled(ol_txrx_soc_handle soc,
234 uint8_t pdev_id, uint8_t dir)
235 {
236 if (!soc || !soc->ops) {
237 dp_cdp_debug("Invalid Instance");
238 return 0;
239 }
240
241 if (!soc->ops->mon_ops ||
242 !soc->ops->mon_ops->txrx_get_lite_mon_legacy_feature_enabled)
243 return 0;
244
245 return soc->ops->mon_ops->txrx_get_lite_mon_legacy_feature_enabled(soc,
246 pdev_id,
247 dir);
248 }
249 #endif
250
251 #ifdef QCA_RSSI_DB2DBM
252 /**
253 * cdp_set_params_rssi_dbm_conversion - Set the rssi dbm conversion params
254 * into dp_pdev structure
255 * @soc: soc txrx handler
256 * @params: cdp_rssi_db2dbm_param_dp pointer
257 *
258 */
259 static inline QDF_STATUS
cdp_set_params_rssi_dbm_conversion(ol_txrx_soc_handle soc,struct cdp_rssi_db2dbm_param_dp * params)260 cdp_set_params_rssi_dbm_conversion(ol_txrx_soc_handle soc,
261 struct cdp_rssi_db2dbm_param_dp *params)
262 {
263 if (!soc || !soc->ops) {
264 dp_cdp_debug("Invalid Instance:");
265 QDF_BUG(0);
266 return QDF_STATUS_E_FAILURE;
267 }
268
269 if (!soc->ops->mon_ops ||
270 !soc->ops->mon_ops->txrx_set_mon_pdev_params_rssi_dbm_conv)
271 return QDF_STATUS_E_FAILURE;
272
273 return soc->ops->mon_ops->txrx_set_mon_pdev_params_rssi_dbm_conv
274 (soc, params);
275 }
276 #endif
277
278 #ifdef WLAN_CONFIG_TELEMETRY_AGENT
279 /*
280 * cdp_update_pdev_mon_telemetry_airtime_stats() - update telemetry airtime
281 * stats in monitor pdev
282 *
283 *@soc: dp soc handle
284 *@pdev_id: pdev id
285 *
286 * This API is used to update telemetry airtime stats in monitor pdev
287 *
288 * Return: Success if stats are updated, else failure
289 */
290 static inline QDF_STATUS
cdp_update_pdev_mon_telemetry_airtime_stats(ol_txrx_soc_handle soc,uint8_t pdev_id)291 cdp_update_pdev_mon_telemetry_airtime_stats(ol_txrx_soc_handle soc,
292 uint8_t pdev_id)
293 {
294 if (!soc || !soc->ops) {
295 dp_cdp_debug("Invalid Instance");
296 return QDF_STATUS_E_FAILURE;
297 }
298
299 if (!soc->ops->mon_ops ||
300 !soc->ops->mon_ops->txrx_update_pdev_mon_telemetry_airtime_stats)
301 return QDF_STATUS_E_FAILURE;
302
303 return soc->ops->mon_ops->txrx_update_pdev_mon_telemetry_airtime_stats(
304 soc, pdev_id);
305 }
306 #endif
307
308 #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE
309 /**
310 * cdp_start_local_pkt_capture() - start local pkt capture
311 * @soc: opaque soc handle
312 * @pdev_id: pdev id
313 * @filter: monitor filter config
314 *
315 * Return: QDF_STATUS_SUCCESS if success
316 * QDF_STATUS_E_FAILURE if error
317 */
318 static inline
cdp_start_local_pkt_capture(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_monitor_filter * filter)319 QDF_STATUS cdp_start_local_pkt_capture(ol_txrx_soc_handle soc,
320 uint8_t pdev_id,
321 struct cdp_monitor_filter *filter)
322 {
323 if (!soc || !soc->ops) {
324 dp_cdp_debug("Invalid Instance");
325 return QDF_STATUS_E_FAILURE;
326 }
327
328 if (!soc->ops->mon_ops ||
329 !soc->ops->mon_ops->start_local_pkt_capture)
330 return QDF_STATUS_E_FAILURE;
331
332 return soc->ops->mon_ops->start_local_pkt_capture(soc, pdev_id, filter);
333 }
334
335 /**
336 * cdp_stop_local_pkt_capture() - stop local pkt capture
337 * @soc: opaque soc handle
338 * @pdev_id: pdev_id
339 *
340 * Return: QDF_STATUS_SUCCESS if success
341 * QDF_STATUS_E_FAILURE if error
342 */
343 static inline
cdp_stop_local_pkt_capture(ol_txrx_soc_handle soc,uint8_t pdev_id)344 QDF_STATUS cdp_stop_local_pkt_capture(ol_txrx_soc_handle soc, uint8_t pdev_id)
345 {
346 if (!soc || !soc->ops) {
347 dp_cdp_debug("Invalid Instance");
348 QDF_BUG(0);
349 return QDF_STATUS_E_FAILURE;
350 }
351
352 if (!soc->ops->mon_ops ||
353 !soc->ops->mon_ops->stop_local_pkt_capture)
354 return QDF_STATUS_E_FAILURE;
355
356 return soc->ops->mon_ops->stop_local_pkt_capture(soc, pdev_id);
357 }
358
359 /**
360 * cdp_is_local_pkt_capture_running() - get is local packet capture running
361 * @soc: opaque soc handle
362 * @pdev_id: pdev id
363 *
364 * Return: true if running
365 * false if not running
366 */
367 static inline
cdp_is_local_pkt_capture_running(ol_txrx_soc_handle soc,uint8_t pdev_id)368 bool cdp_is_local_pkt_capture_running(ol_txrx_soc_handle soc, uint8_t pdev_id)
369 {
370 if (!soc || !soc->ops) {
371 dp_cdp_debug("Invalid Instance");
372 QDF_BUG(0);
373 return false;
374 }
375
376 if (!soc->ops->mon_ops ||
377 !soc->ops->mon_ops->is_local_pkt_capture_running)
378 return false;
379
380 return soc->ops->mon_ops->is_local_pkt_capture_running(soc, pdev_id);
381 }
382 #else
383 static inline
cdp_start_local_pkt_capture(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_monitor_filter * filter)384 QDF_STATUS cdp_start_local_pkt_capture(ol_txrx_soc_handle soc,
385 uint8_t pdev_id,
386 struct cdp_monitor_filter *filter)
387 {
388 return QDF_STATUS_E_NOSUPPORT;
389 }
390
391 static inline
cdp_stop_local_pkt_capture(ol_txrx_soc_handle soc,uint8_t pdev_id)392 QDF_STATUS cdp_stop_local_pkt_capture(ol_txrx_soc_handle soc, uint8_t pdev_id)
393 {
394 return QDF_STATUS_E_NOSUPPORT;
395 }
396
397 static inline
cdp_is_local_pkt_capture_running(ol_txrx_soc_handle soc,uint8_t pdev_id)398 bool cdp_is_local_pkt_capture_running(ol_txrx_soc_handle soc, uint8_t pdev_id)
399 {
400 return false;
401 }
402 #endif /* WLAN_FEATURE_LOCAL_PKT_CAPTURE */
403
404 #endif
405