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 <wlan_mgmt_txrx_rx_reo_tgt_api.h> 24 #include "../../core/src/wlan_mgmt_txrx_rx_reo_i.h" 25 #include "../../core/src/wlan_mgmt_txrx_main_i.h" 26 27 struct mgmt_rx_reo_pdev_info * 28 wlan_mgmt_rx_reo_get_priv_object(struct wlan_objmgr_pdev *pdev) 29 { 30 struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx; 31 32 if (!pdev) { 33 mgmt_rx_reo_err("pdev is null"); 34 return NULL; 35 } 36 37 mgmt_txrx_pdev_ctx = (struct mgmt_txrx_priv_pdev_context *) 38 wlan_objmgr_pdev_get_comp_private_obj(pdev, 39 WLAN_UMAC_COMP_MGMT_TXRX); 40 41 if (!mgmt_txrx_pdev_ctx) { 42 mgmt_rx_reo_err("mgmt txrx context is NULL"); 43 return NULL; 44 } 45 46 return mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx; 47 } 48 49 QDF_STATUS 50 wlan_mgmt_rx_reo_set_priv_object(struct wlan_objmgr_pdev *pdev, 51 struct mgmt_rx_reo_pdev_info *reo_pdev_context) 52 { 53 struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx; 54 55 if (!pdev) { 56 mgmt_rx_reo_err("pdev is null"); 57 return QDF_STATUS_E_NULL_VALUE; 58 } 59 60 mgmt_txrx_pdev_ctx = (struct mgmt_txrx_priv_pdev_context *) 61 wlan_objmgr_pdev_get_comp_private_obj(pdev, 62 WLAN_UMAC_COMP_MGMT_TXRX); 63 64 if (!mgmt_txrx_pdev_ctx) { 65 mgmt_rx_reo_err("mgmt txrx context is NULL"); 66 return QDF_STATUS_E_NULL_VALUE; 67 } 68 69 mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = reo_pdev_context; 70 71 return QDF_STATUS_SUCCESS; 72 } 73 74 /** 75 * wlan_mgmt_rx_reo_initialize_snapshot_params() - Initialize a given snapshot 76 * params object 77 * @snapshot_params: Pointer to snapshot params object 78 * 79 * Return: void 80 */ 81 static void 82 wlan_mgmt_rx_reo_initialize_snapshot_params( 83 struct mgmt_rx_reo_snapshot_params *snapshot_params) 84 { 85 snapshot_params->valid = false; 86 snapshot_params->mgmt_pkt_ctr = 0; 87 snapshot_params->global_timestamp = 0; 88 } 89 90 QDF_STATUS 91 wlan_mgmt_rx_reo_pdev_obj_create_notification( 92 struct wlan_objmgr_pdev *pdev, 93 struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx) 94 { 95 QDF_STATUS status; 96 QDF_STATUS temp_status; 97 struct mgmt_rx_reo_pdev_info *mgmt_rx_reo_pdev_ctx = NULL; 98 enum mgmt_rx_reo_shared_snapshot_id snapshot_id; 99 100 if (!pdev) { 101 mgmt_rx_reo_err("pdev is null"); 102 status = QDF_STATUS_E_NULL_VALUE; 103 goto failure; 104 } 105 106 mgmt_rx_reo_pdev_ctx = qdf_mem_malloc(sizeof(*mgmt_rx_reo_pdev_ctx)); 107 if (!mgmt_rx_reo_pdev_ctx) { 108 mgmt_rx_reo_err("Allocation failure for REO pdev context"); 109 status = QDF_STATUS_E_NOMEM; 110 goto failure; 111 } 112 113 snapshot_id = 0; 114 while (snapshot_id < MGMT_RX_REO_SHARED_SNAPSHOT_MAX) { 115 struct mgmt_rx_reo_snapshot **snapshot_address; 116 117 snapshot_address = &mgmt_rx_reo_pdev_ctx-> 118 host_target_shared_snapshot[snapshot_id]; 119 temp_status = tgt_mgmt_rx_reo_get_snapshot_address( 120 pdev, snapshot_id, snapshot_address); 121 if (QDF_IS_STATUS_ERROR(temp_status)) { 122 mgmt_rx_reo_err("Get snapshot address failed, id = %u", 123 snapshot_id); 124 status = temp_status; 125 goto failure; 126 } 127 128 wlan_mgmt_rx_reo_initialize_snapshot_params( 129 &mgmt_rx_reo_pdev_ctx-> 130 last_valid_shared_snapshot[snapshot_id]); 131 snapshot_id++; 132 } 133 134 /* Initialize Host snapshot params */ 135 wlan_mgmt_rx_reo_initialize_snapshot_params(&mgmt_rx_reo_pdev_ctx-> 136 host_snapshot); 137 138 mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = mgmt_rx_reo_pdev_ctx; 139 140 return QDF_STATUS_SUCCESS; 141 142 failure: 143 if (mgmt_rx_reo_pdev_ctx) 144 qdf_mem_free(mgmt_rx_reo_pdev_ctx); 145 146 mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = NULL; 147 148 return status; 149 } 150 151 QDF_STATUS 152 wlan_mgmt_rx_reo_pdev_obj_destroy_notification( 153 struct wlan_objmgr_pdev *pdev, 154 struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx) 155 { 156 qdf_mem_free(mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx); 157 mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = NULL; 158 159 return QDF_STATUS_SUCCESS; 160 } 161 162 QDF_STATUS 163 wlan_mgmt_rx_reo_deinit(void) 164 { 165 return mgmt_rx_reo_deinit_context(); 166 } 167 168 QDF_STATUS 169 wlan_mgmt_rx_reo_init(void) 170 { 171 return mgmt_rx_reo_init_context(); 172 } 173