xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/mlme_objmgr/dispatcher/src/wlan_pdev_mlme_main.c (revision 6d768494e5ce14eb1603a695c86739d12ecc6ec2)
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