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