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