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