blob: b7584b9d3ca02c51775f1638ccda2df250d2d866 [file] [log] [blame]
/*
* Copyright (c) 2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: wlan_vdev_mgr_tgt_if_rx_api.c
*
* This file provide definition for APIs registered for LMAC MLME Rx Ops
*/
#include <qdf_types.h>
#include <wlan_vdev_mgr_tgt_if_rx_defs.h>
#include <wlan_vdev_mgr_tgt_if_rx_api.h>
#include <include/wlan_vdev_mlme.h>
#include <wlan_mlme_dbg.h>
#include <wlan_vdev_mlme_api.h>
#include <target_if_vdev_mgr_tx_ops.h>
static struct vdev_response_timer *
tgt_vdev_mgr_get_response_timer_info(struct wlan_objmgr_vdev *vdev)
{
struct vdev_mlme_obj *vdev_mlme;
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) {
mlme_err("VDEV_%d: VDEV_MLME is NULL", wlan_vdev_get_id(vdev));
return NULL;
}
return &vdev_mlme->vdev_rt;
}
static QDF_STATUS tgt_vdev_mgr_start_response_handler(
struct wlan_objmgr_psoc *psoc,
struct vdev_start_response *rsp)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
struct vdev_mlme_obj *vdev_mlme;
struct wlan_objmgr_vdev *vdev;
struct vdev_response_timer *vdev_rsp;
struct wlan_lmac_if_mlme_tx_ops *tx_ops;
if (!rsp || !psoc) {
mlme_err("Invalid input");
return QDF_STATUS_E_INVAL;
}
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, rsp->vdev_id,
WLAN_VDEV_TARGET_IF_ID);
if (!vdev) {
mlme_err("VDEV is NULL");
return QDF_STATUS_E_FAILURE;
}
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) {
mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
goto tgt_vdev_mgr_start_response_handler_end;
}
vdev_rsp = &vdev_mlme->vdev_rt;
if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response", rsp->vdev_id);
goto tgt_vdev_mgr_start_response_handler_end;
}
tx_ops = target_if_vdev_mgr_get_tx_ops(psoc);
if (rsp->resp_type == RESTART_RESPONSE)
status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
RESTART_RESPONSE_BIT);
else
status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
START_RESPONSE_BIT);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("VDEV_%d: Unexpected response", rsp->vdev_id);
goto tgt_vdev_mgr_start_response_handler_end;
}
if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_ext_start_rsp)
status = vdev_mlme->ops->mlme_vdev_ext_start_rsp(
vdev_mlme,
rsp);
tgt_vdev_mgr_start_response_handler_end:
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
return status;
}
static QDF_STATUS tgt_vdev_mgr_stop_response_handler(
struct wlan_objmgr_psoc *psoc,
struct vdev_stop_response *rsp)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
struct vdev_mlme_obj *vdev_mlme;
struct wlan_objmgr_vdev *vdev;
struct vdev_response_timer *vdev_rsp;
struct wlan_lmac_if_mlme_tx_ops *tx_ops;
if (!rsp || !psoc) {
mlme_err("Invalid input");
return QDF_STATUS_E_INVAL;
}
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, rsp->vdev_id,
WLAN_VDEV_TARGET_IF_ID);
if (!vdev) {
mlme_err("VDEV is NULL");
return QDF_STATUS_E_FAILURE;
}
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) {
mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
goto tgt_vdev_mgr_stop_response_handler_end;
}
vdev_rsp = &vdev_mlme->vdev_rt;
if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response", rsp->vdev_id);
goto tgt_vdev_mgr_stop_response_handler_end;
}
tx_ops = target_if_vdev_mgr_get_tx_ops(psoc);
status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
STOP_RESPONSE_BIT);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("VDEV_%d: Unexpected response", rsp->vdev_id);
goto tgt_vdev_mgr_stop_response_handler_end;
}
if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_ext_stop_rsp)
status = vdev_mlme->ops->mlme_vdev_ext_stop_rsp(
vdev_mlme,
rsp);
tgt_vdev_mgr_stop_response_handler_end:
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
return status;
}
QDF_STATUS tgt_vdev_mgr_delete_response_handler(
struct wlan_objmgr_psoc *psoc,
struct vdev_delete_response *rsp)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
struct vdev_mlme_obj *vdev_mlme;
struct wlan_objmgr_vdev *vdev;
struct vdev_response_timer *vdev_rsp;
struct wlan_lmac_if_mlme_tx_ops *tx_ops;
if (!rsp || !psoc) {
mlme_err("Invalid input");
return QDF_STATUS_E_INVAL;
}
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc,
rsp->vdev_id,
WLAN_VDEV_TARGET_IF_ID);
if (!vdev) {
mlme_err("VDEV is NULL");
return QDF_STATUS_E_FAILURE;
}
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) {
mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
goto tgt_vdev_mgr_delete_response_handler_end;
}
vdev_rsp = &vdev_mlme->vdev_rt;
if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response", rsp->vdev_id);
goto tgt_vdev_mgr_delete_response_handler_end;
}
tx_ops = target_if_vdev_mgr_get_tx_ops(psoc);
status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
DELETE_RESPONSE_BIT);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("VDEV_%d: Unexpected response", rsp->vdev_id);
goto tgt_vdev_mgr_delete_response_handler_end;
}
if ((vdev_mlme->ops) &&
vdev_mlme->ops->mlme_vdev_ext_delete_rsp)
status = vdev_mlme->ops->mlme_vdev_ext_delete_rsp(
vdev_mlme,
rsp);
tgt_vdev_mgr_delete_response_handler_end:
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
return status;
}
static QDF_STATUS
tgt_vdev_mgr_offload_bcn_tx_status_event_handler(uint32_t vdev_id,
uint32_t tx_status)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
return status;
}
static QDF_STATUS
tgt_vdev_mgr_tbttoffset_update_handler(uint32_t num_vdevs, bool is_ext)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
return status;
}
static QDF_STATUS
tgt_vdev_mgr_ext_tbttoffset_update_handle(uint32_t num_vdevs, bool is_ext)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
return status;
}
void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
{
struct wlan_lmac_if_mlme_rx_ops *mlme_rx_ops = &rx_ops->mops;
mlme_rx_ops->vdev_mgr_offload_bcn_tx_status_event_handle =
tgt_vdev_mgr_offload_bcn_tx_status_event_handler;
mlme_rx_ops->vdev_mgr_tbttoffset_update_handle =
tgt_vdev_mgr_tbttoffset_update_handler;
mlme_rx_ops->vdev_mgr_start_response =
tgt_vdev_mgr_start_response_handler;
mlme_rx_ops->vdev_mgr_stop_response =
tgt_vdev_mgr_stop_response_handler;
mlme_rx_ops->vdev_mgr_delete_response =
tgt_vdev_mgr_delete_response_handler;
mlme_rx_ops->vdev_mgr_get_response_timer_info =
tgt_vdev_mgr_get_response_timer_info;
}