xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/connection_mgr/core/src/wlan_cm_sm.h (revision a86b23ee68a2491aede2e03991f3fb37046f4e41)
1 /*
2  * Copyright (c) 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: wlan_cm_sm.h
19  *
20  * This header file maintain structures required for connection mgr sm infra
21  */
22 
23 #ifndef __WLAN_CM_SM_H__
24 #define __WLAN_CM_SM_H__
25 
26 #ifdef FEATURE_CM_ENABLE
27 #include <wlan_sm_engine.h>
28 
29 /**
30  * mlme_cm_sm_create() - Invoke SM creation for connection manager
31  * @cm_ctx:  connection manager ctx
32  *
33  * API allocates CM MLME SM and initializes SM lock
34  *
35  * Return: SUCCESS on successful allocation
36  *         FAILURE, if registration fails
37  */
38 QDF_STATUS mlme_cm_sm_create(struct cnx_mgr *cm_ctx);
39 
40 /**
41  * mlme_cm_sm_destroy() - Invoke SM deletion for connection manager
42  * @cm_ctx:  connection manager ctx
43  *
44  * API destroys CM MLME SM and SM lock
45  *
46  * Return: SUCCESS on successful deletion
47  *         FAILURE, if deletion fails
48  */
49 QDF_STATUS mlme_cm_sm_destroy(struct cnx_mgr *cm_ctx);
50 
51 /**
52  * mlme_cm_sm_history_print() - Prints SM history
53  * @cm_ctx:  connection manager ctx
54  *
55  * API to print CM SM history
56  *
57  * Return: void
58  */
59 #ifdef SM_ENG_HIST_ENABLE
60 static inline void mlme_cm_sm_history_print(struct cnx_mgr *cm_ctx)
61 {
62 	return wlan_sm_print_history(cm_ctx->sm.sm_hdl);
63 }
64 #else
65 static inline void mlme_cm_sm_history_print(struct cnx_mgr *cm_ctx)
66 {
67 }
68 #endif
69 
70 #ifdef WLAN_CM_USE_SPINLOCK
71 /**
72  * mlme_cm_lock_create - Create CM SM mutex/spinlock
73  * @cm_ctx:  connection manager ctx
74  *
75  * Creates CM SM mutex/spinlock
76  *
77  * Return: void
78  */
79 static inline void
80 mlme_cm_lock_create(struct cnx_mgr *cm_ctx)
81 {
82 	qdf_spinlock_create(&cm_ctx->sm.cm_sm_lock);
83 }
84 
85 /**
86  * mlme_cm_lock_destroy - Destroy CM SM mutex/spinlock
87  * @cm_ctx:  connection manager ctx
88  *
89  * Destroy CM SM mutex/spinlock
90  *
91  * Return: void
92  */
93 static inline void
94 mlme_cm_lock_destroy(struct cnx_mgr *cm_ctx)
95 {
96 	qdf_spinlock_destroy(&cm_ctx->sm.cm_sm_lock);
97 }
98 
99 /**
100  * mlme_cm_lock_acquire - acquire CM SM mutex/spinlock
101  * @cm_ctx:  connection manager ctx
102  *
103  * acquire CM SM mutex/spinlock
104  *
105  * return: void
106  */
107 static inline void mlme_cm_lock_acquire(struct cnx_mgr *cm_ctx)
108 {
109 	qdf_spinlock_acquire(&cm_ctx->sm.cm_sm_lock);
110 }
111 
112 /**
113  * mlme_cm_lock_release - release CM SM mutex/spinlock
114  * @cm_ctx:  connection manager ctx
115  *
116  * release CM SM mutex/spinlock
117  *
118  * return: void
119  */
120 static inline void mlme_cm_lock_release(struct cnx_mgr *cm_ctx)
121 {
122 	qdf_spinlock_release(&cm_ctx->sm.cm_sm_lock);
123 }
124 #else
125 static inline void
126 mlme_cm_lock_create(struct cnx_mgr *cm_ctx)
127 {
128 	qdf_mutex_create(&cm_ctx->sm.cm_sm_lock);
129 }
130 
131 static inline void
132 mlme_cm_lock_destroy(struct cnx_mgr *cm_ctx)
133 {
134 	qdf_mutex_destroy(&cm_ctx->sm.cm_sm_lock);
135 }
136 
137 static inline void mlme_cm_lock_acquire(struct cnx_mgr *cm_ctx)
138 {
139 	qdf_mutex_acquire(&cm_ctx->sm.cm_sm_lock);
140 }
141 
142 static inline void mlme_cm_lock_release(struct cnx_mgr *cm_ctx)
143 {
144 	qdf_mutex_release(&cm_ctx->sm.cm_sm_lock);
145 }
146 #endif /* WLAN_CM_USE_SPINLOCK */
147 
148 /**
149  * mlme_cm_sm_transition_to() - invokes state transition
150  * @cm_ctx:  connection manager ctx
151  * @state: new cm state
152  *
153  * API to invoke SM API to move to new state
154  *
155  * Return: void
156  */
157 static inline void mlme_cm_sm_transition_to(struct cnx_mgr *cm_ctx,
158 					    enum wlan_cm_sm_state state)
159 {
160 	wlan_sm_transition_to(cm_ctx->sm.sm_hdl, state);
161 }
162 
163 /**
164  * mlme_cm_get_state() - get mlme state
165  * @cm_ctx: connection manager SM ctx
166  *
167  * API to get cm state
168  *
169  * Return: state of cm
170  */
171 enum wlan_cm_sm_state mlme_cm_get_state(struct cnx_mgr *cm_ctx);
172 
173 /**
174  * mlme_cm_get_sub_state() - get mlme substate
175  * @cm_ctx: connection manager SM ctx
176  *
177  * API to get cm substate
178  *
179  * Return: substate of cm
180  */
181 enum wlan_cm_sm_state mlme_cm_get_sub_state(struct cnx_mgr *cm_ctx);
182 
183 /**
184  * mlme_cm_set_state() - set cm mlme state
185  * @cm_ctx: connection manager SM ctx
186  * @state: cm state
187  *
188  * API to set cm state
189  *
190  * Return: void
191  */
192 void mlme_cm_set_state(struct cnx_mgr *cm_ctx, enum wlan_cm_sm_state state);
193 /**
194  * mlme_cm_set_substate() - set cm mlme sub state
195  * @cm_ctx: connection manager SM ctx
196  * @substate: cm sub state
197  *
198  * API to set cm sub state
199  *
200  * Return: void
201  */
202 void mlme_cm_set_substate(struct cnx_mgr *cm_ctx,
203 			  enum wlan_cm_sm_state substate);
204 
205 /**
206  * mlme_cm_sm_state_update() - set cm mlme state and sub state
207  * @cm_ctx: connection manager SM ctx
208  * @state: cm state
209  * @substate: cm sub state
210  *
211  * API to invoke util APIs to set state and MLME sub state
212  *
213  * Return: void
214  */
215 void mlme_cm_sm_state_update(struct cnx_mgr *cm_ctx,
216 			     enum wlan_cm_sm_state state,
217 			     enum wlan_cm_sm_state substate);
218 
219 /**
220  * mlme_cm_sm_deliver_evt() - Delivers event to CM SM
221  * @vdev: Object manager VDEV object
222  * @event: CM event
223  * @event_data_len: data size
224  * @event_data: event data
225  *
226  * API to dispatch event to VDEV MLME SM with lock acquired
227  *
228  * Return: SUCCESS: on handling event
229  *         FAILURE: on ignoring the event
230  */
231 QDF_STATUS mlme_cm_sm_deliver_evt(struct wlan_objmgr_vdev *vdev,
232 				  enum wlan_cm_sm_evt event,
233 				  uint16_t event_data_len,
234 				  void *event_data);
235 
236 #endif /* FEATURE_CM_ENABLE */
237 #endif /* __WLAN_CM_SM_H__ */
238