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 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 30 static QDF_STATUS mlme_pdev_obj_create_handler(struct wlan_objmgr_pdev *pdev, 31 void *arg) 32 { 33 struct pdev_mlme_obj *pdev_mlme; 34 35 if (!pdev) { 36 mlme_err(" PDEV is NULL"); 37 return QDF_STATUS_E_FAILURE; 38 } 39 40 pdev_mlme = qdf_mem_malloc(sizeof(*pdev_mlme)); 41 if (!pdev_mlme) { 42 mlme_err(" MLME component object alloc failed"); 43 return QDF_STATUS_E_NOMEM; 44 } 45 46 pdev_mlme->pdev = pdev; 47 48 if (mlme_pdev_ops_ext_hdl_create(pdev_mlme) != QDF_STATUS_SUCCESS) 49 goto init_failed; 50 51 wlan_objmgr_pdev_component_obj_attach(pdev, WLAN_UMAC_COMP_MLME, 52 (void *)pdev_mlme, 53 QDF_STATUS_SUCCESS); 54 55 return QDF_STATUS_SUCCESS; 56 57 init_failed: 58 qdf_mem_free(pdev_mlme); 59 60 return QDF_STATUS_E_FAILURE; 61 } 62 63 static QDF_STATUS mlme_pdev_obj_destroy_handler(struct wlan_objmgr_pdev *pdev, 64 void *arg) 65 { 66 struct pdev_mlme_obj *pdev_mlme; 67 68 pdev_mlme = wlan_pdev_mlme_get_cmpt_obj(pdev); 69 if (!pdev_mlme) { 70 mlme_info(" PDEV MLME component object is NULL"); 71 return QDF_STATUS_SUCCESS; 72 } 73 74 mlme_pdev_ops_ext_hdl_destroy(pdev_mlme); 75 76 wlan_objmgr_pdev_component_obj_detach(pdev, WLAN_UMAC_COMP_MLME, 77 (void *)pdev_mlme); 78 qdf_mem_free(pdev_mlme); 79 80 return QDF_STATUS_SUCCESS; 81 } 82 83 QDF_STATUS wlan_pdev_mlme_init(void) 84 { 85 if (wlan_objmgr_register_pdev_create_handler 86 (WLAN_UMAC_COMP_MLME, 87 mlme_pdev_obj_create_handler, NULL) 88 != QDF_STATUS_SUCCESS) 89 return QDF_STATUS_E_FAILURE; 90 91 if (wlan_objmgr_register_pdev_destroy_handler 92 (WLAN_UMAC_COMP_MLME, 93 mlme_pdev_obj_destroy_handler, NULL) 94 != QDF_STATUS_SUCCESS) { 95 if (wlan_objmgr_unregister_pdev_create_handler 96 (WLAN_UMAC_COMP_MLME, 97 mlme_pdev_obj_create_handler, NULL) 98 != QDF_STATUS_SUCCESS) 99 return QDF_STATUS_E_FAILURE; 100 101 return QDF_STATUS_E_FAILURE; 102 } 103 104 return QDF_STATUS_SUCCESS; 105 } 106 107 QDF_STATUS wlan_pdev_mlme_deinit(void) 108 { 109 if (wlan_objmgr_unregister_pdev_create_handler 110 (WLAN_UMAC_COMP_MLME, 111 mlme_pdev_obj_create_handler, NULL) 112 != QDF_STATUS_SUCCESS) 113 return QDF_STATUS_E_FAILURE; 114 115 if (wlan_objmgr_unregister_pdev_destroy_handler 116 (WLAN_UMAC_COMP_MLME, 117 mlme_pdev_obj_destroy_handler, NULL) 118 != QDF_STATUS_SUCCESS) 119 return QDF_STATUS_E_FAILURE; 120 121 return QDF_STATUS_SUCCESS; 122 } 123