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