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