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