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_attach(struct wlan_objmgr_pdev *pdev)
194 {
195 	return mgmt_rx_reo_attach(pdev);
196 }
197 
198 qdf_export_symbol(wlan_mgmt_rx_reo_attach);
199 
200 QDF_STATUS
201 wlan_mgmt_rx_reo_detach(struct wlan_objmgr_pdev *pdev)
202 {
203 	return mgmt_rx_reo_detach(pdev);
204 }
205 
206 qdf_export_symbol(wlan_mgmt_rx_reo_detach);
207 
208 uint16_t
209 wlan_mgmt_rx_reo_get_pkt_ctr_delta_thresh(struct wlan_objmgr_psoc *psoc)
210 {
211 	return cfg_get(psoc, CFG_MGMT_RX_REO_PKT_CTR_DELTA_THRESH);
212 }
213 
214 #ifndef WLAN_MGMT_RX_REO_SIM_SUPPORT
215 bool
216 wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc *psoc)
217 {
218 	if (!psoc) {
219 		mgmt_rx_reo_err("psoc is NULL!");
220 		return false;
221 	}
222 
223 	if (!cfg_get(psoc, CFG_MGMT_RX_REO_ENABLE))
224 		return false;
225 
226 	return wlan_psoc_nif_feat_cap_get(psoc, WLAN_SOC_F_MGMT_RX_REO_CAPABLE);
227 }
228 
229 qdf_export_symbol(wlan_mgmt_rx_reo_is_feature_enabled_at_psoc);
230 
231 bool
232 wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev)
233 {
234 	if (!pdev) {
235 		mgmt_rx_reo_err("pdev is NULL!");
236 		return false;
237 	}
238 
239 	return wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(
240 			wlan_pdev_get_psoc(pdev));
241 }
242 
243 qdf_export_symbol(wlan_mgmt_rx_reo_is_feature_enabled_at_pdev);
244 #else
245 bool
246 wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc *psoc)
247 {
248 	return true;
249 }
250 
251 qdf_export_symbol(wlan_mgmt_rx_reo_is_feature_enabled_at_psoc);
252 
253 bool
254 wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev)
255 {
256 	return true;
257 }
258 
259 QDF_STATUS
260 wlan_mgmt_rx_reo_sim_start(void)
261 {
262 	return mgmt_rx_reo_sim_start();
263 }
264 
265 qdf_export_symbol(wlan_mgmt_rx_reo_sim_start);
266 
267 QDF_STATUS
268 wlan_mgmt_rx_reo_sim_stop(void)
269 {
270 	return mgmt_rx_reo_sim_stop();
271 }
272 
273 qdf_export_symbol(wlan_mgmt_rx_reo_sim_stop);
274 #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
275 
276 bool
277 wlan_mgmt_rx_reo_is_simulation_in_progress(void)
278 {
279 	return mgmt_rx_reo_is_simulation_in_progress();
280 }
281 
282 QDF_STATUS
283 wlan_mgmt_rx_reo_print_ingress_frame_stats(void)
284 {
285 	return mgmt_rx_reo_print_ingress_frame_stats();
286 }
287 
288 QDF_STATUS
289 wlan_mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames)
290 {
291 	return mgmt_rx_reo_print_ingress_frame_info(num_frames);
292 }
293 
294 QDF_STATUS
295 wlan_mgmt_rx_reo_print_egress_frame_stats(void)
296 {
297 	return mgmt_rx_reo_print_egress_frame_stats();
298 }
299 
300 QDF_STATUS
301 wlan_mgmt_rx_reo_print_egress_frame_info(uint16_t num_frames)
302 {
303 	return mgmt_rx_reo_print_egress_frame_info(num_frames);
304 }
305