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