1 /* 2 * Copyright (c) 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: 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 #ifdef FEATURE_VDEV_RSP_WAKELOCK 203 static struct psoc_mlme_wakelock * 204 tgt_psoc_get_wakelock_info(struct wlan_objmgr_psoc *psoc) 205 { 206 struct psoc_mlme_obj *psoc_mlme; 207 208 psoc_mlme = mlme_psoc_get_priv(psoc); 209 if (!psoc_mlme) { 210 mlme_err("VDEV_%d: VDEV_MLME is NULL", wlan_vdev_get_id(psoc)); 211 return NULL; 212 } 213 214 return &psoc_mlme->psoc_wakelock; 215 } 216 217 static inline void 218 tgt_psoc_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops 219 *mlme_rx_ops) 220 { 221 mlme_rx_ops->psoc_get_wakelock_info = 222 tgt_psoc_get_wakelock_info; 223 } 224 #else 225 static inline void 226 tgt_psoc_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops 227 *mlme_rx_ops) 228 { 229 } 230 #endif 231 232 void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops) 233 { 234 struct wlan_lmac_if_mlme_rx_ops *mlme_rx_ops = &rx_ops->mops; 235 236 mlme_rx_ops->vdev_mgr_offload_bcn_tx_status_event_handle = 237 tgt_vdev_mgr_offload_bcn_tx_status_event_handler; 238 mlme_rx_ops->vdev_mgr_tbttoffset_update_handle = 239 tgt_vdev_mgr_tbttoffset_update_handler; 240 mlme_rx_ops->vdev_mgr_start_response = 241 tgt_vdev_mgr_start_response_handler; 242 mlme_rx_ops->vdev_mgr_stop_response = 243 tgt_vdev_mgr_stop_response_handler; 244 mlme_rx_ops->vdev_mgr_delete_response = 245 tgt_vdev_mgr_delete_response_handler; 246 mlme_rx_ops->vdev_mgr_peer_delete_all_response = 247 tgt_vdev_mgr_peer_delete_all_response_handler; 248 mlme_rx_ops->psoc_get_vdev_response_timer_info = 249 tgt_vdev_mgr_get_response_timer_info; 250 tgt_psoc_reg_wakelock_info_rx_op(&rx_ops->mops); 251 } 252