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