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