1 /* 2 * Copyright (c) 2019-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: Implements MLME global APIs 19 */ 20 21 #include <wlan_objmgr_cmn.h> 22 #include <include/wlan_mlme_cmn.h> 23 #include <include/wlan_pdev_mlme.h> 24 #include <include/wlan_vdev_mlme.h> 25 #include <include/wlan_mlme_cmn.h> 26 #include <wlan_psoc_mlme_main.h> 27 #include <wlan_pdev_mlme_main.h> 28 #include <wlan_vdev_mlme_main.h> 29 30 struct mlme_ext_ops *glbl_ops; 31 mlme_get_global_ops_cb glbl_ops_cb; 32 33 QDF_STATUS wlan_cmn_mlme_init(void) 34 { 35 QDF_STATUS status; 36 37 status = wlan_psoc_mlme_init(); 38 if (status != QDF_STATUS_SUCCESS) 39 return status; 40 41 status = wlan_pdev_mlme_init(); 42 if (status != QDF_STATUS_SUCCESS) 43 return status; 44 45 status = wlan_vdev_mlme_init(); 46 if (status != QDF_STATUS_SUCCESS) 47 return status; 48 49 if (glbl_ops_cb) 50 glbl_ops = glbl_ops_cb(); 51 52 return QDF_STATUS_SUCCESS; 53 } 54 55 QDF_STATUS wlan_cmn_mlme_deinit(void) 56 { 57 QDF_STATUS status; 58 59 status = wlan_vdev_mlme_deinit(); 60 if (status != QDF_STATUS_SUCCESS) 61 return status; 62 63 status = wlan_pdev_mlme_deinit(); 64 if (status != QDF_STATUS_SUCCESS) 65 return status; 66 67 status = wlan_psoc_mlme_deinit(); 68 if (status != QDF_STATUS_SUCCESS) 69 return status; 70 71 return QDF_STATUS_SUCCESS; 72 } 73 74 QDF_STATUS mlme_psoc_ops_ext_hdl_create(struct psoc_mlme_obj *psoc_mlme) 75 { 76 QDF_STATUS ret = QDF_STATUS_SUCCESS; 77 78 if (glbl_ops && glbl_ops->mlme_psoc_ext_hdl_create) 79 ret = glbl_ops->mlme_psoc_ext_hdl_create(psoc_mlme); 80 81 return ret; 82 } 83 84 QDF_STATUS mlme_psoc_ops_ext_hdl_destroy(struct psoc_mlme_obj *psoc_mlme) 85 { 86 QDF_STATUS ret = QDF_STATUS_SUCCESS; 87 88 if (glbl_ops && glbl_ops->mlme_psoc_ext_hdl_destroy) 89 ret = glbl_ops->mlme_psoc_ext_hdl_destroy(psoc_mlme); 90 91 return ret; 92 } 93 94 QDF_STATUS mlme_pdev_ops_ext_hdl_create(struct pdev_mlme_obj *pdev_mlme) 95 { 96 QDF_STATUS ret = QDF_STATUS_SUCCESS; 97 98 if (glbl_ops && glbl_ops->mlme_pdev_ext_hdl_create) 99 ret = glbl_ops->mlme_pdev_ext_hdl_create(pdev_mlme); 100 101 return ret; 102 } 103 104 QDF_STATUS mlme_pdev_ops_ext_hdl_destroy(struct pdev_mlme_obj *pdev_mlme) 105 { 106 QDF_STATUS ret = QDF_STATUS_SUCCESS; 107 108 if (glbl_ops && glbl_ops->mlme_pdev_ext_hdl_destroy) 109 ret = glbl_ops->mlme_pdev_ext_hdl_destroy(pdev_mlme); 110 111 return ret; 112 } 113 114 QDF_STATUS mlme_vdev_ops_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme) 115 { 116 QDF_STATUS ret = QDF_STATUS_SUCCESS; 117 118 if (glbl_ops && glbl_ops->mlme_vdev_ext_hdl_create) 119 ret = glbl_ops->mlme_vdev_ext_hdl_create(vdev_mlme); 120 121 return ret; 122 } 123 124 QDF_STATUS mlme_vdev_ops_ext_hdl_post_create(struct vdev_mlme_obj *vdev_mlme) 125 { 126 QDF_STATUS ret = QDF_STATUS_SUCCESS; 127 128 if (glbl_ops && glbl_ops->mlme_vdev_ext_hdl_post_create) 129 ret = glbl_ops->mlme_vdev_ext_hdl_post_create(vdev_mlme); 130 131 return ret; 132 } 133 134 QDF_STATUS mlme_vdev_ops_ext_hdl_destroy(struct vdev_mlme_obj *vdev_mlme) 135 { 136 QDF_STATUS ret = QDF_STATUS_SUCCESS; 137 138 if (glbl_ops && glbl_ops->mlme_vdev_ext_hdl_destroy) 139 ret = glbl_ops->mlme_vdev_ext_hdl_destroy(vdev_mlme); 140 141 return ret; 142 } 143 144 QDF_STATUS mlme_vdev_ops_start_fw_send(struct wlan_objmgr_vdev *vdev, 145 uint8_t restart) 146 { 147 QDF_STATUS ret = QDF_STATUS_SUCCESS; 148 149 if (glbl_ops && glbl_ops->mlme_vdev_start_fw_send) 150 ret = glbl_ops->mlme_vdev_start_fw_send(vdev, restart); 151 152 return ret; 153 } 154 155 QDF_STATUS mlme_vdev_ops_multivdev_restart_fw_cmd_send( 156 struct wlan_objmgr_pdev *pdev) 157 { 158 QDF_STATUS ret = QDF_STATUS_SUCCESS; 159 160 if (glbl_ops && glbl_ops->mlme_multivdev_restart_fw_send) 161 ret = glbl_ops->mlme_multivdev_restart_fw_send(pdev); 162 163 return ret; 164 } 165 166 QDF_STATUS mlme_vdev_ops_stop_fw_send(struct wlan_objmgr_vdev *vdev) 167 { 168 QDF_STATUS ret = QDF_STATUS_SUCCESS; 169 170 if (glbl_ops && glbl_ops->mlme_vdev_stop_fw_send) 171 ret = glbl_ops->mlme_vdev_stop_fw_send(vdev); 172 173 return ret; 174 } 175 176 QDF_STATUS mlme_vdev_ops_down_fw_send(struct wlan_objmgr_vdev *vdev) 177 { 178 QDF_STATUS ret = QDF_STATUS_SUCCESS; 179 180 if (glbl_ops && glbl_ops->mlme_vdev_down_fw_send) 181 ret = glbl_ops->mlme_vdev_down_fw_send(vdev); 182 183 return ret; 184 } 185 186 QDF_STATUS mlme_vdev_enqueue_exp_ser_cmd(struct vdev_mlme_obj *vdev_mlme, 187 uint8_t cmd_type) 188 { 189 QDF_STATUS ret = QDF_STATUS_SUCCESS; 190 191 if (glbl_ops && glbl_ops->mlme_vdev_enqueue_exp_cmd) 192 ret = glbl_ops->mlme_vdev_enqueue_exp_cmd(vdev_mlme, cmd_type); 193 194 return ret; 195 } 196 197 QDF_STATUS mlme_vdev_ops_ext_hdl_delete_rsp(struct wlan_objmgr_psoc *psoc, 198 struct vdev_delete_response *rsp) 199 { 200 QDF_STATUS ret = QDF_STATUS_SUCCESS; 201 202 if ((glbl_ops) && glbl_ops->mlme_vdev_ext_delete_rsp) 203 ret = glbl_ops->mlme_vdev_ext_delete_rsp(psoc, rsp); 204 205 return ret; 206 } 207 208 QDF_STATUS mlme_vdev_ops_ext_hdl_multivdev_restart_resp( 209 struct wlan_objmgr_psoc *psoc, 210 struct multi_vdev_restart_resp *resp) 211 { 212 QDF_STATUS ret = QDF_STATUS_SUCCESS; 213 214 if ((glbl_ops) && glbl_ops->mlme_multi_vdev_restart_resp) 215 ret = glbl_ops->mlme_multi_vdev_restart_resp(psoc, resp); 216 217 return ret; 218 } 219 220 void mlme_set_ops_register_cb(mlme_get_global_ops_cb ops_cb) 221 { 222 glbl_ops_cb = ops_cb; 223 } 224