1 /* 2 * Copyright (c) 2019-2020 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: Implements PSOC MLME APIs 19 */ 20 21 #include <qdf_module.h> 22 #include <wlan_objmgr_cmn.h> 23 #include <wlan_objmgr_global_obj.h> 24 #include <wlan_mlme_dbg.h> 25 #include <include/wlan_mlme_cmn.h> 26 #include <include/wlan_psoc_mlme.h> 27 #include <wlan_psoc_mlme_main.h> 28 #include <wlan_psoc_mlme_api.h> 29 30 struct psoc_mlme_obj *mlme_psoc_get_priv(struct wlan_objmgr_psoc *psoc) 31 { 32 struct psoc_mlme_obj *psoc_mlme; 33 34 psoc_mlme = wlan_objmgr_psoc_get_comp_private_obj(psoc, 35 WLAN_UMAC_COMP_MLME); 36 if (!psoc_mlme) { 37 mlme_err("PSOC MLME component object is NULL"); 38 return NULL; 39 } 40 41 return psoc_mlme; 42 } 43 44 qdf_export_symbol(mlme_psoc_get_priv); 45 46 static QDF_STATUS mlme_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc, 47 void *arg) 48 { 49 struct psoc_mlme_obj *psoc_mlme; 50 QDF_STATUS status = QDF_STATUS_SUCCESS; 51 52 psoc_mlme = qdf_mem_malloc(sizeof(struct psoc_mlme_obj)); 53 if (!psoc_mlme) { 54 mlme_err("Failed to allocate PSOS mlme Object"); 55 return QDF_STATUS_E_NOMEM; 56 } 57 58 psoc_mlme->psoc = psoc; 59 60 status = mlme_psoc_ops_ext_hdl_create(psoc_mlme); 61 if (QDF_IS_STATUS_ERROR(status)) { 62 mlme_err("Failed to allocate psoc ext handle"); 63 goto init_failed; 64 } 65 66 status = wlan_objmgr_psoc_component_obj_attach(psoc, 67 WLAN_UMAC_COMP_MLME, 68 psoc_mlme, 69 QDF_STATUS_SUCCESS); 70 if (QDF_IS_STATUS_ERROR(status)) { 71 mlme_err("Failed to attach psoc_ctx with psoc"); 72 goto init_failed; 73 } 74 75 return QDF_STATUS_SUCCESS; 76 init_failed: 77 qdf_mem_free(psoc_mlme); 78 79 return status; 80 } 81 82 static QDF_STATUS mlme_psoc_obj_destroy_handler(struct wlan_objmgr_psoc *psoc, 83 void *arg) 84 { 85 struct psoc_mlme_obj *psoc_mlme; 86 87 psoc_mlme = mlme_psoc_get_priv(psoc); 88 if (!psoc_mlme) { 89 mlme_err("PSOC MLME component object is NULL"); 90 return QDF_STATUS_E_FAILURE; 91 } 92 93 wlan_objmgr_psoc_component_obj_detach(psoc, WLAN_UMAC_COMP_MLME, 94 psoc_mlme); 95 96 mlme_psoc_ops_ext_hdl_destroy(psoc_mlme); 97 98 qdf_mem_free(psoc_mlme); 99 100 return QDF_STATUS_SUCCESS; 101 } 102 103 QDF_STATUS wlan_psoc_mlme_init(void) 104 { 105 if (wlan_objmgr_register_psoc_create_handler 106 (WLAN_UMAC_COMP_MLME, 107 mlme_psoc_obj_create_handler, NULL) 108 != QDF_STATUS_SUCCESS) 109 return QDF_STATUS_E_FAILURE; 110 111 if (wlan_objmgr_register_psoc_destroy_handler 112 (WLAN_UMAC_COMP_MLME, 113 mlme_psoc_obj_destroy_handler, NULL) 114 != QDF_STATUS_SUCCESS) { 115 if (wlan_objmgr_unregister_psoc_create_handler 116 (WLAN_UMAC_COMP_MLME, 117 mlme_psoc_obj_create_handler, NULL) 118 != QDF_STATUS_SUCCESS) 119 return QDF_STATUS_E_FAILURE; 120 121 return QDF_STATUS_E_FAILURE; 122 } 123 124 return QDF_STATUS_SUCCESS; 125 } 126 127 QDF_STATUS wlan_psoc_mlme_deinit(void) 128 { 129 if (wlan_objmgr_unregister_psoc_create_handler 130 (WLAN_UMAC_COMP_MLME, 131 mlme_psoc_obj_create_handler, NULL) 132 != QDF_STATUS_SUCCESS) 133 return QDF_STATUS_E_FAILURE; 134 135 if (wlan_objmgr_unregister_psoc_destroy_handler 136 (WLAN_UMAC_COMP_MLME, 137 mlme_psoc_obj_destroy_handler, NULL) 138 != QDF_STATUS_SUCCESS) 139 return QDF_STATUS_E_FAILURE; 140 141 return QDF_STATUS_SUCCESS; 142 } 143