1 /* 2 * Copyright (c) 2016-2018, 2020 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * 6 * Permission to use, copy, modify, and/or distribute this software for 7 * any purpose with or without fee is hereby granted, provided that the 8 * above copyright notice and this permission notice appear in all 9 * copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 12 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 13 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 14 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 15 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 16 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 17 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 18 * PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21 #ifndef _WLAN_LMAC_IF_API_H_ 22 #define _WLAN_LMAC_IF_API_H_ 23 24 #include "wlan_objmgr_cmn.h" 25 #include "wlan_objmgr_psoc_obj.h" 26 #include "wlan_objmgr_pdev_obj.h" 27 28 /** 29 * wlan_lmac_if_umac_rx_ops_register() - UMAC rx handler register 30 * @rx_ops: Pointer to rx_ops structure to be populated 31 * 32 * Register umac RX callabacks which will be called by DA/OL/WMA/WMI 33 * 34 * Return: QDF_STATUS_SUCCESS - in case of success 35 */ 36 QDF_STATUS wlan_lmac_if_umac_rx_ops_register 37 (struct wlan_lmac_if_rx_ops *rx_ops); 38 39 /** 40 * wlan_lmac_if_set_umac_txops_registration_cb() - tx registration 41 * callback assignment 42 * @handler: handler to be called for LMAC tx ops registration 43 * 44 * API to assign appropriate tx registration callback handler based on the 45 * device type(Offload or Direct attach) 46 * 47 * Return: QDF_STATUS_SUCCESS - in case of success 48 */ 49 QDF_STATUS wlan_lmac_if_set_umac_txops_registration_cb 50 (QDF_STATUS (*handler)(struct wlan_lmac_if_tx_ops *)); 51 52 /** 53 * wlan_lmac_if_set_umac_crypto_rxpn_ops_registration_cb() - crypto rxpn 54 * registration callback assignment 55 * @handler: handler to be called for LMAC crypto rxpn ops registration 56 * 57 * API to assign appropriate crypto rxpn registration callback handler 58 * based on the device type 59 * 60 * Return: QDF_STATUS_SUCCESS - in case of success 61 */ 62 QDF_STATUS wlan_lmac_if_set_umac_crypto_rxpn_ops_registration_cb 63 (QDF_STATUS (*handler)(struct wlan_lmac_if_rx_ops *)); 64 65 /** 66 * wlan_lmac_if_get_mgmt_txrx_rx_ops() - retrieve the mgmt rx_ops 67 * @psoc: psoc context 68 * 69 * API to retrieve the mgmt rx_ops from the psoc context 70 * 71 * Return: mgmt_rx_ops pointer 72 */ 73 static inline struct wlan_lmac_if_mgmt_txrx_rx_ops * 74 wlan_lmac_if_get_mgmt_txrx_rx_ops(struct wlan_objmgr_psoc *psoc) 75 { 76 struct wlan_lmac_if_rx_ops *rx_ops; 77 78 if (!psoc) 79 return NULL; 80 81 rx_ops = wlan_psoc_get_lmac_if_rxops(psoc); 82 if (!rx_ops) { 83 qdf_err("rx_ops is NULL"); 84 return NULL; 85 } 86 87 return &rx_ops->mgmt_txrx_rx_ops; 88 } 89 90 /** 91 * wlan_lmac_if_get_dfs_rx_ops() - retrieve the dfs rx_ops 92 * @psoc: psoc context 93 * 94 * API to retrieve the dfs rx_ops from the psoc context 95 * 96 * Return: dfs_rx_ops pointer 97 */ 98 static inline struct wlan_lmac_if_dfs_rx_ops * 99 wlan_lmac_if_get_dfs_rx_ops(struct wlan_objmgr_psoc *psoc) 100 { 101 struct wlan_lmac_if_rx_ops *rx_ops; 102 103 if (!psoc) 104 return NULL; 105 106 rx_ops = wlan_psoc_get_lmac_if_rxops(psoc); 107 if (!rx_ops) { 108 qdf_err("rx_ops is NULL"); 109 return NULL; 110 } 111 112 return &rx_ops->dfs_rx_ops; 113 } 114 115 /** 116 * wlan_lmac_if_get_reg_rx_ops() - retrieve the reg rx_ops 117 * @psoc: psoc context 118 * 119 * API to retrieve the reg rx_ops from the psoc context 120 * 121 * Return: reg_rx_ops pointer 122 */ 123 static inline struct wlan_lmac_if_reg_rx_ops * 124 wlan_lmac_if_get_reg_rx_ops(struct wlan_objmgr_psoc *psoc) 125 { 126 struct wlan_lmac_if_rx_ops *rx_ops; 127 128 if (!psoc) 129 return NULL; 130 131 rx_ops = wlan_psoc_get_lmac_if_rxops(psoc); 132 if (!rx_ops) { 133 qdf_err("rx_ops is NULL"); 134 return NULL; 135 } 136 137 return &rx_ops->reg_rx_ops; 138 } 139 140 #ifdef WLAN_SUPPORT_GREEN_AP 141 /** 142 * wlan_lmac_if_get_green_ap_rx_ops() - retrieve the green ap rx_ops 143 * @psoc: psoc context 144 * 145 * API to retrieve the dfs rx_ops from the psoc context 146 * 147 * Return: green_ap_rx_ops pointer 148 */ 149 static inline struct wlan_lmac_if_green_ap_rx_ops * 150 wlan_lmac_if_get_green_ap_rx_ops(struct wlan_objmgr_psoc *psoc) 151 { 152 struct wlan_lmac_if_rx_ops *rx_ops; 153 154 if (!psoc) 155 return NULL; 156 157 rx_ops = wlan_psoc_get_lmac_if_rxops(psoc); 158 if (!rx_ops) { 159 qdf_err("rx_ops is NULL"); 160 return NULL; 161 } 162 163 return &rx_ops->green_ap_rx_ops; 164 } 165 #endif 166 167 /** 168 * mgmt_txrx_get_nbuf() - retrieve nbuf from mgmt desc_id 169 * @pdev: pdev context 170 * @desc_id: mgmt desc_id 171 * 172 * API to retrieve the nbuf from mgmt desc_id 173 * 174 * Return: nbuf 175 */ 176 static inline qdf_nbuf_t 177 mgmt_txrx_get_nbuf(struct wlan_objmgr_pdev *pdev, uint32_t desc_id) 178 { 179 struct wlan_lmac_if_mgmt_txrx_rx_ops *mgmt_rx_ops; 180 struct wlan_objmgr_psoc *psoc; 181 182 psoc = wlan_pdev_get_psoc(pdev); 183 mgmt_rx_ops = wlan_lmac_if_get_mgmt_txrx_rx_ops(psoc); 184 185 if (mgmt_rx_ops && mgmt_rx_ops->mgmt_txrx_get_nbuf_from_desc_id) 186 return mgmt_rx_ops->mgmt_txrx_get_nbuf_from_desc_id(pdev, 187 desc_id); 188 189 return NULL; 190 } 191 192 /** 193 * mgmt_txrx_tx_completion_handler() - mgmt tx completion handler 194 * @pdev: pdev context 195 * @desc_id: mgmt desc_id 196 * @status: tx status 197 * @params: tx params 198 * 199 * API to handle the tx completion for mgmt frames 200 * 201 * Return: QDF_STATUS_SUCCESS - in case of success 202 */ 203 static inline QDF_STATUS 204 mgmt_txrx_tx_completion_handler(struct wlan_objmgr_pdev *pdev, 205 uint32_t desc_id, uint32_t status, 206 void *params) 207 { 208 struct wlan_lmac_if_mgmt_txrx_rx_ops *mgmt_rx_ops; 209 struct wlan_objmgr_psoc *psoc; 210 qdf_nbuf_t nbuf; 211 212 psoc = wlan_pdev_get_psoc(pdev); 213 mgmt_rx_ops = wlan_lmac_if_get_mgmt_txrx_rx_ops(psoc); 214 215 if (mgmt_rx_ops && mgmt_rx_ops->mgmt_tx_completion_handler) 216 return mgmt_rx_ops->mgmt_tx_completion_handler(pdev, desc_id, 217 status, params); 218 219 nbuf = mgmt_txrx_get_nbuf(pdev, desc_id); 220 if (nbuf) 221 qdf_nbuf_free(nbuf); 222 223 return QDF_STATUS_E_NULL_VALUE; 224 } 225 226 /** 227 * mgmt_txrx_rx_handler() - mgmt rx frame handler 228 * @psoc: psoc context 229 * @nbuf: nbuf 230 * @params: rx params 231 * 232 * API to receive mgmt frames 233 * 234 * Return: QDF_STATUS_SUCCESS - in case of success 235 */ 236 static inline QDF_STATUS 237 mgmt_txrx_rx_handler(struct wlan_objmgr_psoc *psoc, qdf_nbuf_t nbuf, 238 void *params) 239 { 240 struct wlan_lmac_if_mgmt_txrx_rx_ops *mgmt_rx_ops; 241 242 mgmt_rx_ops = wlan_lmac_if_get_mgmt_txrx_rx_ops(psoc); 243 244 if (mgmt_rx_ops && mgmt_rx_ops->mgmt_rx_frame_handler) 245 return mgmt_rx_ops->mgmt_rx_frame_handler(psoc, nbuf, params); 246 247 if (nbuf) 248 qdf_nbuf_free(nbuf); 249 250 return QDF_STATUS_E_NULL_VALUE; 251 } 252 253 /** 254 * mgmt_txrx_get_peer() - retrieve peer from mgmt desc_id 255 * @pdev: pdev context 256 * @desc_id: mgmt desc_id 257 * 258 * API to retrieve the peer from mgmt desc_id 259 * 260 * Return: objmgr peer pointer 261 */ 262 static inline struct wlan_objmgr_peer * 263 mgmt_txrx_get_peer(struct wlan_objmgr_pdev *pdev, uint32_t desc_id) 264 { 265 struct wlan_lmac_if_mgmt_txrx_rx_ops *mgmt_rx_ops; 266 struct wlan_objmgr_psoc *psoc; 267 268 psoc = wlan_pdev_get_psoc(pdev); 269 mgmt_rx_ops = wlan_lmac_if_get_mgmt_txrx_rx_ops(psoc); 270 271 if (mgmt_rx_ops && mgmt_rx_ops->mgmt_txrx_get_peer_from_desc_id) 272 return mgmt_rx_ops->mgmt_txrx_get_peer_from_desc_id(pdev, 273 desc_id); 274 275 return NULL; 276 } 277 278 /** 279 * mgmt_txrx_get_vdev_id() - retrieve vdev_id from mgmt desc_id 280 * @pdev: pdev context 281 * @desc_id: mgmt desc_id 282 * 283 * API to retrieve the vdev_id from mgmt desc_id 284 * 285 * Return: vdev_id 286 */ 287 static inline uint8_t 288 mgmt_txrx_get_vdev_id(struct wlan_objmgr_pdev *pdev, uint32_t desc_id) 289 { 290 struct wlan_lmac_if_mgmt_txrx_rx_ops *mgmt_rx_ops; 291 struct wlan_objmgr_psoc *psoc; 292 293 psoc = wlan_pdev_get_psoc(pdev); 294 mgmt_rx_ops = wlan_lmac_if_get_mgmt_txrx_rx_ops(psoc); 295 296 if (mgmt_rx_ops && mgmt_rx_ops->mgmt_txrx_get_vdev_id_from_desc_id) 297 return mgmt_rx_ops->mgmt_txrx_get_vdev_id_from_desc_id(pdev, 298 desc_id); 299 300 return WLAN_UMAC_VDEV_ID_MAX; 301 } 302 /** 303 * mgmt_txrx_get_free_desc_count() - retrieve vdev_id from mgmt desc_id 304 * @pdev: pdev context 305 * 306 * API to get the free desc count mgmt desc pool 307 * 308 * Return: free_desc_count 309 */ 310 static inline uint32_t 311 mgmt_txrx_get_free_desc_count(struct wlan_objmgr_pdev *pdev) 312 { 313 struct wlan_lmac_if_mgmt_txrx_rx_ops *mgmt_rx_ops; 314 struct wlan_objmgr_psoc *psoc; 315 uint32_t free_desc_count = WLAN_INVALID_MGMT_DESC_COUNT; 316 317 psoc = wlan_pdev_get_psoc(pdev); 318 mgmt_rx_ops = wlan_lmac_if_get_mgmt_txrx_rx_ops(psoc); 319 320 if (mgmt_rx_ops && mgmt_rx_ops->mgmt_txrx_get_free_desc_pool_count) 321 free_desc_count = mgmt_rx_ops->mgmt_txrx_get_free_desc_pool_count( 322 pdev); 323 324 return free_desc_count; 325 } 326 #endif /* _WLAN_LMAC_IF_API_H */ 327