xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c (revision 1397a33f48ea6455be40871470b286e535820eb8)
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
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /**
20  * DOC: Implements VDEV MLME public APIs
21  */
22 
23 #include <wlan_objmgr_vdev_obj.h>
24 #include <wlan_mlme_dbg.h>
25 #include "include/wlan_vdev_mlme.h"
26 #include "../../core/src/vdev_mlme_sm.h"
27 #include <wlan_vdev_mlme_api.h>
28 #include <qdf_module.h>
29 
30 struct vdev_mlme_obj *wlan_vdev_mlme_get_cmpt_obj(struct wlan_objmgr_vdev *vdev)
31 {
32 	struct vdev_mlme_obj *vdev_mlme;
33 
34 	if (!vdev) {
35 		mlme_err("vdev is NULL");
36 		return NULL;
37 	}
38 
39 	vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj(vdev,
40 							  WLAN_UMAC_COMP_MLME);
41 	if (!vdev_mlme) {
42 		mlme_err(" MLME component object is NULL");
43 		return NULL;
44 	}
45 
46 	return vdev_mlme;
47 }
48 
49 void *wlan_vdev_mlme_get_ext_hdl(struct wlan_objmgr_vdev *vdev)
50 {
51 	struct vdev_mlme_obj *vdev_mlme;
52 
53 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
54 	if (vdev_mlme)
55 		return vdev_mlme->ext_vdev_ptr;
56 
57 	return NULL;
58 }
59 
60 qdf_export_symbol(wlan_vdev_mlme_get_ext_hdl);
61 
62 #ifdef CMN_VDEV_MLME_SM_ENABLE
63 QDF_STATUS wlan_vdev_mlme_sm_deliver_evt(struct wlan_objmgr_vdev *vdev,
64 					 enum wlan_vdev_sm_evt event,
65 					 uint16_t event_data_len,
66 					 void *event_data)
67 {
68 	struct vdev_mlme_obj *vdev_mlme;
69 	QDF_STATUS status;
70 
71 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
72 	if (!vdev_mlme) {
73 		mlme_err("vdev component object is NULL");
74 		return QDF_STATUS_E_FAILURE;
75 	}
76 
77 	mlme_vdev_sm_spin_lock(vdev_mlme);
78 	status = mlme_vdev_sm_deliver_event(vdev_mlme, event, event_data_len,
79 					    event_data);
80 	mlme_vdev_sm_spin_unlock(vdev_mlme);
81 
82 	return status;
83 }
84 
85 qdf_export_symbol(wlan_vdev_mlme_sm_deliver_evt);
86 
87 QDF_STATUS wlan_vdev_mlme_sm_deliver_evt_sync(struct wlan_objmgr_vdev *vdev,
88 					      enum wlan_vdev_sm_evt event,
89 					      uint16_t event_data_len,
90 					      void *event_data)
91 {
92 	struct vdev_mlme_obj *vdev_mlme;
93 	QDF_STATUS status;
94 
95 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
96 	if (!vdev_mlme) {
97 		mlme_err("vdev component object is NULL");
98 		return QDF_STATUS_E_FAILURE;
99 	}
100 
101 	status = mlme_vdev_sm_deliver_event(vdev_mlme, event, event_data_len,
102 					    event_data);
103 
104 	return status;
105 }
106 
107 qdf_export_symbol(wlan_vdev_mlme_sm_deliver_evt_sync);
108 
109 #ifdef SM_ENG_HIST_ENABLE
110 void wlan_vdev_mlme_sm_history_print(struct wlan_objmgr_vdev *vdev)
111 {
112 	struct vdev_mlme_obj *vdev_mlme;
113 
114 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
115 	if (!vdev_mlme) {
116 		mlme_err("vdev component object is NULL");
117 		return;
118 	}
119 
120 	mlme_vdev_sm_history_print(vdev_mlme);
121 }
122 #endif
123 
124 QDF_STATUS wlan_vdev_allow_connect_n_tx(struct wlan_objmgr_vdev *vdev)
125 {
126 	enum wlan_vdev_state state;
127 	enum wlan_vdev_state substate;
128 
129 	state = wlan_vdev_mlme_get_state(vdev);
130 	substate = wlan_vdev_mlme_get_substate(vdev);
131 	if ((state == WLAN_VDEV_S_UP) ||
132 	    ((state == WLAN_VDEV_S_SUSPEND) &&
133 	     (substate == WLAN_VDEV_SS_SUSPEND_CSA_RESTART)))
134 		return QDF_STATUS_SUCCESS;
135 
136 	return QDF_STATUS_E_FAILURE;
137 }
138 
139 QDF_STATUS wlan_vdev_mlme_is_active(struct wlan_objmgr_vdev *vdev)
140 {
141 	enum wlan_vdev_state state;
142 
143 	state = wlan_vdev_mlme_get_state(vdev);
144 	if ((state == WLAN_VDEV_S_UP) ||  (state == WLAN_VDEV_S_DFS_CAC_WAIT) ||
145 	    (state == WLAN_VDEV_S_SUSPEND))
146 		return QDF_STATUS_SUCCESS;
147 
148 	return QDF_STATUS_E_FAILURE;
149 }
150 
151 qdf_export_symbol(wlan_vdev_mlme_is_active);
152 
153 QDF_STATUS wlan_vdev_chan_config_valid(struct wlan_objmgr_vdev *vdev)
154 {
155 	enum wlan_vdev_state state;
156 	enum wlan_vdev_state substate;
157 
158 	state = wlan_vdev_mlme_get_state(vdev);
159 	substate = wlan_vdev_mlme_get_substate(vdev);
160 	if (!((state == WLAN_VDEV_S_INIT) || (state == WLAN_VDEV_S_STOP)))
161 		return QDF_STATUS_SUCCESS;
162 
163 	return QDF_STATUS_E_FAILURE;
164 }
165 
166 QDF_STATUS wlan_vdev_is_going_down(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_STOP) ||
174 	    ((state == WLAN_VDEV_S_SUSPEND) &&
175 	     (substate == WLAN_VDEV_SS_SUSPEND_SUSPEND_DOWN)))
176 		return QDF_STATUS_SUCCESS;
177 
178 	return QDF_STATUS_E_FAILURE;
179 }
180 
181 void wlan_vdev_mlme_cmd_lock(struct wlan_objmgr_vdev *vdev)
182 {
183 	struct vdev_mlme_obj *vdev_mlme;
184 
185 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
186 	if (!vdev_mlme) {
187 		mlme_err("vdev component object is NULL");
188 		return;
189 	}
190 
191 	mlme_vdev_cmd_mutex_acquire(vdev_mlme);
192 }
193 
194 void wlan_vdev_mlme_cmd_unlock(struct wlan_objmgr_vdev *vdev)
195 {
196 	struct vdev_mlme_obj *vdev_mlme;
197 
198 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
199 	if (!vdev_mlme) {
200 		mlme_err("vdev component object is NULL");
201 		return;
202 	}
203 
204 	mlme_vdev_cmd_mutex_release(vdev_mlme);
205 }
206 
207 #endif
208