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 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: wlan_vdev_mgr_tgt_if_rx_api.c 21 * 22 * This file provide definition for APIs registered for LMAC MLME Rx Ops 23 */ 24 #include <qdf_types.h> 25 #include <qdf_module.h> 26 #include <wlan_vdev_mgr_tgt_if_rx_defs.h> 27 #include <wlan_vdev_mgr_tgt_if_rx_api.h> 28 #include <include/wlan_vdev_mlme.h> 29 #include <wlan_mlme_dbg.h> 30 #include <wlan_vdev_mlme_api.h> 31 #include <target_if_vdev_mgr_tx_ops.h> 32 #include <wlan_psoc_mlme_main.h> 33 #include <include/wlan_psoc_mlme.h> 34 #include <include/wlan_mlme_cmn.h> 35 36 struct vdev_response_timer * 37 tgt_vdev_mgr_get_response_timer_info(struct wlan_objmgr_psoc *psoc, 38 uint8_t vdev_id) 39 { 40 struct psoc_mlme_obj *psoc_mlme; 41 42 if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) { 43 mlme_err("Incorrect vdev_id: %d", vdev_id); 44 return NULL; 45 } 46 47 psoc_mlme = mlme_psoc_get_priv(psoc); 48 if (!psoc_mlme) { 49 mlme_err("VDEV_%d PSOC_%d PSOC_MLME is NULL", vdev_id, 50 wlan_psoc_get_id(psoc)); 51 return NULL; 52 } 53 54 return &psoc_mlme->psoc_vdev_rt[vdev_id]; 55 } 56 57 qdf_export_symbol(tgt_vdev_mgr_get_response_timer_info); 58 59 static QDF_STATUS tgt_vdev_mgr_start_response_handler( 60 struct wlan_objmgr_psoc *psoc, 61 struct vdev_start_response *rsp) 62 { 63 QDF_STATUS status = QDF_STATUS_E_FAILURE; 64 struct vdev_mlme_obj *vdev_mlme; 65 struct wlan_objmgr_vdev *vdev; 66 67 if (!rsp || !psoc) { 68 mlme_err("Invalid input"); 69 return QDF_STATUS_E_INVAL; 70 } 71 72 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, rsp->vdev_id, 73 WLAN_VDEV_TARGET_IF_ID); 74 if (!vdev) { 75 mlme_err("VDEV is NULL"); 76 return QDF_STATUS_E_FAILURE; 77 } 78 79 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 80 if (!vdev_mlme) { 81 mlme_err("VDEV_%d PSOC_%d VDEV_MLME is NULL", rsp->vdev_id, 82 wlan_psoc_get_id(psoc)); 83 goto tgt_vdev_mgr_start_response_handler_end; 84 } 85 86 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_ext_start_rsp) 87 status = vdev_mlme->ops->mlme_vdev_ext_start_rsp( 88 vdev_mlme, 89 rsp); 90 91 tgt_vdev_mgr_start_response_handler_end: 92 wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); 93 return status; 94 } 95 96 static QDF_STATUS tgt_vdev_mgr_stop_response_handler( 97 struct wlan_objmgr_psoc *psoc, 98 struct vdev_stop_response *rsp) 99 { 100 QDF_STATUS status = QDF_STATUS_E_FAILURE; 101 struct vdev_mlme_obj *vdev_mlme; 102 struct wlan_objmgr_vdev *vdev; 103 104 if (!rsp || !psoc) { 105 mlme_err("Invalid input"); 106 return QDF_STATUS_E_INVAL; 107 } 108 109 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, rsp->vdev_id, 110 WLAN_VDEV_TARGET_IF_ID); 111 if (!vdev) { 112 mlme_err("VDEV is NULL"); 113 return QDF_STATUS_E_FAILURE; 114 } 115 116 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 117 if (!vdev_mlme) { 118 mlme_err("VDEV_%d: PSOC_%d VDEV_MLME is NULL", rsp->vdev_id, 119 wlan_psoc_get_id(psoc)); 120 goto tgt_vdev_mgr_stop_response_handler_end; 121 } 122 123 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_ext_stop_rsp) 124 status = vdev_mlme->ops->mlme_vdev_ext_stop_rsp( 125 vdev_mlme, 126 rsp); 127 128 tgt_vdev_mgr_stop_response_handler_end: 129 wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); 130 return status; 131 } 132 133 static QDF_STATUS tgt_vdev_mgr_delete_response_handler( 134 struct wlan_objmgr_psoc *psoc, 135 struct vdev_delete_response *rsp) 136 { 137 QDF_STATUS status = QDF_STATUS_E_FAILURE; 138 139 status = mlme_vdev_ops_ext_hdl_delete_rsp(psoc, rsp); 140 return status; 141 } 142 143 static QDF_STATUS tgt_vdev_mgr_peer_delete_all_response_handler( 144 struct wlan_objmgr_psoc *psoc, 145 struct peer_delete_all_response *rsp) 146 { 147 QDF_STATUS status = QDF_STATUS_E_FAILURE; 148 struct vdev_mlme_obj *vdev_mlme; 149 struct wlan_objmgr_vdev *vdev; 150 151 if (!rsp || !psoc) { 152 mlme_err("Invalid input"); 153 return QDF_STATUS_E_INVAL; 154 } 155 156 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, 157 rsp->vdev_id, 158 WLAN_VDEV_TARGET_IF_ID); 159 if (!vdev) { 160 mlme_err("VDEV is NULL"); 161 return QDF_STATUS_E_FAILURE; 162 } 163 164 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 165 if (!vdev_mlme) { 166 mlme_err("VDEV_%d: PSOC_%d VDEV_MLME is NULL", rsp->vdev_id, 167 wlan_psoc_get_id(psoc)); 168 goto tgt_vdev_mgr_peer_delete_all_response_handler_end; 169 } 170 171 if ((vdev_mlme->ops) && 172 vdev_mlme->ops->mlme_vdev_ext_peer_delete_all_rsp) 173 status = vdev_mlme->ops->mlme_vdev_ext_peer_delete_all_rsp( 174 vdev_mlme, 175 rsp); 176 177 tgt_vdev_mgr_peer_delete_all_response_handler_end: 178 wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); 179 return status; 180 } 181 182 static QDF_STATUS 183 tgt_vdev_mgr_offload_bcn_tx_status_event_handler(uint32_t vdev_id, 184 uint32_t tx_status) 185 { 186 QDF_STATUS status = QDF_STATUS_E_FAILURE; 187 188 return status; 189 } 190 191 static QDF_STATUS 192 tgt_vdev_mgr_tbttoffset_update_handler(uint32_t num_vdevs, bool is_ext) 193 { 194 QDF_STATUS status = QDF_STATUS_E_FAILURE; 195 196 return status; 197 } 198 199 QDF_STATUS 200 tgt_vdev_mgr_ext_tbttoffset_update_handle(uint32_t num_vdevs, bool is_ext) 201 { 202 QDF_STATUS status = QDF_STATUS_E_FAILURE; 203 204 return status; 205 } 206 207 static QDF_STATUS tgt_vdev_mgr_multi_vdev_restart_resp_handler( 208 struct wlan_objmgr_psoc *psoc, 209 struct multi_vdev_restart_resp *resp) 210 { 211 return mlme_vdev_ops_ext_hdl_multivdev_restart_resp(psoc, resp); 212 } 213 214 #ifdef FEATURE_VDEV_OPS_WAKELOCK 215 static struct psoc_mlme_wakelock * 216 tgt_psoc_get_wakelock_info(struct wlan_objmgr_psoc *psoc) 217 { 218 struct psoc_mlme_obj *psoc_mlme; 219 220 psoc_mlme = mlme_psoc_get_priv(psoc); 221 if (!psoc_mlme) { 222 mlme_err("PSOC_MLME is NULL"); 223 return NULL; 224 } 225 226 return &psoc_mlme->psoc_mlme_wakelock; 227 } 228 229 static inline void 230 tgt_psoc_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops 231 *mlme_rx_ops) 232 { 233 mlme_rx_ops->psoc_get_wakelock_info = tgt_psoc_get_wakelock_info; 234 } 235 #else 236 static inline void 237 tgt_psoc_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops 238 *mlme_rx_ops) 239 { 240 } 241 #endif 242 243 void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops) 244 { 245 struct wlan_lmac_if_mlme_rx_ops *mlme_rx_ops = &rx_ops->mops; 246 247 mlme_rx_ops->vdev_mgr_offload_bcn_tx_status_event_handle = 248 tgt_vdev_mgr_offload_bcn_tx_status_event_handler; 249 mlme_rx_ops->vdev_mgr_tbttoffset_update_handle = 250 tgt_vdev_mgr_tbttoffset_update_handler; 251 mlme_rx_ops->vdev_mgr_start_response = 252 tgt_vdev_mgr_start_response_handler; 253 mlme_rx_ops->vdev_mgr_stop_response = 254 tgt_vdev_mgr_stop_response_handler; 255 mlme_rx_ops->vdev_mgr_delete_response = 256 tgt_vdev_mgr_delete_response_handler; 257 mlme_rx_ops->vdev_mgr_peer_delete_all_response = 258 tgt_vdev_mgr_peer_delete_all_response_handler; 259 mlme_rx_ops->psoc_get_vdev_response_timer_info = 260 tgt_vdev_mgr_get_response_timer_info; 261 mlme_rx_ops->vdev_mgr_multi_vdev_restart_resp = 262 tgt_vdev_mgr_multi_vdev_restart_resp_handler; 263 tgt_psoc_reg_wakelock_info_rx_op(&rx_ops->mops); 264 } 265