xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c (revision ad85c389289a03e320cd08dea21861f9857892fc)
1 /*
2  * Copyright (c) 2018-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 VDEV MLME public APIs
19  */
20 
21 #include <wlan_objmgr_vdev_obj.h>
22 #include <wlan_mlme_dbg.h>
23 #include "include/wlan_vdev_mlme.h"
24 #include "../../core/src/vdev_mlme_sm.h"
25 #include <wlan_vdev_mlme_api.h>
26 #include <qdf_module.h>
27 
28 struct vdev_mlme_obj *wlan_vdev_mlme_get_cmpt_obj(struct wlan_objmgr_vdev *vdev)
29 {
30 	struct vdev_mlme_obj *vdev_mlme;
31 
32 	if (!vdev) {
33 		mlme_err("vdev is NULL");
34 		return NULL;
35 	}
36 
37 	vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj(vdev,
38 							  WLAN_UMAC_COMP_MLME);
39 	if (!vdev_mlme) {
40 		mlme_err(" MLME component object is NULL");
41 		return NULL;
42 	}
43 
44 	return vdev_mlme;
45 }
46 
47 void *wlan_vdev_mlme_get_ext_hdl(struct wlan_objmgr_vdev *vdev)
48 {
49 	struct vdev_mlme_obj *vdev_mlme;
50 
51 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
52 	if (vdev_mlme)
53 		return vdev_mlme->ext_vdev_ptr;
54 
55 	return NULL;
56 }
57 
58 qdf_export_symbol(wlan_vdev_mlme_get_ext_hdl);
59 
60 #ifdef CMN_VDEV_MLME_SM_ENABLE
61 QDF_STATUS wlan_vdev_mlme_sm_deliver_evt(struct wlan_objmgr_vdev *vdev,
62 					 enum wlan_vdev_sm_evt event,
63 					 uint16_t event_data_len,
64 					 void *event_data)
65 {
66 	struct vdev_mlme_obj *vdev_mlme;
67 	QDF_STATUS status;
68 
69 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
70 	if (!vdev_mlme) {
71 		mlme_err("vdev component object is NULL");
72 		return QDF_STATUS_E_FAILURE;
73 	}
74 
75 	mlme_vdev_sm_spin_lock(vdev_mlme);
76 	status = mlme_vdev_sm_deliver_event(vdev_mlme, event, event_data_len,
77 					    event_data);
78 	mlme_vdev_sm_spin_unlock(vdev_mlme);
79 
80 	return status;
81 }
82 
83 qdf_export_symbol(wlan_vdev_mlme_sm_deliver_evt);
84 
85 QDF_STATUS wlan_vdev_mlme_sm_deliver_evt_sync(struct wlan_objmgr_vdev *vdev,
86 					      enum wlan_vdev_sm_evt event,
87 					      uint16_t event_data_len,
88 					      void *event_data)
89 {
90 	struct vdev_mlme_obj *vdev_mlme;
91 	QDF_STATUS status;
92 
93 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
94 	if (!vdev_mlme) {
95 		mlme_err("vdev component object is NULL");
96 		return QDF_STATUS_E_FAILURE;
97 	}
98 
99 	status = mlme_vdev_sm_deliver_event(vdev_mlme, event, event_data_len,
100 					    event_data);
101 
102 	return status;
103 }
104 
105 qdf_export_symbol(wlan_vdev_mlme_sm_deliver_evt_sync);
106 
107 #ifdef SM_ENG_HIST_ENABLE
108 void wlan_vdev_mlme_sm_history_print(struct wlan_objmgr_vdev *vdev)
109 {
110 	struct vdev_mlme_obj *vdev_mlme;
111 
112 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
113 	if (!vdev_mlme) {
114 		mlme_err("vdev component object is NULL");
115 		return;
116 	}
117 
118 	mlme_vdev_sm_history_print(vdev_mlme);
119 }
120 #endif
121 
122 QDF_STATUS wlan_vdev_allow_connect_n_tx(struct wlan_objmgr_vdev *vdev)
123 {
124 	enum wlan_vdev_state state;
125 	enum wlan_vdev_state substate;
126 
127 	state = wlan_vdev_mlme_get_state(vdev);
128 	substate = wlan_vdev_mlme_get_substate(vdev);
129 	if ((state == WLAN_VDEV_S_UP) ||
130 	    ((state == WLAN_VDEV_S_SUSPEND) &&
131 	     (substate == WLAN_VDEV_SS_SUSPEND_CSA_RESTART)))
132 		return QDF_STATUS_SUCCESS;
133 
134 	return QDF_STATUS_E_FAILURE;
135 }
136 
137 QDF_STATUS wlan_vdev_mlme_is_active(struct wlan_objmgr_vdev *vdev)
138 {
139 	enum wlan_vdev_state state;
140 
141 	state = wlan_vdev_mlme_get_state(vdev);
142 	if ((state == WLAN_VDEV_S_UP) ||  (state == WLAN_VDEV_S_DFS_CAC_WAIT) ||
143 	    (state == WLAN_VDEV_S_SUSPEND))
144 		return QDF_STATUS_SUCCESS;
145 
146 	return QDF_STATUS_E_FAILURE;
147 }
148 
149 qdf_export_symbol(wlan_vdev_mlme_is_active);
150 
151 QDF_STATUS wlan_vdev_chan_config_valid(struct wlan_objmgr_vdev *vdev)
152 {
153 	enum wlan_vdev_state state;
154 	enum wlan_vdev_state substate;
155 
156 	state = wlan_vdev_mlme_get_state(vdev);
157 	substate = wlan_vdev_mlme_get_substate(vdev);
158 	if (!((state == WLAN_VDEV_S_INIT) || (state == WLAN_VDEV_S_STOP)))
159 		return QDF_STATUS_SUCCESS;
160 
161 	return QDF_STATUS_E_FAILURE;
162 }
163 
164 qdf_export_symbol(wlan_vdev_chan_config_valid);
165 
166 QDF_STATUS wlan_vdev_mlme_is_csa_restart(struct wlan_objmgr_vdev *vdev)
167 {
168 	enum wlan_vdev_state state;
169 	enum wlan_vdev_state substate;
170 
171 	state = wlan_vdev_mlme_get_state(vdev);
172 	substate = wlan_vdev_mlme_get_substate(vdev);
173 	if ((state == WLAN_VDEV_S_SUSPEND) &&
174 	    (substate == WLAN_VDEV_SS_SUSPEND_CSA_RESTART))
175 		return QDF_STATUS_SUCCESS;
176 
177 	return QDF_STATUS_E_FAILURE;
178 }
179 
180 QDF_STATUS wlan_vdev_is_going_down(struct wlan_objmgr_vdev *vdev)
181 {
182 	enum wlan_vdev_state state;
183 	enum wlan_vdev_state substate;
184 
185 	state = wlan_vdev_mlme_get_state(vdev);
186 	substate = wlan_vdev_mlme_get_substate(vdev);
187 	if ((state == WLAN_VDEV_S_STOP) ||
188 	    ((state == WLAN_VDEV_S_SUSPEND) &&
189 	     (substate == WLAN_VDEV_SS_SUSPEND_SUSPEND_DOWN)))
190 		return QDF_STATUS_SUCCESS;
191 
192 	return QDF_STATUS_E_FAILURE;
193 }
194 
195 QDF_STATUS wlan_vdev_is_restart_progress(struct wlan_objmgr_vdev *vdev)
196 {
197 	enum wlan_vdev_state state;
198 	enum wlan_vdev_state substate;
199 
200 	state = wlan_vdev_mlme_get_state(vdev);
201 	substate = wlan_vdev_mlme_get_substate(vdev);
202 	if ((state == WLAN_VDEV_S_START) &&
203 	    (substate == WLAN_VDEV_SS_START_RESTART_PROGRESS))
204 		return QDF_STATUS_SUCCESS;
205 
206 	return QDF_STATUS_E_FAILURE;
207 }
208 
209 QDF_STATUS wlan_vdev_is_dfs_cac_wait(struct wlan_objmgr_vdev *vdev)
210 {
211 	if (wlan_vdev_mlme_get_state(vdev) == WLAN_VDEV_S_DFS_CAC_WAIT)
212 		return QDF_STATUS_SUCCESS;
213 
214 	return QDF_STATUS_E_FAILURE;
215 }
216 
217 void wlan_vdev_mlme_cmd_lock(struct wlan_objmgr_vdev *vdev)
218 {
219 	struct vdev_mlme_obj *vdev_mlme;
220 
221 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
222 	if (!vdev_mlme) {
223 		mlme_err("vdev component object is NULL");
224 		return;
225 	}
226 
227 	mlme_vdev_cmd_mutex_acquire(vdev_mlme);
228 }
229 
230 void wlan_vdev_mlme_cmd_unlock(struct wlan_objmgr_vdev *vdev)
231 {
232 	struct vdev_mlme_obj *vdev_mlme;
233 
234 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
235 	if (!vdev_mlme) {
236 		mlme_err("vdev component object is NULL");
237 		return;
238 	}
239 
240 	mlme_vdev_cmd_mutex_release(vdev_mlme);
241 }
242 
243 QDF_STATUS wlan_vdev_mlme_is_scan_allowed(struct wlan_objmgr_vdev *vdev)
244 {
245 	enum wlan_vdev_state state;
246 
247 	state = wlan_vdev_mlme_get_state(vdev);
248 	if ((state == WLAN_VDEV_S_INIT) ||  (state == WLAN_VDEV_S_UP) ||
249 	    (state == WLAN_VDEV_S_STOP))
250 		return QDF_STATUS_SUCCESS;
251 
252 	return QDF_STATUS_E_FAILURE;
253 }
254 #endif
255