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 /**
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 
31 QDF_STATUS
32 wlan_mgmt_rx_reo_deinit(void)
33 {
34 	return mgmt_rx_reo_deinit_context();
35 }
36 
37 QDF_STATUS
38 wlan_mgmt_rx_reo_init(void)
39 {
40 	return mgmt_rx_reo_init_context();
41 }
42 
43 #ifndef WLAN_MGMT_RX_REO_SIM_SUPPORT
44 QDF_STATUS wlan_mgmt_txrx_process_rx_frame(
45 			struct wlan_objmgr_pdev *pdev,
46 			qdf_nbuf_t buf,
47 			struct mgmt_rx_event_params *mgmt_rx_params)
48 {
49 	return tgt_mgmt_txrx_process_rx_frame(pdev, buf, mgmt_rx_params);
50 }
51 
52 QDF_STATUS
53 wlan_mgmt_rx_reo_get_snapshot_info
54 			(struct wlan_objmgr_pdev *pdev,
55 			 enum mgmt_rx_reo_shared_snapshot_id id,
56 			 struct mgmt_rx_reo_snapshot_info *snapshot_info)
57 {
58 	return tgt_mgmt_rx_reo_get_snapshot_info(pdev, id, snapshot_info);
59 }
60 
61 /**
62  * wlan_get_mlo_link_id_from_pdev() - Helper API to get the MLO HW link id
63  * from the pdev object.
64  * @pdev: Pointer to pdev object
65  *
66  * Return: On success returns the MLO HW link id corresponding to the pdev
67  * object. On failure returns -EINVAL
68  */
69 int8_t
70 wlan_get_mlo_link_id_from_pdev(struct wlan_objmgr_pdev *pdev)
71 {
72 	uint16_t hw_link_id;
73 
74 	hw_link_id = wlan_mlo_get_pdev_hw_link_id(pdev);
75 
76 	if (hw_link_id == INVALID_HW_LINK_ID) {
77 		mgmt_rx_reo_err("Invalid HW link id for the pdev");
78 		return -EINVAL;
79 	}
80 
81 	return hw_link_id;
82 }
83 
84 qdf_export_symbol(wlan_get_mlo_link_id_from_pdev);
85 
86 /**
87  * wlan_get_pdev_from_mlo_link_id() - Helper API to get the pdev
88  * object from the MLO HW link id.
89  * @mlo_link_id: MLO HW link id
90  * @refdbgid: Reference debug id
91  *
92  * Return: On success returns the pdev object from the MLO HW link_id.
93  * On failure returns NULL.
94  */
95 struct wlan_objmgr_pdev *
96 wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id,
97 			       wlan_objmgr_ref_dbgid refdbgid)
98 {
99 	return wlan_mlo_get_pdev_by_hw_link_id(mlo_link_id, refdbgid);
100 }
101 
102 qdf_export_symbol(wlan_get_pdev_from_mlo_link_id);
103 #else
104 QDF_STATUS wlan_mgmt_txrx_process_rx_frame(
105 			struct wlan_objmgr_pdev *pdev,
106 			qdf_nbuf_t buf,
107 			struct mgmt_rx_event_params *mgmt_rx_params)
108 {
109 	QDF_STATUS status;
110 
111 	/* Call the legacy handler to actually process and deliver frames */
112 	status = mgmt_rx_reo_sim_process_rx_frame(pdev, buf, mgmt_rx_params);
113 
114 	/**
115 	 * Free up the mgmt rx params.
116 	 * nbuf shouldn't be freed here as it is taken care by
117 	 * rx_frame_legacy_handler.
118 	 */
119 	free_mgmt_rx_event_params(mgmt_rx_params);
120 
121 	return status;
122 }
123 
124 QDF_STATUS
125 wlan_mgmt_rx_reo_get_snapshot_info
126 			(struct wlan_objmgr_pdev *pdev,
127 			 enum mgmt_rx_reo_shared_snapshot_id id,
128 			 struct mgmt_rx_reo_snapshot_info *snapshot_info)
129 {
130 	return mgmt_rx_reo_sim_get_snapshot_info(pdev, id, snapshot_info);
131 }
132 
133 /**
134  * wlan_get_mlo_link_id_from_pdev() - Helper API to get the MLO HW link id
135  * from the pdev object.
136  * @pdev: Pointer to pdev object
137  *
138  * Return: On success returns the MLO HW link id corresponding to the pdev
139  * object. On failure returns -1.
140  */
141 int8_t
142 wlan_get_mlo_link_id_from_pdev(struct wlan_objmgr_pdev *pdev)
143 {
144 	return mgmt_rx_reo_sim_get_mlo_link_id_from_pdev(pdev);
145 }
146 
147 qdf_export_symbol(wlan_get_mlo_link_id_from_pdev);
148 
149 /**
150  * wlan_get_pdev_from_mlo_link_id() - Helper API to get the pdev
151  * object from the MLO HW link id.
152  * @mlo_link_id: MLO HW link id
153  * @refdbgid: Reference debug id
154  *
155  * Return: On success returns the pdev object from the MLO HW link_id.
156  * On failure returns NULL.
157  */
158 struct wlan_objmgr_pdev *
159 wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id,
160 			       wlan_objmgr_ref_dbgid refdbgid)
161 {
162 	return mgmt_rx_reo_sim_get_pdev_from_mlo_link_id(mlo_link_id, refdbgid);
163 }
164 
165 qdf_export_symbol(wlan_get_pdev_from_mlo_link_id);
166 #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
167 
168 QDF_STATUS
169 wlan_mgmt_rx_reo_validate_mlo_link_info(struct wlan_objmgr_psoc *psoc)
170 {
171 	return mgmt_rx_reo_validate_mlo_link_info(psoc);
172 }
173 
174 QDF_STATUS
175 wlan_mgmt_rx_reo_pdev_obj_create_notification(
176 			struct wlan_objmgr_pdev *pdev,
177 			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
178 {
179 	return mgmt_rx_reo_pdev_obj_create_notification(pdev,
180 							mgmt_txrx_pdev_ctx);
181 }
182 
183 QDF_STATUS
184 wlan_mgmt_rx_reo_pdev_obj_destroy_notification(
185 			struct wlan_objmgr_pdev *pdev,
186 			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
187 {
188 	return mgmt_rx_reo_pdev_obj_destroy_notification(pdev,
189 							 mgmt_txrx_pdev_ctx);
190 }
191 
192 QDF_STATUS
193 wlan_mgmt_rx_reo_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc)
194 {
195 	return mgmt_rx_reo_psoc_obj_create_notification(psoc);
196 }
197 
198 QDF_STATUS
199 wlan_mgmt_rx_reo_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc)
200 {
201 	return mgmt_rx_reo_psoc_obj_destroy_notification(psoc);
202 }
203 
204 QDF_STATUS
205 wlan_mgmt_rx_reo_attach(struct wlan_objmgr_pdev *pdev)
206 {
207 	return mgmt_rx_reo_attach(pdev);
208 }
209 
210 qdf_export_symbol(wlan_mgmt_rx_reo_attach);
211 
212 QDF_STATUS
213 wlan_mgmt_rx_reo_detach(struct wlan_objmgr_pdev *pdev)
214 {
215 	return mgmt_rx_reo_detach(pdev);
216 }
217 
218 qdf_export_symbol(wlan_mgmt_rx_reo_detach);
219 
220 uint16_t
221 wlan_mgmt_rx_reo_get_pkt_ctr_delta_thresh(struct wlan_objmgr_psoc *psoc)
222 {
223 	return cfg_get(psoc, CFG_MGMT_RX_REO_PKT_CTR_DELTA_THRESH);
224 }
225 
226 uint16_t
227 wlan_mgmt_rx_reo_get_ingress_frame_debug_list_size(struct wlan_objmgr_psoc *psoc)
228 {
229 	if (!psoc) {
230 		mgmt_rx_reo_err("psoc is NULL!");
231 		return 0;
232 	}
233 
234 	return cfg_get(psoc, CFG_MGMT_RX_REO_INGRESS_FRAME_DEBUG_LIST_SIZE);
235 }
236 
237 uint16_t
238 wlan_mgmt_rx_reo_get_egress_frame_debug_list_size(struct wlan_objmgr_psoc *psoc)
239 {
240 	if (!psoc) {
241 		mgmt_rx_reo_err("psoc is NULL!");
242 		return 0;
243 	}
244 
245 	return cfg_get(psoc, CFG_MGMT_RX_REO_EGRESS_FRAME_DEBUG_LIST_SIZE);
246 }
247 
248 #ifndef WLAN_MGMT_RX_REO_SIM_SUPPORT
249 bool
250 wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc *psoc)
251 {
252 	if (!psoc) {
253 		mgmt_rx_reo_err("psoc is NULL!");
254 		return false;
255 	}
256 
257 	if (!cfg_get(psoc, CFG_MGMT_RX_REO_ENABLE))
258 		return false;
259 
260 	return wlan_psoc_nif_feat_cap_get(psoc, WLAN_SOC_F_MGMT_RX_REO_CAPABLE);
261 }
262 
263 qdf_export_symbol(wlan_mgmt_rx_reo_is_feature_enabled_at_psoc);
264 
265 bool
266 wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev)
267 {
268 	if (!pdev) {
269 		mgmt_rx_reo_err("pdev is NULL!");
270 		return false;
271 	}
272 
273 	return wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(
274 			wlan_pdev_get_psoc(pdev));
275 }
276 
277 qdf_export_symbol(wlan_mgmt_rx_reo_is_feature_enabled_at_pdev);
278 #else
279 bool
280 wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc *psoc)
281 {
282 	return true;
283 }
284 
285 qdf_export_symbol(wlan_mgmt_rx_reo_is_feature_enabled_at_psoc);
286 
287 bool
288 wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev)
289 {
290 	return true;
291 }
292 
293 QDF_STATUS
294 wlan_mgmt_rx_reo_sim_start(void)
295 {
296 	return mgmt_rx_reo_sim_start();
297 }
298 
299 qdf_export_symbol(wlan_mgmt_rx_reo_sim_start);
300 
301 QDF_STATUS
302 wlan_mgmt_rx_reo_sim_stop(void)
303 {
304 	return mgmt_rx_reo_sim_stop();
305 }
306 
307 qdf_export_symbol(wlan_mgmt_rx_reo_sim_stop);
308 #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
309 
310 bool
311 wlan_mgmt_rx_reo_is_simulation_in_progress(void)
312 {
313 	return mgmt_rx_reo_is_simulation_in_progress();
314 }
315 
316 QDF_STATUS
317 wlan_mgmt_rx_reo_print_ingress_frame_stats(void)
318 {
319 	return mgmt_rx_reo_print_ingress_frame_stats();
320 }
321 
322 QDF_STATUS
323 wlan_mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames)
324 {
325 	return mgmt_rx_reo_print_ingress_frame_info(num_frames);
326 }
327 
328 QDF_STATUS
329 wlan_mgmt_rx_reo_print_egress_frame_stats(void)
330 {
331 	return mgmt_rx_reo_print_egress_frame_stats();
332 }
333 
334 QDF_STATUS
335 wlan_mgmt_rx_reo_print_egress_frame_info(uint16_t num_frames)
336 {
337 	return mgmt_rx_reo_print_egress_frame_info(num_frames);
338 }
339