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