1 /*
2  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #ifndef _WLAN_MGMT_TXRX_RX_REO_UTILS_API_H_
19 #define _WLAN_MGMT_TXRX_RX_REO_UTILS_API_H_
20 
21 /**
22  * DOC:  wlan_mgmt_txrx_rx_reo_utils_api.h
23  *
24  * management rx-reorder public APIs and structures
25  * for umac converged components.
26  *
27  */
28 
29 #include <wlan_mgmt_txrx_utils_api.h>
30 
31 struct mgmt_txrx_priv_pdev_context;
32 
33 /**
34  * wlan_get_mlo_link_id_from_pdev() - Helper API to get the MLO HW link id
35  * from the pdev object.
36  * @pdev: Pointer to pdev object
37  *
38  * Return: On success returns the MLO HW link id corresponding to the pdev
39  * object. On failure returns -1.
40  */
41 int8_t
42 wlan_get_mlo_link_id_from_pdev(struct wlan_objmgr_pdev *pdev);
43 
44 /**
45  * wlan_get_pdev_from_mlo_link_id() - Helper API to get the pdev
46  * object from the link id.
47  * @mlo_link_id: MLO HW link id
48  * @refdbgid: Reference debug id
49  *
50  * Return: On success returns the pdev object from the link_id.
51  * On failure returns NULL.
52  */
53 struct wlan_objmgr_pdev *
54 wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id,
55 			       wlan_objmgr_ref_dbgid refdbgid);
56 
57 #ifdef WLAN_MGMT_RX_REO_SUPPORT
58 
59 #define mgmt_rx_reo_alert(params...) \
60 	QDF_TRACE_FATAL(QDF_MODULE_ID_MGMT_RX_REO, params)
61 #define mgmt_rx_reo_err(params...) \
62 	QDF_TRACE_ERROR(QDF_MODULE_ID_MGMT_RX_REO, params)
63 #define mgmt_rx_reo_warn(params...) \
64 	QDF_TRACE_WARN(QDF_MODULE_ID_MGMT_RX_REO, params)
65 #define mgmt_rx_reo_notice(params...) \
66 	QDF_TRACE_INFO(QDF_MODULE_ID_MGMT_RX_REO, params)
67 #define mgmt_rx_reo_info(params...) \
68 	QDF_TRACE_INFO(QDF_MODULE_ID_MGMT_RX_REO, params)
69 #define mgmt_rx_reo_debug(params...) \
70 	QDF_TRACE_DEBUG(QDF_MODULE_ID_MGMT_RX_REO, params)
71 
72 #define mgmt_rx_reo_alert_no_fl(params...) \
73 	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_MGMT_RX_REO, params)
74 #define mgmt_rx_reo_err_no_fl(params...) \
75 	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_MGMT_RX_REO, params)
76 #define mgmt_rx_reo_warn_no_fl(params...) \
77 	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_MGMT_RX_REO, params)
78 #define mgmt_rx_reo_notice_no_fl(params...) \
79 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_MGMT_RX_REO, params)
80 #define mgmt_rx_reo_info_no_fl(params...) \
81 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_MGMT_RX_REO, params)
82 #define mgmt_rx_reo_debug_no_fl(params...) \
83 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_MGMT_RX_REO, params)
84 
85 #define mgmt_rx_reo_alert_rl(params...) \
86 	QDF_TRACE_FATAL_RL(QDF_MODULE_ID_MGMT_RX_REO, params)
87 #define mgmt_rx_reo_err_rl(params...) \
88 	QDF_TRACE_ERROR_RL(QDF_MODULE_ID_MGMT_RX_REO, params)
89 #define mgmt_rx_reo_warn_rl(params...) \
90 	QDF_TRACE_WARN_RL(QDF_MODULE_ID_MGMT_RX_REO, params)
91 #define mgmt_rx_reo_notice_rl(params...) \
92 	QDF_TRACE_INFO_RL(QDF_MODULE_ID_MGMT_RX_REO, params)
93 #define mgmt_rx_reo_info_rl(params...) \
94 	QDF_TRACE_INFO_RL(QDF_MODULE_ID_MGMT_RX_REO, params)
95 #define mgmt_rx_reo_debug_rl(params...) \
96 	QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_MGMT_RX_REO, params)
97 
98 #ifdef WLAN_MGMT_RX_REO_SIM_SUPPORT
99 /**
100  * wlan_mgmt_rx_reo_sim_start() - Helper API to start management Rx reorder
101  * simulation
102  *
103  * This API starts the simulation framework which mimics the management frame
104  * generation by target. MAC HW is modelled as a kthread. FW and host layers
105  * are modelled as an ordered work queues.
106  *
107  * Return: QDF_STATUS
108  */
109 QDF_STATUS
110 wlan_mgmt_rx_reo_sim_start(void);
111 
112 /**
113  * wlan_mgmt_rx_reo_sim_stop() - Helper API to stop management Rx reorder
114  * simulation
115  *
116  * This API stops the simulation framework which mimics the management frame
117  * generation by target. MAC HW is modelled as a kthread. FW and host layers
118  * are modelled as an ordered work queues.
119  *
120  * Return: QDF_STATUS
121  */
122 QDF_STATUS
123 wlan_mgmt_rx_reo_sim_stop(void);
124 #else
125 /**
126  * wlan_mgmt_rx_reo_sim_start() - Helper API to start management Rx reorder
127  * simulation
128  *
129  * Error print is added to indicate that simulation framework is not compiled.
130  *
131  * Return: QDF_STATUS_E_INVAL
132  */
133 static inline QDF_STATUS
134 wlan_mgmt_rx_reo_sim_start(void)
135 {
136 	mgmt_txrx_err("Mgmt rx reo simulation is not compiled");
137 
138 	return QDF_STATUS_E_INVAL;
139 }
140 
141 /**
142  * wlan_mgmt_rx_reo_sim_stop() - Helper API to stop management Rx reorder
143  * simulation
144  *
145  * Error print is added to indicate that simulation framework is not compiled.
146  *
147  * Return: QDF_STATUS_E_INVAL
148  */
149 static inline QDF_STATUS
150 wlan_mgmt_rx_reo_sim_stop(void)
151 {
152 	mgmt_txrx_err("Mgmt rx reo simulation is not compiled");
153 
154 	return QDF_STATUS_E_INVAL;
155 }
156 #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
157 
158 /**
159  * wlan_mgmt_rx_reo_get_snapshot_info() - Get snapshot info
160  * @pdev: pointer to pdev
161  * @id: snapshot identifier
162  * @snapshot_info: pointer to snapshot info
163  *
164  * Helper API to get information of snapshot @id for pdev @pdev.
165  *
166  * Return: QDF_STATUS
167  */
168 QDF_STATUS
169 wlan_mgmt_rx_reo_get_snapshot_info
170 			(struct wlan_objmgr_pdev *pdev,
171 			 enum mgmt_rx_reo_shared_snapshot_id id,
172 			 struct mgmt_rx_reo_snapshot_info *snapshot_info);
173 
174 /**
175  * wlan_mgmt_txrx_process_rx_frame() - API to process the incoming management
176  * frame
177  * @pdev: pointer to pdev
178  * @buf: pointer to buffer
179  * @mgmt_rx_params: pointer to management rx params
180  *
181  * API to process the incoming management frame.
182  *
183  * Return: QDF_STATUS
184  */
185 QDF_STATUS wlan_mgmt_txrx_process_rx_frame(
186 			struct wlan_objmgr_pdev *pdev,
187 			qdf_nbuf_t buf,
188 			struct mgmt_rx_event_params *mgmt_rx_params);
189 
190 /**
191  * wlan_mgmt_rx_reo_init() - Initializes the management rx-reorder module
192  *
193  * This function gets called from dispatcher init and initializes the management
194  * rx-reorder module.
195  *
196  * Return: QDF_STATUS
197  */
198 QDF_STATUS
199 wlan_mgmt_rx_reo_init(void);
200 
201 /**
202  * wlan_mgmt_rx_reo_deinit() - De initializes the management rx-reorder module
203  *
204  * This function gets called from dispatcher deinit and de initializes the
205  * management rx-reorder module.
206  *
207  * Return: QDF_STATUS
208  */
209 QDF_STATUS
210 wlan_mgmt_rx_reo_deinit(void);
211 
212 /**
213  * wlan_mgmt_rx_reo_validate_mlo_link_info() - Validate the MLO HW link
214  * related information extracted from the MLO global shared memory arena
215  * @psoc: pointer to psoc object
216  *
217  * This function validates the MLO HW link related information extracted from
218  * the MLO global shared memory arena. This includes number of active HW links
219  * and the valid link bitmap. Same information is available with MLO manager and
220  * it is considered as the source of truth.
221  *
222  * Return: QDF_STATUS
223  */
224 QDF_STATUS
225 wlan_mgmt_rx_reo_validate_mlo_link_info(struct wlan_objmgr_psoc *psoc);
226 
227 /**
228  * wlan_mgmt_rx_reo_pdev_obj_create_notification() - pdev create handler for
229  * management rx-reorder module
230  * @pdev: pointer to pdev object
231  * @mgmt_txrx_pdev_ctx: pdev private object of mgmt txrx module
232  *
233  * This function gets called from object manager when pdev is being created and
234  * creates management rx-reorder pdev context
235  *
236  * Return: QDF_STATUS
237  */
238 QDF_STATUS
239 wlan_mgmt_rx_reo_pdev_obj_create_notification(
240 			struct wlan_objmgr_pdev *pdev,
241 			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx);
242 
243 /**
244  * wlan_mgmt_rx_reo_pdev_obj_destroy_notification() - pdev destroy handler for
245  * management rx-reorder feature
246  * @pdev: pointer to pdev object
247  * @mgmt_txrx_pdev_ctx: pdev private object of mgmt txrx module
248  *
249  * This function gets called from object manager when pdev is being destroyed
250  * and destroys management rx-reorder pdev context
251  *
252  * Return: QDF_STATUS
253  */
254 QDF_STATUS
255 wlan_mgmt_rx_reo_pdev_obj_destroy_notification(
256 			struct wlan_objmgr_pdev *pdev,
257 			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx);
258 
259 /**
260  * wlan_mgmt_rx_reo_psoc_obj_create_notification() - psoc create handler for
261  * management rx-reorder module
262  * @psoc: pointer to psoc object
263  *
264  * This function gets called from object manager when psoc is being created.
265  *
266  * Return: QDF_STATUS
267  */
268 QDF_STATUS
269 wlan_mgmt_rx_reo_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc);
270 
271 /**
272  * wlan_mgmt_rx_reo_psoc_obj_destroy_notification() - psoc destroy handler for
273  * management rx-reorder feature
274  * @psoc: pointer to psoc object
275  *
276  * This function gets called from object manager when psoc is being destroyed.
277  *
278  * Return: QDF_STATUS
279  */
280 QDF_STATUS
281 wlan_mgmt_rx_reo_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc);
282 
283 /**
284  * wlan_mgmt_rx_reo_attach() - Initializes the per pdev data structures related
285  * to management rx-reorder module
286  * @pdev: pointer to pdev object
287  *
288  * Return: QDF_STATUS
289  */
290 QDF_STATUS
291 wlan_mgmt_rx_reo_attach(struct wlan_objmgr_pdev *pdev);
292 
293 /**
294  * wlan_mgmt_rx_reo_detach() - Clears the per pdev data structures related to
295  * management rx-reorder module
296  * @pdev: pointer to pdev object
297  *
298  * Return: QDF_STATUS
299  */
300 QDF_STATUS
301 wlan_mgmt_rx_reo_detach(struct wlan_objmgr_pdev *pdev);
302 
303 /**
304  * wlan_mgmt_rx_reo_is_feature_enabled_at_psoc() - Check if MGMT Rx REO feature
305  * is enabled on a given psoc
306  * @psoc: pointer to psoc object
307  *
308  * Return: true if the feature is enabled, else false
309  */
310 bool
311 wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc *psoc);
312 
313 /**
314  * wlan_mgmt_rx_reo_is_feature_enabled_at_pdev() - Check if MGMT Rx REO feature
315  * is enabled on a given pdev
316  * @psoc: pointer to pdev object
317  *
318  * Return: true if the feature is enabled, else false
319  */
320 bool
321 wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev);
322 
323 /**
324  * wlan_mgmt_rx_reo_get_pkt_ctr_delta_thresh() - Get the packet counter delta
325  * threshold value
326  * @psoc: pointer to psoc object
327  *
328  * Return: Packet counter delta threshold value
329  */
330 uint16_t
331 wlan_mgmt_rx_reo_get_pkt_ctr_delta_thresh(struct wlan_objmgr_psoc *psoc);
332 
333 /**
334  * wlan_mgmt_rx_reo_get_ingress_frame_debug_list_size() - Get the size of
335  * ingress  frame debug list
336  * @psoc: pointer to psoc object
337  *
338  * Return: Size of ingress frame debug list
339  */
340 uint16_t
341 wlan_mgmt_rx_reo_get_ingress_frame_debug_list_size
342 					(struct wlan_objmgr_psoc *psoc);
343 
344 /**
345  * wlan_mgmt_rx_reo_get_egress_frame_debug_list_size() - Get the size of
346  * egress  frame debug list
347  * @psoc: pointer to psoc object
348  *
349  * Return: Size of egress frame debug list
350  */
351 uint16_t
352 wlan_mgmt_rx_reo_get_egress_frame_debug_list_size
353 					(struct wlan_objmgr_psoc *psoc);
354 
355 /**
356  * wlan_mgmt_rx_reo_is_simulation_in_progress() - API to check whether
357  * simulation is in progress
358  *
359  * Return: true if simulation is in progress, else false
360  */
361 bool
362 wlan_mgmt_rx_reo_is_simulation_in_progress(void);
363 
364 /**
365  * wlan_mgmt_rx_reo_print_ingress_frame_stats() - Helper API to print
366  * stats related to incoming management frames
367  *
368  * This API prints stats related to management frames entering management
369  * Rx reorder module.
370  *
371  * Return: QDF_STATUS
372  */
373 QDF_STATUS
374 wlan_mgmt_rx_reo_print_ingress_frame_stats(void);
375 
376 /**
377  * wlan_mgmt_rx_reo_print_ingress_frame_info() - Print the debug information
378  * about the latest frames entered the reorder module
379  * @num_frames: Number of frames for which the debug information is to be
380  * printed. If @num_frames is 0, then debug information about all the frames
381  * in the ring buffer will be  printed.
382  *
383  * Return: QDF_STATUS of operation
384  */
385 QDF_STATUS
386 wlan_mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames);
387 
388 /**
389  * wlan_mgmt_rx_reo_print_egress_frame_stats() - Helper API to print
390  * stats related to outgoing management frames
391  *
392  * This API prints stats related to management frames exiting management
393  * Rx reorder module.
394  *
395  * Return: QDF_STATUS
396  */
397 QDF_STATUS
398 wlan_mgmt_rx_reo_print_egress_frame_stats(void);
399 
400 /**
401  * wlan_mgmt_rx_reo_print_egress_frame_info() - Print the debug information
402  * about the latest frames leaving the reorder module
403  * @num_frames: Number of frames for which the debug information is to be
404  * printed. If @num_frames is 0, then debug information about all the frames
405  * in the ring buffer will be  printed.
406  *
407  * Return: QDF_STATUS of operation
408  */
409 QDF_STATUS
410 wlan_mgmt_rx_reo_print_egress_frame_info(uint16_t num_frames);
411 #else
412 static inline QDF_STATUS
413 wlan_mgmt_rx_reo_validate_mlo_link_info(struct wlan_objmgr_psoc *psoc)
414 {
415 	return QDF_STATUS_SUCCESS;
416 }
417 
418 /**
419  * wlan_mgmt_rx_reo_pdev_obj_create_notification() - pdev create handler for
420  * management rx-reorder feature
421  * @pdev: pointer to pdev object
422  * @mgmt_txrx_pdev_ctx: pdev private object of mgmt txrx module
423  *
424  * This function gets called from object manager when pdev is being created and
425  * creates management rx-reorder pdev context
426  *
427  * Return: QDF_STATUS
428  */
429 static inline QDF_STATUS
430 wlan_mgmt_rx_reo_pdev_obj_create_notification(
431 			struct wlan_objmgr_pdev *pdev,
432 			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
433 {
434 	return QDF_STATUS_SUCCESS;
435 }
436 
437 /**
438  * wlan_mgmt_rx_reo_pdev_obj_destroy_notification() - pdev destroy handler for
439  * management rx-reorder feature
440  * @pdev: pointer to pdev object
441  * @mgmt_txrx_pdev_ctx: pdev private object of mgmt txrx module
442  *
443  * This function gets called from object manager when pdev is being destroyed
444  * and destroys management rx-reorder pdev context
445  *
446  * Return: QDF_STATUS
447  */
448 static inline QDF_STATUS
449 wlan_mgmt_rx_reo_pdev_obj_destroy_notification(
450 			struct wlan_objmgr_pdev *pdev,
451 			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
452 {
453 	return QDF_STATUS_SUCCESS;
454 }
455 
456 /**
457  * wlan_mgmt_rx_reo_psoc_obj_create_notification() - psoc create handler for
458  * management rx-reorder module
459  * @psoc: pointer to psoc object
460  *
461  * This function gets called from object manager when psoc is being created.
462  *
463  * Return: QDF_STATUS
464  */
465 static inline QDF_STATUS
466 wlan_mgmt_rx_reo_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc)
467 {
468 	return QDF_STATUS_SUCCESS;
469 }
470 
471 /**
472  * wlan_mgmt_rx_reo_psoc_obj_destroy_notification() - psoc destroy handler for
473  * management rx-reorder feature
474  * @psoc: pointer to psoc object
475  *
476  * This function gets called from object manager when psoc is being destroyed.
477  *
478  * Return: QDF_STATUS
479  */
480 static inline QDF_STATUS
481 wlan_mgmt_rx_reo_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc)
482 {
483 	return QDF_STATUS_SUCCESS;
484 }
485 
486 /**
487  * wlan_mgmt_rx_reo_attach() - Initializes the per pdev data structures related
488  * to management rx-reorder module
489  * @pdev: pointer to pdev object
490  *
491  * Return: QDF_STATUS
492  */
493 static inline QDF_STATUS
494 wlan_mgmt_rx_reo_attach(struct wlan_objmgr_pdev *pdev)
495 {
496 	return QDF_STATUS_SUCCESS;
497 }
498 
499 /**
500  * wlan_mgmt_rx_reo_detach() - Clears the per pdev data structures related to
501  * management rx-reorder module
502  * @pdev: pointer to pdev object
503  *
504  * Return: QDF_STATUS
505  */
506 static inline QDF_STATUS
507 wlan_mgmt_rx_reo_detach(struct wlan_objmgr_pdev *pdev)
508 {
509 	return QDF_STATUS_SUCCESS;
510 }
511 
512 /**
513  * wlan_mgmt_rx_reo_init() - Initializes the management rx-reorder module
514  *
515  * This function gets called from dispatcher init and initializes the management
516  * rx-reorder module.
517  *
518  * Return: QDF_STATUS
519  */
520 static inline QDF_STATUS
521 wlan_mgmt_rx_reo_init(void)
522 {
523 	return QDF_STATUS_SUCCESS;
524 }
525 
526 /**
527  * wlan_mgmt_rx_reo_deinit() - De initializes the management rx-reorder module
528  *
529  * This function gets called from dispatcher deinit and de initializes the
530  * management rx-reorder module.
531  *
532  * Return: QDF_STATUS
533  */
534 static inline QDF_STATUS
535 wlan_mgmt_rx_reo_deinit(void)
536 {
537 	return QDF_STATUS_SUCCESS;
538 }
539 #endif /* WLAN_MGMT_RX_REO_SUPPORT */
540 #endif /* _WLAN_MGMT_TXRX_RX_REO_UTILS_API_H_ */
541