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 struct vdev_response_timer *vdev_rsp; 54 struct wlan_lmac_if_mlme_tx_ops *tx_ops; 55 56 if (!rsp || !psoc) { 57 mlme_err("Invalid input"); 58 return QDF_STATUS_E_INVAL; 59 } 60 61 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, rsp->vdev_id, 62 WLAN_VDEV_TARGET_IF_ID); 63 if (!vdev) { 64 mlme_err("VDEV is NULL"); 65 return QDF_STATUS_E_FAILURE; 66 } 67 68 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 69 if (!vdev_mlme) { 70 mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id); 71 goto tgt_vdev_mgr_start_response_handler_end; 72 } 73 74 vdev_rsp = &vdev_mlme->vdev_rt; 75 if (!vdev_rsp) { 76 mlme_err("VDEV_%d: Invalid response", rsp->vdev_id); 77 goto tgt_vdev_mgr_start_response_handler_end; 78 } 79 80 tx_ops = target_if_vdev_mgr_get_tx_ops(psoc); 81 if (rsp->resp_type == RESTART_RESPONSE) 82 status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, 83 RESTART_RESPONSE_BIT); 84 else 85 status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, 86 START_RESPONSE_BIT); 87 if (QDF_IS_STATUS_ERROR(status)) { 88 mlme_err("VDEV_%d: Unexpected response", rsp->vdev_id); 89 goto tgt_vdev_mgr_start_response_handler_end; 90 } 91 92 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_ext_start_rsp) 93 status = vdev_mlme->ops->mlme_vdev_ext_start_rsp( 94 vdev_mlme, 95 rsp); 96 tgt_vdev_mgr_start_response_handler_end: 97 wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); 98 return status; 99 } 100 101 static QDF_STATUS tgt_vdev_mgr_stop_response_handler( 102 struct wlan_objmgr_psoc *psoc, 103 struct vdev_stop_response *rsp) 104 { 105 QDF_STATUS status = QDF_STATUS_E_FAILURE; 106 struct vdev_mlme_obj *vdev_mlme; 107 struct wlan_objmgr_vdev *vdev; 108 struct vdev_response_timer *vdev_rsp; 109 struct wlan_lmac_if_mlme_tx_ops *tx_ops; 110 111 if (!rsp || !psoc) { 112 mlme_err("Invalid input"); 113 return QDF_STATUS_E_INVAL; 114 } 115 116 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, rsp->vdev_id, 117 WLAN_VDEV_TARGET_IF_ID); 118 if (!vdev) { 119 mlme_err("VDEV is NULL"); 120 return QDF_STATUS_E_FAILURE; 121 } 122 123 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 124 if (!vdev_mlme) { 125 mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id); 126 goto tgt_vdev_mgr_stop_response_handler_end; 127 } 128 129 vdev_rsp = &vdev_mlme->vdev_rt; 130 if (!vdev_rsp) { 131 mlme_err("VDEV_%d: Invalid response", rsp->vdev_id); 132 goto tgt_vdev_mgr_stop_response_handler_end; 133 } 134 135 tx_ops = target_if_vdev_mgr_get_tx_ops(psoc); 136 status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, 137 STOP_RESPONSE_BIT); 138 if (QDF_IS_STATUS_ERROR(status)) { 139 mlme_err("VDEV_%d: Unexpected response", rsp->vdev_id); 140 goto tgt_vdev_mgr_stop_response_handler_end; 141 } 142 143 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_ext_stop_rsp) 144 status = vdev_mlme->ops->mlme_vdev_ext_stop_rsp( 145 vdev_mlme, 146 rsp); 147 tgt_vdev_mgr_stop_response_handler_end: 148 wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); 149 return status; 150 } 151 152 QDF_STATUS tgt_vdev_mgr_delete_response_handler( 153 struct wlan_objmgr_psoc *psoc, 154 struct vdev_delete_response *rsp) 155 { 156 QDF_STATUS status = QDF_STATUS_E_FAILURE; 157 struct vdev_mlme_obj *vdev_mlme; 158 struct wlan_objmgr_vdev *vdev; 159 struct vdev_response_timer *vdev_rsp; 160 struct wlan_lmac_if_mlme_tx_ops *tx_ops; 161 162 if (!rsp || !psoc) { 163 mlme_err("Invalid input"); 164 return QDF_STATUS_E_INVAL; 165 } 166 167 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, 168 rsp->vdev_id, 169 WLAN_VDEV_TARGET_IF_ID); 170 if (!vdev) { 171 mlme_err("VDEV is NULL"); 172 return QDF_STATUS_E_FAILURE; 173 } 174 175 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 176 if (!vdev_mlme) { 177 mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id); 178 goto tgt_vdev_mgr_delete_response_handler_end; 179 } 180 181 vdev_rsp = &vdev_mlme->vdev_rt; 182 if (!vdev_rsp) { 183 mlme_err("VDEV_%d: Invalid response", rsp->vdev_id); 184 goto tgt_vdev_mgr_delete_response_handler_end; 185 } 186 187 tx_ops = target_if_vdev_mgr_get_tx_ops(psoc); 188 status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, 189 DELETE_RESPONSE_BIT); 190 if (QDF_IS_STATUS_ERROR(status)) { 191 mlme_err("VDEV_%d: Unexpected response", rsp->vdev_id); 192 goto tgt_vdev_mgr_delete_response_handler_end; 193 } 194 195 if ((vdev_mlme->ops) && 196 vdev_mlme->ops->mlme_vdev_ext_delete_rsp) 197 status = vdev_mlme->ops->mlme_vdev_ext_delete_rsp( 198 vdev_mlme, 199 rsp); 200 201 tgt_vdev_mgr_delete_response_handler_end: 202 wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); 203 return status; 204 } 205 206 static QDF_STATUS 207 tgt_vdev_mgr_offload_bcn_tx_status_event_handler(uint32_t vdev_id, 208 uint32_t tx_status) 209 { 210 QDF_STATUS status = QDF_STATUS_E_FAILURE; 211 212 return status; 213 } 214 215 static QDF_STATUS 216 tgt_vdev_mgr_tbttoffset_update_handler(uint32_t num_vdevs, bool is_ext) 217 { 218 QDF_STATUS status = QDF_STATUS_E_FAILURE; 219 220 return status; 221 } 222 223 static QDF_STATUS 224 tgt_vdev_mgr_ext_tbttoffset_update_handle(uint32_t num_vdevs, bool is_ext) 225 { 226 QDF_STATUS status = QDF_STATUS_E_FAILURE; 227 228 return status; 229 } 230 231 void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops) 232 { 233 struct wlan_lmac_if_mlme_rx_ops *mlme_rx_ops = &rx_ops->mops; 234 235 mlme_rx_ops->vdev_mgr_offload_bcn_tx_status_event_handle = 236 tgt_vdev_mgr_offload_bcn_tx_status_event_handler; 237 mlme_rx_ops->vdev_mgr_tbttoffset_update_handle = 238 tgt_vdev_mgr_tbttoffset_update_handler; 239 mlme_rx_ops->vdev_mgr_start_response = 240 tgt_vdev_mgr_start_response_handler; 241 mlme_rx_ops->vdev_mgr_stop_response = 242 tgt_vdev_mgr_stop_response_handler; 243 mlme_rx_ops->vdev_mgr_delete_response = 244 tgt_vdev_mgr_delete_response_handler; 245 mlme_rx_ops->vdev_mgr_get_response_timer_info = 246 tgt_vdev_mgr_get_response_timer_info; 247 } 248