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