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