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