1 /*
2  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /**
18  *  DOC: wlan_mgmt_txrx_rx_reo_utils_api.c
19  *  This file contains mgmt rx re-ordering related public function definitions
20  */
21 
22 #include <wlan_mgmt_txrx_rx_reo_utils_api.h>
23 #include "../../core/src/wlan_mgmt_txrx_rx_reo_i.h"
24 #include <cfg_ucfg_api.h>
25 
26 QDF_STATUS
27 wlan_mgmt_rx_reo_deinit(void)
28 {
29 	return mgmt_rx_reo_deinit_context();
30 }
31 
32 QDF_STATUS
33 wlan_mgmt_rx_reo_init(void)
34 {
35 	return mgmt_rx_reo_init_context();
36 }
37 
38 #ifndef WLAN_MGMT_RX_REO_SIM_SUPPORT
39 QDF_STATUS wlan_mgmt_txrx_process_rx_frame(
40 			struct wlan_objmgr_pdev *pdev,
41 			qdf_nbuf_t buf,
42 			struct mgmt_rx_event_params *mgmt_rx_params)
43 {
44 	return tgt_mgmt_txrx_process_rx_frame(pdev, buf, mgmt_rx_params);
45 }
46 
47 QDF_STATUS
48 wlan_mgmt_rx_reo_get_snapshot_address(
49 			struct wlan_objmgr_pdev *pdev,
50 			enum mgmt_rx_reo_shared_snapshot_id id,
51 			struct mgmt_rx_reo_snapshot **address)
52 {
53 	return tgt_mgmt_rx_reo_get_snapshot_address(pdev, id, address);
54 }
55 
56 /**
57  * wlan_get_mlo_link_id_from_pdev() - Helper API to get the MLO HW link id
58  * from the pdev object.
59  * @pdev: Pointer to pdev object
60  *
61  * Return: On success returns the MLO HW link id corresponding to the pdev
62  * object. On failure returns -1.
63  */
64 int8_t
65 wlan_get_mlo_link_id_from_pdev(struct wlan_objmgr_pdev *pdev)
66 {
67 	return -EINVAL;
68 }
69 
70 qdf_export_symbol(wlan_get_mlo_link_id_from_pdev);
71 
72 /**
73  * wlan_get_pdev_from_mlo_link_id() - Helper API to get the pdev
74  * object from the MLO HW link id.
75  * @mlo_link_id: MLO HW link id
76  *
77  * Return: On success returns the pdev object from the MLO HW link_id.
78  * On failure returns NULL.
79  */
80 struct wlan_objmgr_pdev *
81 wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id)
82 {
83 	return NULL;
84 }
85 
86 qdf_export_symbol(wlan_get_pdev_from_mlo_link_id);
87 #else
88 QDF_STATUS wlan_mgmt_txrx_process_rx_frame(
89 			struct wlan_objmgr_pdev *pdev,
90 			qdf_nbuf_t buf,
91 			struct mgmt_rx_event_params *mgmt_rx_params)
92 {
93 	QDF_STATUS status;
94 
95 	/* Call the legacy handler to actually process and deliver frames */
96 	status = mgmt_rx_reo_sim_process_rx_frame(pdev, buf, mgmt_rx_params);
97 
98 	/**
99 	 * Free up the mgmt rx params.
100 	 * nbuf shouldn't be freed here as it is taken care by
101 	 * rx_frame_legacy_handler.
102 	 */
103 	free_mgmt_rx_event_params(mgmt_rx_params);
104 
105 	return status;
106 }
107 
108 QDF_STATUS
109 wlan_mgmt_rx_reo_get_snapshot_address(
110 			struct wlan_objmgr_pdev *pdev,
111 			enum mgmt_rx_reo_shared_snapshot_id id,
112 			struct mgmt_rx_reo_snapshot **address)
113 {
114 	return mgmt_rx_reo_sim_get_snapshot_address(pdev, id, address);
115 }
116 
117 /**
118  * wlan_get_mlo_link_id_from_pdev() - Helper API to get the MLO HW link id
119  * from the pdev object.
120  * @pdev: Pointer to pdev object
121  *
122  * Return: On success returns the MLO HW link id corresponding to the pdev
123  * object. On failure returns -1.
124  */
125 int8_t
126 wlan_get_mlo_link_id_from_pdev(struct wlan_objmgr_pdev *pdev)
127 {
128 	return mgmt_rx_reo_sim_get_mlo_link_id_from_pdev(pdev);
129 }
130 
131 qdf_export_symbol(wlan_get_mlo_link_id_from_pdev);
132 
133 /**
134  * wlan_get_pdev_from_mlo_link_id() - Helper API to get the pdev
135  * object from the MLO HW link id.
136  * @mlo_link_id: MLO HW link id
137  *
138  * Return: On success returns the pdev object from the MLO HW link_id.
139  * On failure returns NULL.
140  */
141 struct wlan_objmgr_pdev *
142 wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id)
143 {
144 	return mgmt_rx_reo_sim_get_pdev_from_mlo_link_id(mlo_link_id);
145 }
146 
147 qdf_export_symbol(wlan_get_pdev_from_mlo_link_id);
148 #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
149 
150 QDF_STATUS
151 wlan_mgmt_rx_reo_pdev_obj_create_notification(
152 			struct wlan_objmgr_pdev *pdev,
153 			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
154 {
155 	return mgmt_rx_reo_pdev_obj_create_notification(pdev,
156 							mgmt_txrx_pdev_ctx);
157 }
158 
159 QDF_STATUS
160 wlan_mgmt_rx_reo_pdev_obj_destroy_notification(
161 			struct wlan_objmgr_pdev *pdev,
162 			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
163 {
164 	return mgmt_rx_reo_pdev_obj_destroy_notification(pdev,
165 							 mgmt_txrx_pdev_ctx);
166 }
167 
168 #ifndef WLAN_MGMT_RX_REO_SIM_SUPPORT
169 bool
170 wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc *psoc)
171 {
172 	if (!psoc) {
173 		mgmt_rx_reo_err("psoc is NULL!");
174 		return false;
175 	}
176 
177 	if (!cfg_get(psoc, CFG_MGMT_RX_REO_ENABLE))
178 		return false;
179 
180 	return wlan_psoc_nif_feat_cap_get(psoc, WLAN_SOC_F_MGMT_RX_REO_CAPABLE);
181 }
182 
183 bool
184 wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev)
185 {
186 	if (!pdev) {
187 		mgmt_rx_reo_err("pdev is NULL!");
188 		return false;
189 	}
190 
191 	return wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(
192 			wlan_pdev_get_psoc(pdev));
193 }
194 #else
195 bool
196 wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc *psoc)
197 {
198 	return true;
199 }
200 
201 bool
202 wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev)
203 {
204 	return true;
205 }
206 #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
207 
208 QDF_STATUS
209 wlan_mgmt_rx_reo_sim_start(void)
210 {
211 	return mgmt_rx_reo_sim_start();
212 }
213 
214 qdf_export_symbol(wlan_mgmt_rx_reo_sim_start);
215 
216 QDF_STATUS
217 wlan_mgmt_rx_reo_sim_stop(void)
218 {
219 	return mgmt_rx_reo_sim_stop();
220 }
221 
222 qdf_export_symbol(wlan_mgmt_rx_reo_sim_stop);
223