xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/mlme_objmgr/dispatcher/src/wlan_cmn_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 MLME global APIs
19  */
20 
21 #include "wlan_objmgr_cmn.h"
22 #include "include/wlan_mlme_cmn.h"
23 #include "include/wlan_pdev_mlme.h"
24 #include "include/wlan_vdev_mlme.h"
25 #include "include/wlan_mlme_cmn.h"
26 #include "wlan_pdev_mlme_main.h"
27 #include "wlan_vdev_mlme_main.h"
28 
29 struct mlme_ext_ops *glbl_ops;
30 mlme_get_global_ops_cb glbl_ops_cb;
31 
32 QDF_STATUS wlan_cmn_mlme_init(void)
33 {
34 	QDF_STATUS status;
35 
36 	status = wlan_pdev_mlme_init();
37 	if (status != QDF_STATUS_SUCCESS)
38 		return status;
39 
40 	status = wlan_vdev_mlme_init();
41 	if (status != QDF_STATUS_SUCCESS)
42 		return status;
43 
44 	if (glbl_ops_cb)
45 		glbl_ops = glbl_ops_cb();
46 
47 	return QDF_STATUS_SUCCESS;
48 }
49 
50 QDF_STATUS wlan_cmn_mlme_deinit(void)
51 {
52 	QDF_STATUS status;
53 
54 	status = wlan_vdev_mlme_deinit();
55 	if (status != QDF_STATUS_SUCCESS)
56 		return status;
57 
58 	status = wlan_pdev_mlme_deinit();
59 	if (status != QDF_STATUS_SUCCESS)
60 		return status;
61 
62 	return QDF_STATUS_SUCCESS;
63 }
64 
65 QDF_STATUS mlme_pdev_ops_ext_hdl_create(struct pdev_mlme_obj *pdev_mlme)
66 {
67 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
68 
69 	if ((glbl_ops) && glbl_ops->mlme_pdev_ext_hdl_create)
70 		ret = glbl_ops->mlme_pdev_ext_hdl_create(pdev_mlme);
71 
72 	return ret;
73 }
74 
75 QDF_STATUS mlme_pdev_ops_ext_hdl_destroy(struct pdev_mlme_obj *pdev_mlme)
76 {
77 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
78 
79 	if ((glbl_ops) && glbl_ops->mlme_pdev_ext_hdl_destroy)
80 		ret = glbl_ops->mlme_pdev_ext_hdl_destroy(pdev_mlme);
81 
82 	return ret;
83 }
84 
85 QDF_STATUS mlme_vdev_ops_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme)
86 {
87 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
88 
89 	if ((glbl_ops) && glbl_ops->mlme_vdev_ext_hdl_create)
90 		ret = glbl_ops->mlme_vdev_ext_hdl_create(vdev_mlme);
91 
92 	return ret;
93 }
94 
95 QDF_STATUS mlme_vdev_ops_ext_hdl_post_create(struct vdev_mlme_obj *vdev_mlme)
96 {
97 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
98 
99 	if ((glbl_ops) && glbl_ops->mlme_vdev_ext_hdl_post_create)
100 		ret = glbl_ops->mlme_vdev_ext_hdl_post_create(vdev_mlme);
101 
102 	return ret;
103 }
104 
105 QDF_STATUS mlme_vdev_ops_ext_hdl_destroy(struct vdev_mlme_obj *vdev_mlme)
106 {
107 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
108 
109 	if ((glbl_ops) && glbl_ops->mlme_vdev_ext_hdl_destroy)
110 		ret = glbl_ops->mlme_vdev_ext_hdl_destroy(vdev_mlme);
111 
112 	return ret;
113 }
114 
115 QDF_STATUS mlme_vdev_ops_start_fw_send(struct wlan_objmgr_vdev *vdev,
116 				       uint8_t restart)
117 {
118 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
119 
120 	if (glbl_ops && glbl_ops->mlme_vdev_start_fw_send)
121 		ret = glbl_ops->mlme_vdev_start_fw_send(vdev, restart);
122 
123 	return ret;
124 }
125 
126 QDF_STATUS mlme_vdev_ops_multivdev_restart_fw_cmd_send(
127 						struct wlan_objmgr_pdev *pdev)
128 {
129 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
130 
131 	if ((glbl_ops) && glbl_ops->mlme_multivdev_restart_fw_send)
132 		glbl_ops->mlme_multivdev_restart_fw_send(pdev);
133 
134 	return ret;
135 }
136 
137 QDF_STATUS mlme_vdev_ops_stop_fw_send(struct wlan_objmgr_vdev *vdev)
138 {
139 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
140 
141 	if (glbl_ops && glbl_ops->mlme_vdev_stop_fw_send)
142 		ret = glbl_ops->mlme_vdev_stop_fw_send(vdev);
143 
144 	return ret;
145 }
146 
147 QDF_STATUS mlme_vdev_ops_down_fw_send(struct wlan_objmgr_vdev *vdev)
148 {
149 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
150 
151 	if (glbl_ops && glbl_ops->mlme_vdev_down_fw_send)
152 		ret = glbl_ops->mlme_vdev_down_fw_send(vdev);
153 
154 	return ret;
155 }
156 
157 QDF_STATUS mlme_vdev_enqueue_exp_ser_cmd(struct vdev_mlme_obj *vdev_mlme,
158 					 uint8_t cmd_type)
159 {
160 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
161 
162 	if (glbl_ops && glbl_ops->mlme_vdev_enqueue_exp_cmd)
163 		ret = glbl_ops->mlme_vdev_enqueue_exp_cmd(vdev_mlme, cmd_type);
164 
165 	return ret;
166 }
167 
168 void mlme_set_ops_register_cb(mlme_get_global_ops_cb ops_cb)
169 {
170 	glbl_ops_cb = ops_cb;
171 }
172