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 PDEV MLME APIs 19 */ 20 21 #include <wlan_objmgr_cmn.h> 22 #include <wlan_objmgr_global_obj.h> 23 #include <wlan_objmgr_pdev_obj.h> 24 #include <wlan_mlme_dbg.h> 25 #include "include/wlan_mlme_cmn.h" 26 #include "include/wlan_pdev_mlme.h" 27 #include "wlan_pdev_mlme_main.h" 28 #include "wlan_pdev_mlme_api.h" 29 #include <wlan_utility.h> 30 31 static QDF_STATUS mlme_pdev_obj_create_handler(struct wlan_objmgr_pdev *pdev, 32 void *arg) 33 { 34 struct pdev_mlme_obj *pdev_mlme; 35 struct wlan_objmgr_psoc *psoc; 36 37 if (!pdev) { 38 mlme_err(" PDEV is NULL"); 39 return QDF_STATUS_E_FAILURE; 40 } 41 42 psoc = wlan_pdev_get_psoc(pdev); 43 if (!psoc) { 44 mlme_err("PSOC is NULL"); 45 return QDF_STATUS_E_FAILURE; 46 } 47 48 pdev_mlme = qdf_mem_malloc(sizeof(*pdev_mlme)); 49 if (!pdev_mlme) { 50 mlme_err(" MLME component object alloc failed"); 51 return QDF_STATUS_E_NOMEM; 52 } 53 wlan_minidump_log(pdev_mlme, sizeof(*pdev_mlme), psoc, 54 WLAN_MD_OBJMGR_PDEV_MLME, "pdev_mlme"); 55 pdev_mlme->pdev = pdev; 56 57 if (mlme_pdev_ops_ext_hdl_create(pdev_mlme) != QDF_STATUS_SUCCESS) 58 goto init_failed; 59 60 wlan_objmgr_pdev_component_obj_attach(pdev, WLAN_UMAC_COMP_MLME, 61 (void *)pdev_mlme, 62 QDF_STATUS_SUCCESS); 63 64 return QDF_STATUS_SUCCESS; 65 66 init_failed: 67 wlan_minidump_remove(pdev_mlme); 68 qdf_mem_free(pdev_mlme); 69 70 return QDF_STATUS_E_FAILURE; 71 } 72 73 static QDF_STATUS mlme_pdev_obj_destroy_handler(struct wlan_objmgr_pdev *pdev, 74 void *arg) 75 { 76 struct pdev_mlme_obj *pdev_mlme; 77 78 pdev_mlme = wlan_pdev_mlme_get_cmpt_obj(pdev); 79 if (!pdev_mlme) { 80 mlme_info(" PDEV MLME component object is NULL"); 81 return QDF_STATUS_SUCCESS; 82 } 83 84 mlme_pdev_ops_ext_hdl_destroy(pdev_mlme); 85 86 wlan_objmgr_pdev_component_obj_detach(pdev, WLAN_UMAC_COMP_MLME, 87 (void *)pdev_mlme); 88 wlan_minidump_remove(pdev_mlme); 89 qdf_mem_free(pdev_mlme); 90 91 return QDF_STATUS_SUCCESS; 92 } 93 94 QDF_STATUS wlan_pdev_mlme_init(void) 95 { 96 if (wlan_objmgr_register_pdev_create_handler 97 (WLAN_UMAC_COMP_MLME, 98 mlme_pdev_obj_create_handler, NULL) 99 != QDF_STATUS_SUCCESS) 100 return QDF_STATUS_E_FAILURE; 101 102 if (wlan_objmgr_register_pdev_destroy_handler 103 (WLAN_UMAC_COMP_MLME, 104 mlme_pdev_obj_destroy_handler, NULL) 105 != QDF_STATUS_SUCCESS) { 106 if (wlan_objmgr_unregister_pdev_create_handler 107 (WLAN_UMAC_COMP_MLME, 108 mlme_pdev_obj_create_handler, NULL) 109 != QDF_STATUS_SUCCESS) 110 return QDF_STATUS_E_FAILURE; 111 112 return QDF_STATUS_E_FAILURE; 113 } 114 115 return QDF_STATUS_SUCCESS; 116 } 117 118 QDF_STATUS wlan_pdev_mlme_deinit(void) 119 { 120 if (wlan_objmgr_unregister_pdev_create_handler 121 (WLAN_UMAC_COMP_MLME, 122 mlme_pdev_obj_create_handler, NULL) 123 != QDF_STATUS_SUCCESS) 124 return QDF_STATUS_E_FAILURE; 125 126 if (wlan_objmgr_unregister_pdev_destroy_handler 127 (WLAN_UMAC_COMP_MLME, 128 mlme_pdev_obj_destroy_handler, NULL) 129 != QDF_STATUS_SUCCESS) 130 return QDF_STATUS_E_FAILURE; 131 132 return QDF_STATUS_SUCCESS; 133 } 134