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  /**
19   *  DOC: wlan_mgmt_txrx_rx_reo_utils_api.c
20   *  This file contains mgmt rx re-ordering related public function definitions
21   */
22  
23  #include <wlan_mgmt_txrx_rx_reo_utils_api.h>
24  #include <wlan_mgmt_txrx_rx_reo_tgt_api.h>
25  #include "../../core/src/wlan_mgmt_txrx_rx_reo_i.h"
26  #include <cfg_ucfg_api.h>
27  #include <wlan_mgmt_txrx_tgt_api.h>
28  #include<wlan_mgmt_txrx_rx_reo_tgt_api.h>
29  #include <wlan_mlo_mgr_cmn.h>
30  #include <wlan_mlo_mgr_setup.h>
31  
32  QDF_STATUS
wlan_mgmt_rx_reo_deinit(void)33  wlan_mgmt_rx_reo_deinit(void)
34  {
35  	uint8_t ml_grp;
36  	uint8_t total_mlo_grps = WLAN_MAX_MLO_GROUPS;
37  
38  	if (total_mlo_grps > WLAN_MAX_MLO_GROUPS)
39  		return QDF_STATUS_E_INVAL;
40  
41  	for (ml_grp = 0; ml_grp < total_mlo_grps; ml_grp++) {
42  		QDF_STATUS status;
43  
44  		status = mgmt_rx_reo_deinit_context(ml_grp);
45  		if (QDF_IS_STATUS_ERROR(status)) {
46  			mgmt_rx_reo_err("Reo context deinit failed for grp %u",
47  					ml_grp);
48  			return status;
49  		}
50  	}
51  
52  	return QDF_STATUS_SUCCESS;
53  }
54  
55  QDF_STATUS
wlan_mgmt_rx_reo_init(void)56  wlan_mgmt_rx_reo_init(void)
57  {
58  	uint8_t ml_grp;
59  	uint8_t total_mlo_grps = WLAN_MAX_MLO_GROUPS;
60  
61  	if (total_mlo_grps > WLAN_MAX_MLO_GROUPS)
62  		return QDF_STATUS_E_INVAL;
63  
64  	for (ml_grp = 0; ml_grp < total_mlo_grps; ml_grp++) {
65  		QDF_STATUS status;
66  
67  		status = mgmt_rx_reo_init_context(ml_grp);
68  		if (QDF_IS_STATUS_ERROR(status)) {
69  			mgmt_rx_reo_err("Reo context init failed for grp %u",
70  					ml_grp);
71  			return status;
72  		}
73  	}
74  
75  	return QDF_STATUS_SUCCESS;
76  }
77  
78  #ifndef WLAN_MGMT_RX_REO_SIM_SUPPORT
wlan_mgmt_txrx_process_rx_frame(struct wlan_objmgr_pdev * pdev,qdf_nbuf_t buf,struct mgmt_rx_event_params * mgmt_rx_params)79  QDF_STATUS wlan_mgmt_txrx_process_rx_frame(
80  			struct wlan_objmgr_pdev *pdev,
81  			qdf_nbuf_t buf,
82  			struct mgmt_rx_event_params *mgmt_rx_params)
83  {
84  	return tgt_mgmt_txrx_process_rx_frame(pdev, buf, mgmt_rx_params);
85  }
86  
87  QDF_STATUS
wlan_mgmt_rx_reo_get_snapshot_info(struct wlan_objmgr_pdev * pdev,enum mgmt_rx_reo_shared_snapshot_id id,struct mgmt_rx_reo_snapshot_info * snapshot_info)88  wlan_mgmt_rx_reo_get_snapshot_info
89  			(struct wlan_objmgr_pdev *pdev,
90  			 enum mgmt_rx_reo_shared_snapshot_id id,
91  			 struct mgmt_rx_reo_snapshot_info *snapshot_info)
92  {
93  	return tgt_mgmt_rx_reo_get_snapshot_info(pdev, id, snapshot_info);
94  }
95  
96  /**
97   * wlan_get_mlo_link_id_from_pdev() - Helper API to get the MLO HW link id
98   * from the pdev object.
99   * @pdev: Pointer to pdev object
100   *
101   * Return: On success returns the MLO HW link id corresponding to the pdev
102   * object. On failure returns -EINVAL
103   */
104  int8_t
wlan_get_mlo_link_id_from_pdev(struct wlan_objmgr_pdev * pdev)105  wlan_get_mlo_link_id_from_pdev(struct wlan_objmgr_pdev *pdev)
106  {
107  	uint16_t hw_link_id;
108  
109  	hw_link_id = wlan_mlo_get_pdev_hw_link_id(pdev);
110  
111  	if (hw_link_id == INVALID_HW_LINK_ID) {
112  		mgmt_rx_reo_err("Invalid HW link id for the pdev");
113  		return -EINVAL;
114  	}
115  
116  	return hw_link_id;
117  }
118  
119  qdf_export_symbol(wlan_get_mlo_link_id_from_pdev);
120  
121  int8_t
wlan_get_mlo_grp_id_from_pdev(struct wlan_objmgr_pdev * pdev)122  wlan_get_mlo_grp_id_from_pdev(struct wlan_objmgr_pdev *pdev)
123  {
124  	uint8_t ml_grp_id;
125  	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
126  
127  	if (!psoc) {
128  		mgmt_rx_reo_err("PSOC is NUll");
129  		return -EINVAL;
130  	}
131  
132  	ml_grp_id = wlan_mlo_get_psoc_group_id(psoc);
133  
134  	if (ml_grp_id >= WLAN_MAX_MLO_GROUPS) {
135  		mgmt_rx_reo_debug("Invalid MLO Group ID for the pdev");
136  		return -EINVAL;
137  	}
138  
139  	return ml_grp_id;
140  }
141  
142  qdf_export_symbol(wlan_get_mlo_grp_id_from_pdev);
143  
144  /**
145   * wlan_get_pdev_from_mlo_link_id() - Helper API to get the pdev
146   * object from the MLO HW link id.
147   * @mlo_link_id: MLO HW link id
148   * @ml_grp_id: MLO Group id which it belongs to
149   * @refdbgid: Reference debug id
150   *
151   * Return: On success returns the pdev object from the MLO HW link_id.
152   * On failure returns NULL.
153   */
154  struct wlan_objmgr_pdev *
wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id,uint8_t ml_grp_id,wlan_objmgr_ref_dbgid refdbgid)155  wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id, uint8_t ml_grp_id,
156  			       wlan_objmgr_ref_dbgid refdbgid)
157  {
158  	return wlan_mlo_get_pdev_by_hw_link_id(
159  			mlo_link_id, ml_grp_id, refdbgid);
160  }
161  
162  qdf_export_symbol(wlan_get_pdev_from_mlo_link_id);
163  #else
wlan_mgmt_txrx_process_rx_frame(struct wlan_objmgr_pdev * pdev,qdf_nbuf_t buf,struct mgmt_rx_event_params * mgmt_rx_params)164  QDF_STATUS wlan_mgmt_txrx_process_rx_frame(
165  			struct wlan_objmgr_pdev *pdev,
166  			qdf_nbuf_t buf,
167  			struct mgmt_rx_event_params *mgmt_rx_params)
168  {
169  	QDF_STATUS status;
170  
171  	/* Call the legacy handler to actually process and deliver frames */
172  	status = mgmt_rx_reo_sim_process_rx_frame(pdev, buf, mgmt_rx_params);
173  
174  	/**
175  	 * Free up the mgmt rx params.
176  	 * nbuf shouldn't be freed here as it is taken care by
177  	 * rx_frame_legacy_handler.
178  	 */
179  	free_mgmt_rx_event_params(mgmt_rx_params);
180  
181  	return status;
182  }
183  
184  QDF_STATUS
wlan_mgmt_rx_reo_get_snapshot_info(struct wlan_objmgr_pdev * pdev,enum mgmt_rx_reo_shared_snapshot_id id,struct mgmt_rx_reo_snapshot_info * snapshot_info)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  	QDF_STATUS status;
191  
192  	status = mgmt_rx_reo_sim_get_snapshot_address(pdev, id,
193  						      &snapshot_info->address);
194  	if (QDF_IS_STATUS_ERROR(status)) {
195  		mgmt_rx_reo_err("Failed to get snapshot address for ID = %d",
196  				id);
197  		return status;
198  	}
199  
200  	snapshot_info->version = 1;
201  
202  	return QDF_STATUS_SUCCESS;
203  }
204  
205  /**
206   * wlan_get_mlo_link_id_from_pdev() - Helper API to get the MLO HW link id
207   * from the pdev object.
208   * @pdev: Pointer to pdev object
209   *
210   * Return: On success returns the MLO HW link id corresponding to the pdev
211   * object. On failure returns -1.
212   */
213  int8_t
wlan_get_mlo_link_id_from_pdev(struct wlan_objmgr_pdev * pdev)214  wlan_get_mlo_link_id_from_pdev(struct wlan_objmgr_pdev *pdev)
215  {
216  	return mgmt_rx_reo_sim_get_mlo_link_id_from_pdev(pdev);
217  }
218  
219  qdf_export_symbol(wlan_get_mlo_link_id_from_pdev);
220  
221  /**
222   * wlan_get_pdev_from_mlo_link_id() - Helper API to get the pdev
223   * object from the MLO HW link id.
224   * @mlo_link_id: MLO HW link id
225   * @ml_grp_id: MLO Group id which it belongs to
226   * @refdbgid: Reference debug id
227   *
228   * Return: On success returns the pdev object from the MLO HW link_id.
229   * On failure returns NULL.
230   */
231  struct wlan_objmgr_pdev *
wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id,uint8_t ml_grp_id,wlan_objmgr_ref_dbgid refdbgid)232  wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id, uint8_t ml_grp_id,
233  			       wlan_objmgr_ref_dbgid refdbgid)
234  {
235  	return mgmt_rx_reo_sim_get_pdev_from_mlo_link_id(
236  			mlo_link_id, ml_grp_id, refdbgid);
237  }
238  
239  qdf_export_symbol(wlan_get_pdev_from_mlo_link_id);
240  #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
241  
242  QDF_STATUS
wlan_mgmt_rx_reo_validate_mlo_link_info(struct wlan_objmgr_psoc * psoc)243  wlan_mgmt_rx_reo_validate_mlo_link_info(struct wlan_objmgr_psoc *psoc)
244  {
245  	return mgmt_rx_reo_validate_mlo_link_info(psoc);
246  }
247  
248  QDF_STATUS
wlan_mgmt_rx_reo_pdev_obj_create_notification(struct wlan_objmgr_pdev * pdev,struct mgmt_txrx_priv_pdev_context * mgmt_txrx_pdev_ctx)249  wlan_mgmt_rx_reo_pdev_obj_create_notification(
250  			struct wlan_objmgr_pdev *pdev,
251  			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
252  {
253  	return mgmt_rx_reo_pdev_obj_create_notification(pdev,
254  							mgmt_txrx_pdev_ctx);
255  }
256  
257  QDF_STATUS
wlan_mgmt_rx_reo_pdev_obj_destroy_notification(struct wlan_objmgr_pdev * pdev,struct mgmt_txrx_priv_pdev_context * mgmt_txrx_pdev_ctx)258  wlan_mgmt_rx_reo_pdev_obj_destroy_notification(
259  			struct wlan_objmgr_pdev *pdev,
260  			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
261  {
262  	return mgmt_rx_reo_pdev_obj_destroy_notification(pdev,
263  							 mgmt_txrx_pdev_ctx);
264  }
265  
266  QDF_STATUS
wlan_mgmt_rx_reo_psoc_obj_create_notification(struct wlan_objmgr_psoc * psoc)267  wlan_mgmt_rx_reo_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc)
268  {
269  	return mgmt_rx_reo_psoc_obj_create_notification(psoc);
270  }
271  
272  QDF_STATUS
wlan_mgmt_rx_reo_psoc_obj_destroy_notification(struct wlan_objmgr_psoc * psoc)273  wlan_mgmt_rx_reo_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc)
274  {
275  	return mgmt_rx_reo_psoc_obj_destroy_notification(psoc);
276  }
277  
278  QDF_STATUS
wlan_mgmt_rx_reo_pdev_attach(struct wlan_objmgr_pdev * pdev)279  wlan_mgmt_rx_reo_pdev_attach(struct wlan_objmgr_pdev *pdev)
280  {
281  	return mgmt_rx_reo_pdev_attach(pdev);
282  }
283  
284  qdf_export_symbol(wlan_mgmt_rx_reo_pdev_attach);
285  
286  QDF_STATUS
wlan_mgmt_rx_reo_psoc_attach(struct wlan_objmgr_psoc * psoc)287  wlan_mgmt_rx_reo_psoc_attach(struct wlan_objmgr_psoc *psoc)
288  {
289  	return mgmt_rx_reo_psoc_attach(psoc);
290  }
291  
292  qdf_export_symbol(wlan_mgmt_rx_reo_psoc_attach);
293  
294  QDF_STATUS
wlan_mgmt_rx_reo_pdev_detach(struct wlan_objmgr_pdev * pdev)295  wlan_mgmt_rx_reo_pdev_detach(struct wlan_objmgr_pdev *pdev)
296  {
297  	return mgmt_rx_reo_pdev_detach(pdev);
298  }
299  
300  qdf_export_symbol(wlan_mgmt_rx_reo_pdev_detach);
301  
302  QDF_STATUS
wlan_mgmt_rx_reo_psoc_detach(struct wlan_objmgr_psoc * psoc)303  wlan_mgmt_rx_reo_psoc_detach(struct wlan_objmgr_psoc *psoc)
304  {
305  	return mgmt_rx_reo_psoc_detach(psoc);
306  }
307  
308  qdf_export_symbol(wlan_mgmt_rx_reo_psoc_detach);
309  
310  uint16_t
wlan_mgmt_rx_reo_get_pkt_ctr_delta_thresh(struct wlan_objmgr_psoc * psoc)311  wlan_mgmt_rx_reo_get_pkt_ctr_delta_thresh(struct wlan_objmgr_psoc *psoc)
312  {
313  	return cfg_get(psoc, CFG_MGMT_RX_REO_PKT_CTR_DELTA_THRESH);
314  }
315  
316  #ifdef WLAN_MGMT_RX_REO_DEBUG_SUPPORT
317  uint16_t
wlan_mgmt_rx_reo_get_ingress_frame_debug_list_size(struct wlan_objmgr_psoc * psoc)318  wlan_mgmt_rx_reo_get_ingress_frame_debug_list_size(struct wlan_objmgr_psoc *psoc)
319  {
320  	if (!psoc) {
321  		mgmt_rx_reo_err("psoc is NULL!");
322  		return 0;
323  	}
324  
325  	return cfg_get(psoc, CFG_MGMT_RX_REO_INGRESS_FRAME_DEBUG_LIST_SIZE);
326  }
327  
328  uint16_t
wlan_mgmt_rx_reo_get_egress_frame_debug_list_size(struct wlan_objmgr_psoc * psoc)329  wlan_mgmt_rx_reo_get_egress_frame_debug_list_size(struct wlan_objmgr_psoc *psoc)
330  {
331  	if (!psoc) {
332  		mgmt_rx_reo_err("psoc is NULL!");
333  		return 0;
334  	}
335  
336  	return cfg_get(psoc, CFG_MGMT_RX_REO_EGRESS_FRAME_DEBUG_LIST_SIZE);
337  }
338  
339  uint16_t
wlan_mgmt_rx_reo_get_scheduler_debug_list_size(struct wlan_objmgr_psoc * psoc)340  wlan_mgmt_rx_reo_get_scheduler_debug_list_size(struct wlan_objmgr_psoc *psoc)
341  {
342  	if (!psoc) {
343  		mgmt_rx_reo_err("psoc is NULL!");
344  		return 0;
345  	}
346  
347  	return cfg_get(psoc, CFG_MGMT_RX_REO_SCHEDULER_DEBUG_LIST_SIZE);
348  }
349  #endif /* WLAN_MGMT_RX_REO_DEBUG_SUPPORT */
350  
351  #ifndef WLAN_MGMT_RX_REO_SIM_SUPPORT
352  bool
wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc * psoc)353  wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc *psoc)
354  {
355  	if (!psoc) {
356  		mgmt_rx_reo_err("psoc is NULL!");
357  		return false;
358  	}
359  
360  	if (!cfg_get(psoc, CFG_MGMT_RX_REO_ENABLE))
361  		return false;
362  
363  	return wlan_psoc_nif_feat_cap_get(psoc, WLAN_SOC_F_MGMT_RX_REO_CAPABLE);
364  }
365  
366  qdf_export_symbol(wlan_mgmt_rx_reo_is_feature_enabled_at_psoc);
367  
368  bool
wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev * pdev)369  wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev)
370  {
371  	if (!pdev) {
372  		mgmt_rx_reo_err("pdev is NULL!");
373  		return false;
374  	}
375  
376  	return wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(
377  			wlan_pdev_get_psoc(pdev));
378  }
379  
380  qdf_export_symbol(wlan_mgmt_rx_reo_is_feature_enabled_at_pdev);
381  
382  bool
wlan_mgmt_rx_reo_is_scheduler_enabled_at_psoc(struct wlan_objmgr_psoc * psoc)383  wlan_mgmt_rx_reo_is_scheduler_enabled_at_psoc(struct wlan_objmgr_psoc *psoc)
384  {
385  	if (!psoc) {
386  		mgmt_rx_reo_err("psoc is NULL!");
387  		return false;
388  	}
389  
390  	return cfg_get(psoc, CFG_MGMT_RX_REO_SCHEDULER_ENABLE);
391  }
392  
393  qdf_export_symbol(wlan_mgmt_rx_reo_is_scheduler_enabled_at_psoc);
394  
395  bool
wlan_mgmt_rx_reo_is_scheduler_enabled_at_pdev(struct wlan_objmgr_pdev * pdev)396  wlan_mgmt_rx_reo_is_scheduler_enabled_at_pdev(struct wlan_objmgr_pdev *pdev)
397  {
398  	struct wlan_objmgr_psoc *psoc;
399  
400  	if (!pdev) {
401  		mgmt_rx_reo_err("pdev is NULL!");
402  		return false;
403  	}
404  
405  	psoc = wlan_pdev_get_psoc(pdev);
406  	return wlan_mgmt_rx_reo_is_scheduler_enabled_at_psoc(psoc);
407  }
408  
409  qdf_export_symbol(wlan_mgmt_rx_reo_is_scheduler_enabled_at_pdev);
410  #else
411  bool
wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc * psoc)412  wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc *psoc)
413  {
414  	return true;
415  }
416  
417  qdf_export_symbol(wlan_mgmt_rx_reo_is_feature_enabled_at_psoc);
418  
419  bool
wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev * pdev)420  wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev)
421  {
422  	return true;
423  }
424  
425  qdf_export_symbol(wlan_mgmt_rx_reo_is_feature_enabled_at_pdev);
426  
427  QDF_STATUS
wlan_mgmt_rx_reo_sim_start(uint8_t ml_grp_id)428  wlan_mgmt_rx_reo_sim_start(uint8_t ml_grp_id)
429  {
430  	return mgmt_rx_reo_sim_start(ml_grp_id);
431  }
432  
433  qdf_export_symbol(wlan_mgmt_rx_reo_sim_start);
434  
435  QDF_STATUS
wlan_mgmt_rx_reo_sim_stop(uint8_t ml_grp_id)436  wlan_mgmt_rx_reo_sim_stop(uint8_t ml_grp_id)
437  {
438  	return mgmt_rx_reo_sim_stop(ml_grp_id);
439  }
440  
441  qdf_export_symbol(wlan_mgmt_rx_reo_sim_stop);
442  #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
443  
444  #ifdef WLAN_MLO_MULTI_CHIP
445  bool
wlan_mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id)446  wlan_mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id)
447  {
448  	return mgmt_rx_reo_is_simulation_in_progress(ml_grp_id);
449  }
450  
451  #else
452  bool
wlan_mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id)453  wlan_mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id)
454  {
455  	return false;
456  }
457  #endif
458  
459  QDF_STATUS
wlan_mgmt_rx_reo_print_ingress_frame_stats(uint8_t ml_grp_id)460  wlan_mgmt_rx_reo_print_ingress_frame_stats(uint8_t ml_grp_id)
461  {
462  	return mgmt_rx_reo_print_ingress_frame_stats(ml_grp_id);
463  }
464  
465  QDF_STATUS
wlan_mgmt_rx_reo_print_ingress_frame_info(uint8_t ml_grp_id,uint16_t num_frames)466  wlan_mgmt_rx_reo_print_ingress_frame_info(uint8_t ml_grp_id,
467  					  uint16_t num_frames)
468  {
469  	return mgmt_rx_reo_print_ingress_frame_info(ml_grp_id, num_frames);
470  }
471  
472  QDF_STATUS
wlan_mgmt_rx_reo_print_egress_frame_stats(uint8_t ml_grp_id)473  wlan_mgmt_rx_reo_print_egress_frame_stats(uint8_t ml_grp_id)
474  {
475  	return mgmt_rx_reo_print_egress_frame_stats(ml_grp_id);
476  }
477  
478  QDF_STATUS
wlan_mgmt_rx_reo_print_egress_frame_info(uint8_t ml_grp_id,uint16_t num_frames)479  wlan_mgmt_rx_reo_print_egress_frame_info(uint8_t ml_grp_id, uint16_t num_frames)
480  {
481  	return mgmt_rx_reo_print_egress_frame_info(ml_grp_id, num_frames);
482  }
483  
484  QDF_STATUS
wlan_mgmt_rx_reo_release_frames(uint8_t mlo_grp_id,uint32_t link_bitmap)485  wlan_mgmt_rx_reo_release_frames(uint8_t mlo_grp_id, uint32_t link_bitmap)
486  {
487  	return mgmt_rx_reo_release_frames(mlo_grp_id, link_bitmap);
488  }
489