qcacmn: create the vdev response timers in psoc_mlme

Move the vdev response timer from the vdev object manager structure
to the psoc mlme structure.

Change-Id: Ieb87ac6549aa23e0beb61441fea459d3db78c2f3
CRs-Fixed: 2563410
This commit is contained in:
Arun Kumar Khandavalli
2019-09-03 14:31:17 +05:30
parent b49c9b7a2b
commit 614d1e4476
16 changed files with 651 additions and 359 deletions

View File

@@ -0,0 +1,94 @@
/*
* 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: target_if_psoc_timer_tx_ops.h
*
* This file provide declaration for APIs registered through lmac Tx Ops
*/
#ifndef __TARGET_IF_PSOC_TIMER_TX_OPS_H__
#define __TARGET_IF_PSOC_TIMER_TX_OPS_H__
/**
* target_if_psoc_vdev_rsp_timer_inuse() - API to check if the response timer
* for vdev is inuse
* @psoc: Psoc object
* @vdev_id: Vdev object id
*
* Return: QDF_STATUS_E_ALREADY in case the timer is inuse or QDF_STATUS_SUCCESS
*/
QDF_STATUS target_if_psoc_vdev_rsp_timer_inuse(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
/**
* target_if_flush_psoc_vdev_timers() - API to flush target_if response timers
* for vdev
* @psoc: pointer to psoc object
*
* This API is used to flush target_if response timer. This API used while
* wlan driver shutdown.
*
* Return: none
*/
void target_if_flush_psoc_vdev_timers(struct wlan_objmgr_psoc *psoc);
/**
* target_if_psoc_vdev_rsp_timer_init() - API to initialize response timers for
* vdev from psoc
* @psoc: pointer to psoc object
* @vdev_id: vdev id for which response timer to be retrieved
*
* This API is used to initialize vdev response timer for vdev-id.
*
* Return: QDF_STATUS
*/
QDF_STATUS target_if_psoc_vdev_rsp_timer_init(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
/**
* target_if_psoc_vdev_rsp_timer_deinit() - API to de-initialize response timers
* for vdev from psoc
* @psoc: pointer to psoc object
* @vdev_id: vdev id for which response timer to be retrieved
*
* This API is used to de-initialize vdev response timer from vdev-id.
*
* Return: none
*/
void target_if_psoc_vdev_rsp_timer_deinit(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
/**
* target_if_vdev_mgr_rsp_timer_mod() - API to modify time of response timers
* for vdev from psoc
* @psoc: pointer to psoc object
* @vdev_id: vdev id for which response timer to be retrieved
* @mseconds: milli seconds
*
* This API is used to modify vdev response timer for vdev-id.
*
* Return: none
*/
QDF_STATUS target_if_vdev_mgr_rsp_timer_mod(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
int mseconds);
#endif

View File

@@ -0,0 +1,177 @@
/*
* 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: target_if_psoc_timer_tx_ops.c
*
* This file provide definition for APIs registered through lmac Tx Ops
*/
#include <wlan_objmgr_psoc_obj.h>
#include <wlan_mlme_dbg.h>
#include <target_if_psoc_timer_tx_ops.h>
#include <wlan_vdev_mgr_tgt_if_rx_defs.h>
#include <target_if_vdev_mgr_tx_ops.h>
#include <target_if_vdev_mgr_rx_ops.h>
QDF_STATUS target_if_psoc_vdev_rsp_timer_inuse(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id)
{
struct vdev_response_timer *vdev_rsp;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) {
mlme_err("Invalid vdev id passed VDEV_%d", vdev_id);
return QDF_STATUS_E_INVAL;
}
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
}
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) {
mlme_err("vdev response is NULL for VDEV_%d PSOC_%d",
vdev_id, wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
}
if (qdf_atomic_read(&vdev_rsp->rsp_timer_inuse)) {
mlme_err("vdev response timer still inuse VDEV_%d PSOC_%d",
vdev_id, wlan_psoc_get_id(psoc));
return QDF_STATUS_E_ALREADY;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS target_if_psoc_vdev_rsp_timer_init(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id)
{
struct vdev_response_timer *vdev_rsp;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) {
mlme_err("Invalid vdev id passed VDEV_%d PSOC_%d", vdev_id,
wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
}
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
}
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) {
mlme_err("vdev response is NULL for VDEV_%d PSOC_%d",
vdev_id, wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
}
vdev_rsp->psoc = psoc;
vdev_rsp->vdev_id = vdev_id;
qdf_timer_init(NULL, &vdev_rsp->rsp_timer,
target_if_vdev_mgr_rsp_timer_mgmt_cb,
vdev_rsp, QDF_TIMER_TYPE_WAKE_APPS);
qdf_atomic_init(&vdev_rsp->rsp_timer_inuse);
return QDF_STATUS_SUCCESS;
}
void target_if_psoc_vdev_rsp_timer_deinit(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id)
{
struct vdev_response_timer *vdev_rsp;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) {
mlme_err("Invalid vdev id passed VDEV_%d PSOC_%d", vdev_id,
wlan_psoc_get_id(psoc));
return;
}
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
wlan_psoc_get_id(psoc));
return;
}
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) {
mlme_err("vdev response is NULL for VDEV_%d PSOC_%d",
vdev_id, wlan_psoc_get_id(psoc));
return;
}
qdf_timer_free(&vdev_rsp->rsp_timer);
qdf_atomic_set(&vdev_rsp->rsp_timer_inuse, 0);
vdev_rsp->psoc = NULL;
}
void target_if_flush_psoc_vdev_timers(struct wlan_objmgr_psoc *psoc)
{
struct vdev_response_timer *vdev_rsp;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
int i;
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("PSOC_%d No Rx Ops", wlan_psoc_get_id(psoc));
return;
}
for (i = 0; i < WLAN_UMAC_PSOC_MAX_VDEVS; i++) {
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
i);
if (vdev_rsp && qdf_timer_sync_cancel(&vdev_rsp->rsp_timer))
target_if_vdev_mgr_rsp_timer_cb(vdev_rsp);
}
}
QDF_STATUS target_if_vdev_mgr_rsp_timer_mod(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
int mseconds)
{
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct vdev_response_timer *vdev_rsp;
if (!psoc) {
mlme_err("Invalid input");
return QDF_STATUS_E_FAILURE;
}
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
wlan_psoc_get_id(psoc));
return QDF_STATUS_E_FAILURE;
}
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
qdf_timer_mod(&vdev_rsp->rsp_timer, mseconds);
return QDF_STATUS_SUCCESS;
}

View File

@@ -51,33 +51,6 @@ static inline bool target_if_vdev_mgr_is_panic_allowed(void)
} }
#endif #endif
/**
* target_if_timer_flush_handler() - API to handle target_if timer flush
* request
* @pdev: pointer to pdev object
* @object: pointer to vdev object
* @arg: pointer to arguments passed
*
* This is a target_if timer flush handler used to flush target_if response
* timer. This API used while wlan driver shut down.
*
* Return: none
*/
void target_if_timer_flush_handler(struct wlan_objmgr_pdev *pdev,
void *object,
void *arg);
/**
* target_if_flush_vdev_timers() - API to flush target_if response timers
* for vdev
* @pdev: pointer to pdev object
*
* This API is used to flush target_if response timer. This API used while
* wlan driver shut down.
*
* Return: none
*/
void target_if_flush_vdev_timers(struct wlan_objmgr_pdev *pdev);
/** /**
* target_if_vdev_mgr_offload_bcn_tx_status_handler() - API to handle beacon * target_if_vdev_mgr_offload_bcn_tx_status_handler() - API to handle beacon
@@ -175,4 +148,12 @@ QDF_STATUS target_if_vdev_mgr_wmi_event_register(
QDF_STATUS target_if_vdev_mgr_wmi_event_unregister( QDF_STATUS target_if_vdev_mgr_wmi_event_unregister(
struct wlan_objmgr_psoc *psoc); struct wlan_objmgr_psoc *psoc);
/**
* target_if_vdev_mgr_rsp_timer_cb() - function to handle vdev related timeouts
* @vdev_rsp: pointer to vdev response timer
*
* Return: NONE
*/
void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp);
#endif /* __TARGET_IF_VDEV_MGR_RX_OPS_H__ */ #endif /* __TARGET_IF_VDEV_MGR_RX_OPS_H__ */

View File

@@ -63,24 +63,22 @@ target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops);
/** /**
* target_if_vdev_mgr_assert_mgmt() - vdev assert mgmt api * target_if_vdev_mgr_assert_mgmt() - vdev assert mgmt api
* @vdev: pointer to objmgr vdev * @PSOC: pointer to objmgr psoc
* @vdev_rsp: pointer to vdev mlme response timer * @vdev_id: vdev id
* @set_bit: bit to be set
* *
* Return: NA * Return: NA
*/ */
#ifdef VDEV_ASSERT_MANAGEMENT #ifdef VDEV_ASSERT_MANAGEMENT
static inline void target_if_vdev_mgr_assert_mgmt( static inline void target_if_vdev_mgr_assert_mgmt(
struct wlan_objmgr_vdev *vdev, struct wlan_objmgr_psoc *psoc,
struct vdev_response_timer *vdev_rsp, uint8_t vdev_id)
uint8_t set_bit)
{ {
} }
#else #else
static inline void target_if_vdev_mgr_assert_mgmt( static inline void target_if_vdev_mgr_assert_mgmt(
struct wlan_objmgr_vdev *vdev, struct wlan_objmgr_psoc *psoc,
struct vdev_response_timer *vdev_rsp, uint8_t vdev_id)
uint8_t set_bit)
{ {
QDF_ASSERT(0); QDF_ASSERT(0);
} }
@@ -89,14 +87,15 @@ static inline void target_if_vdev_mgr_assert_mgmt(
/** /**
* target_if_vdev_mgr_rsp_timer_stop() - API to stop response timer for * target_if_vdev_mgr_rsp_timer_stop() - API to stop response timer for
* vdev manager operations * vdev manager operations
* @vdev: pointer to vdev object * @psoc: pointer to psoc object
* @vdev_rsp: pointer to response timer * @vdev_rsp: vdev response timer
* @clear_bit: acton bit * @clear_bit: enum of wlan_vdev_mgr_tgt_if_rsp_bit
* *
* Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
*/ */
QDF_STATUS target_if_vdev_mgr_rsp_timer_stop( QDF_STATUS target_if_vdev_mgr_rsp_timer_stop(
struct wlan_objmgr_vdev *vdev, struct wlan_objmgr_psoc *psoc,
struct vdev_response_timer *vdev_rsp, struct vdev_response_timer *vdev_rsp,
uint8_t clear_bit); enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit);
#endif /* __TARGET_IF_VDEV_MGR_TX_OPS_H__ */ #endif /* __TARGET_IF_VDEV_MGR_TX_OPS_H__ */

View File

@@ -32,12 +32,10 @@
#include <wlan_vdev_mlme_main.h> #include <wlan_vdev_mlme_main.h>
#include <wmi_unified_vdev_api.h> #include <wmi_unified_vdev_api.h>
static void target_if_vdev_mgr_rsp_timer_cb(void *arg) void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp)
{ {
struct wlan_objmgr_vdev *vdev = arg;
struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_psoc *psoc;
struct wlan_lmac_if_mlme_rx_ops *rx_ops; struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct vdev_response_timer *vdev_rsp;
struct crash_inject param; struct crash_inject param;
struct wmi_unified *wmi_handle; struct wmi_unified *wmi_handle;
struct vdev_start_response start_rsp = {0}; struct vdev_start_response start_rsp = {0};
@@ -47,22 +45,23 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
uint8_t vdev_id; uint8_t vdev_id;
uint16_t rsp_pos = RESPONSE_BIT_MAX; uint16_t rsp_pos = RESPONSE_BIT_MAX;
vdev_id = wlan_vdev_get_id(vdev); if (!vdev_rsp) {
mlme_debug("Response timer expired for VDEV %d", vdev_id); mlme_err("Vdev response timer is NULL");
return;
}
psoc = wlan_vdev_get_psoc(vdev); psoc = vdev_rsp->psoc;
if (!psoc) { if (!psoc) {
mlme_err("PSOC is NULL"); mlme_err("PSOC is NULL");
return; return;
} }
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops || !rx_ops->vdev_mgr_get_response_timer_info) { if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("No Rx Ops"); mlme_err("No Rx Ops");
return; return;
} }
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
if (!qdf_atomic_test_bit(START_RESPONSE_BIT, &vdev_rsp->rsp_status) && if (!qdf_atomic_test_bit(START_RESPONSE_BIT, &vdev_rsp->rsp_status) &&
!qdf_atomic_test_bit(RESTART_RESPONSE_BIT, &vdev_rsp->rsp_status) && !qdf_atomic_test_bit(RESTART_RESPONSE_BIT, &vdev_rsp->rsp_status) &&
!qdf_atomic_test_bit(STOP_RESPONSE_BIT, &vdev_rsp->rsp_status) && !qdf_atomic_test_bit(STOP_RESPONSE_BIT, &vdev_rsp->rsp_status) &&
@@ -70,7 +69,15 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
!qdf_atomic_test_bit( !qdf_atomic_test_bit(
PEER_DELETE_ALL_RESPONSE_BIT, PEER_DELETE_ALL_RESPONSE_BIT,
&vdev_rsp->rsp_status)) { &vdev_rsp->rsp_status)) {
mlme_debug("No response bit is set, ignoring actions"); mlme_debug("No response bit is set, ignoring actions :%d",
vdev_rsp->vdev_id);
return;
}
vdev_id = vdev_rsp->vdev_id;
if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) {
mlme_err("Invalid VDEV_%d PSOC_%d", vdev_id,
wlan_psoc_get_id(psoc));
return; return;
} }
@@ -79,7 +86,7 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
&vdev_rsp->rsp_status) || &vdev_rsp->rsp_status) ||
qdf_atomic_test_bit(RESTART_RESPONSE_BIT, qdf_atomic_test_bit(RESTART_RESPONSE_BIT,
&vdev_rsp->rsp_status)) { &vdev_rsp->rsp_status)) {
start_rsp.vdev_id = wlan_vdev_get_id(vdev); start_rsp.vdev_id = vdev_id;
start_rsp.status = WLAN_MLME_HOST_VDEV_START_TIMEOUT; start_rsp.status = WLAN_MLME_HOST_VDEV_START_TIMEOUT;
if (qdf_atomic_test_bit(START_RESPONSE_BIT, if (qdf_atomic_test_bit(START_RESPONSE_BIT,
&vdev_rsp->rsp_status)) { &vdev_rsp->rsp_status)) {
@@ -92,31 +99,28 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
rsp_pos = RESTART_RESPONSE_BIT; rsp_pos = RESTART_RESPONSE_BIT;
} }
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos); target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
rx_ops->vdev_mgr_start_response(psoc, &start_rsp); rx_ops->vdev_mgr_start_response(psoc, &start_rsp);
} else if (qdf_atomic_test_bit(STOP_RESPONSE_BIT, } else if (qdf_atomic_test_bit(STOP_RESPONSE_BIT,
&vdev_rsp->rsp_status)) { &vdev_rsp->rsp_status)) {
rsp_pos = STOP_RESPONSE_BIT; rsp_pos = STOP_RESPONSE_BIT;
stop_rsp.vdev_id = wlan_vdev_get_id(vdev); stop_rsp.vdev_id = vdev_id;
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos);
rx_ops->vdev_mgr_stop_response(psoc, &stop_rsp); rx_ops->vdev_mgr_stop_response(psoc, &stop_rsp);
} else if (qdf_atomic_test_bit(DELETE_RESPONSE_BIT, } else if (qdf_atomic_test_bit(DELETE_RESPONSE_BIT,
&vdev_rsp->rsp_status)) { &vdev_rsp->rsp_status)) {
del_rsp.vdev_id = wlan_vdev_get_id(vdev); del_rsp.vdev_id = vdev_id;
rsp_pos = DELETE_RESPONSE_BIT; rsp_pos = DELETE_RESPONSE_BIT;
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos);
rx_ops->vdev_mgr_delete_response(psoc, &del_rsp); rx_ops->vdev_mgr_delete_response(psoc, &del_rsp);
} else if (qdf_atomic_test_bit(PEER_DELETE_ALL_RESPONSE_BIT, } else if (qdf_atomic_test_bit(PEER_DELETE_ALL_RESPONSE_BIT,
&vdev_rsp->rsp_status)) { &vdev_rsp->rsp_status)) {
peer_del_all_rsp.vdev_id = wlan_vdev_get_id(vdev); peer_del_all_rsp.vdev_id = vdev_id;
rsp_pos = PEER_DELETE_ALL_RESPONSE_BIT; rsp_pos = PEER_DELETE_ALL_RESPONSE_BIT;
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos);
rx_ops->vdev_mgr_peer_delete_all_response( rx_ops->vdev_mgr_peer_delete_all_response(
psoc, psoc,
@@ -134,7 +138,7 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
} }
/* Trigger fw recovery to collect fw dump */ /* Trigger fw recovery to collect fw dump */
wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); wmi_handle = GET_WMI_HDL_FROM_PSOC(psoc);
if (wmi_handle) { if (wmi_handle) {
mlme_err("PSOC_%d VDEV_%d: Self recovery, %s rsp timeout", mlme_err("PSOC_%d VDEV_%d: Self recovery, %s rsp timeout",
wlan_psoc_get_id(psoc), vdev_id, wlan_psoc_get_id(psoc), vdev_id,
@@ -150,46 +154,31 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
} }
} }
void target_if_timer_flush_handler(struct wlan_objmgr_pdev *pdev,
void *object,
void *arg)
{
struct vdev_response_timer *vdev_rsp;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_vdev *vdev = object;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc) {
mlme_err("PSOC is NULL");
return;
}
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops || !rx_ops->vdev_mgr_get_response_timer_info) {
mlme_err("No Rx Ops");
return;
}
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
if (qdf_timer_sync_cancel(&vdev_rsp->rsp_timer))
target_if_vdev_mgr_rsp_timer_cb(vdev);
}
void target_if_flush_vdev_timers(struct wlan_objmgr_pdev *pdev)
{
wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
target_if_timer_flush_handler,
NULL, true, WLAN_VDEV_TARGET_IF_ID);
}
#ifdef SERIALIZE_VDEV_RESP #ifdef SERIALIZE_VDEV_RESP
static QDF_STATUS target_if_vdev_mgr_rsp_flush_cb(struct scheduler_msg *msg) static QDF_STATUS target_if_vdev_mgr_rsp_flush_cb(struct scheduler_msg *msg)
{ {
struct wlan_objmgr_vdev *vdev = msg->bodyptr; struct vdev_response_timer *vdev_rsp;
struct wlan_objmgr_psoc *psoc;
if (vdev) if (!msg->bodyptr) {
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); mlme_err("Message bodyptr is NULL");
return QDF_STATUS_E_INVAL;
}
vdev_rsp = msg->bodyptr;
if (!vdev_rsp) {
mlme_err("vdev response timer is NULL");
return QDF_STATUS_E_INVAL;
}
psoc = vdev_rsp->psoc;
if (!psoc) {
mlme_err("PSOC is NULL");
return QDF_STATUS_E_INVAL;
}
if (vdev_rsp->rsp_status)
wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
@@ -198,12 +187,19 @@ static void
target_if_vdev_mgr_rsp_cb_mc_ctx(void *arg) target_if_vdev_mgr_rsp_cb_mc_ctx(void *arg)
{ {
struct scheduler_msg msg = {0}; struct scheduler_msg msg = {0};
struct wlan_objmgr_vdev *vdev = arg; struct vdev_response_timer *vdev_rsp = arg;
struct wlan_objmgr_psoc *psoc;
psoc = vdev_rsp->psoc;
if (!psoc) {
mlme_err("PSOC is NULL");
return;
}
msg.type = SYS_MSG_ID_MC_TIMER; msg.type = SYS_MSG_ID_MC_TIMER;
msg.reserved = SYS_MSG_COOKIE; msg.reserved = SYS_MSG_COOKIE;
msg.callback = target_if_vdev_mgr_rsp_timer_cb; msg.callback = target_if_vdev_mgr_rsp_timer_cb;
msg.bodyptr = arg; msg.bodyptr = vdev_rsp;
msg.bodyval = 0; msg.bodyval = 0;
msg.flush_callback = target_if_vdev_mgr_rsp_flush_cb; msg.flush_callback = target_if_vdev_mgr_rsp_flush_cb;
@@ -214,8 +210,8 @@ target_if_vdev_mgr_rsp_cb_mc_ctx(void *arg)
return; return;
mlme_err("Could not enqueue timer to timer queue"); mlme_err("Could not enqueue timer to timer queue");
if (vdev) if (psoc)
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID);
} }
void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg) void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg)
@@ -243,8 +239,8 @@ static int target_if_vdev_mgr_start_response_handler(ol_scn_t scn,
struct wlan_lmac_if_mlme_rx_ops *rx_ops; struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct vdev_start_response rsp = {0}; struct vdev_start_response rsp = {0};
wmi_host_vdev_start_resp vdev_start_resp; wmi_host_vdev_start_resp vdev_start_resp;
uint8_t vdev_id;
struct vdev_response_timer *vdev_rsp; struct vdev_response_timer *vdev_rsp;
struct wlan_objmgr_vdev *vdev;
if (!scn || !data) { if (!scn || !data) {
mlme_err("Invalid input"); mlme_err("Invalid input");
@@ -274,35 +270,26 @@ static int target_if_vdev_mgr_start_response_handler(ol_scn_t scn,
return -EINVAL; return -EINVAL;
} }
vdev = wlan_objmgr_get_vdev_by_id_from_psoc( vdev_id = vdev_start_resp.vdev_id;
psoc, vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
vdev_start_resp.vdev_id,
WLAN_VDEV_TARGET_IF_ID);
if (!vdev) {
mlme_err("PSOC_%d :VDEV_%d is NULL", psoc->soc_objmgr.psoc_id,
vdev_start_resp.vdev_id);
return -EINVAL;
}
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
if (!vdev_rsp) { if (!vdev_rsp) {
mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL", mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
psoc->soc_objmgr.psoc_id, vdev_start_resp.vdev_id); vdev_id, wlan_psoc_get_id(psoc));
goto release_vdev_target_if_ref; return -EINVAL;
} }
if (vdev_start_resp.resp_type == WMI_HOST_VDEV_RESTART_RESP_EVENT) if (vdev_start_resp.resp_type == WMI_HOST_VDEV_RESTART_RESP_EVENT)
status = target_if_vdev_mgr_rsp_timer_stop( status = target_if_vdev_mgr_rsp_timer_stop(
vdev, vdev_rsp, psoc, vdev_rsp,
RESTART_RESPONSE_BIT); RESTART_RESPONSE_BIT);
else else
status = target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, status = target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
START_RESPONSE_BIT); START_RESPONSE_BIT);
if (QDF_IS_STATUS_ERROR(status)) { if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed", mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
psoc->soc_objmgr.psoc_id, vdev_start_resp.vdev_id); psoc->soc_objmgr.psoc_id, vdev_id);
goto release_vdev_target_if_ref; goto err;
} }
rsp.vdev_id = vdev_start_resp.vdev_id; rsp.vdev_id = vdev_start_resp.vdev_id;
@@ -317,8 +304,7 @@ static int target_if_vdev_mgr_start_response_handler(ol_scn_t scn,
status = rx_ops->vdev_mgr_start_response(psoc, &rsp); status = rx_ops->vdev_mgr_start_response(psoc, &rsp);
release_vdev_target_if_ref: err:
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
return qdf_status_to_os_return(status); return qdf_status_to_os_return(status);
} }
@@ -333,7 +319,6 @@ static int target_if_vdev_mgr_stop_response_handler(ol_scn_t scn,
struct vdev_stop_response rsp = {0}; struct vdev_stop_response rsp = {0};
uint32_t vdev_id; uint32_t vdev_id;
struct vdev_response_timer *vdev_rsp; struct vdev_response_timer *vdev_rsp;
struct wlan_objmgr_vdev *vdev;
if (!scn || !data) { if (!scn || !data) {
mlme_err("Invalid input"); mlme_err("Invalid input");
@@ -363,37 +348,26 @@ static int target_if_vdev_mgr_stop_response_handler(ol_scn_t scn,
return -EINVAL; return -EINVAL;
} }
vdev = wlan_objmgr_get_vdev_by_id_from_psoc( vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
psoc, if (!vdev_rsp) {
vdev_id, mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
WLAN_VDEV_TARGET_IF_ID); vdev_id, wlan_psoc_get_id(psoc));
if (!vdev) {
mlme_err("PSOC_%d: VDEV_%d is NULL", psoc->soc_objmgr.psoc_id,
vdev_id);
return -EINVAL; return -EINVAL;
} }
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); status = target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
if (!vdev_rsp) {
mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL",
psoc->soc_objmgr.psoc_id, vdev_id);
goto release_vdev_target_if_ref;
}
status = target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
STOP_RESPONSE_BIT); STOP_RESPONSE_BIT);
if (QDF_IS_STATUS_ERROR(status)) { if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed", mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
psoc->soc_objmgr.psoc_id, vdev_id); psoc->soc_objmgr.psoc_id, vdev_id);
goto release_vdev_target_if_ref; goto err;
} }
rsp.vdev_id = vdev_id; rsp.vdev_id = vdev_id;
status = rx_ops->vdev_mgr_stop_response(psoc, &rsp); status = rx_ops->vdev_mgr_stop_response(psoc, &rsp);
release_vdev_target_if_ref: err:
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
return qdf_status_to_os_return(status); return qdf_status_to_os_return(status);
} }
@@ -408,7 +382,6 @@ static int target_if_vdev_mgr_delete_response_handler(ol_scn_t scn,
struct vdev_delete_response rsp = {0}; struct vdev_delete_response rsp = {0};
struct wmi_host_vdev_delete_resp vdev_del_resp; struct wmi_host_vdev_delete_resp vdev_del_resp;
struct vdev_response_timer *vdev_rsp; struct vdev_response_timer *vdev_rsp;
struct wlan_objmgr_vdev *vdev;
if (!scn || !data) { if (!scn || !data) {
mlme_err("Invalid input"); mlme_err("Invalid input");
@@ -438,38 +411,28 @@ static int target_if_vdev_mgr_delete_response_handler(ol_scn_t scn,
return -EINVAL; return -EINVAL;
} }
vdev = wlan_objmgr_get_vdev_by_id_from_psoc( vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
psoc,
vdev_del_resp.vdev_id,
WLAN_VDEV_TARGET_IF_ID);
if (!vdev) {
mlme_err("PSOC_%d: VDEV_%d is NULL", psoc->soc_objmgr.psoc_id,
vdev_del_resp.vdev_id); vdev_del_resp.vdev_id);
if (!vdev_rsp) {
mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
vdev_del_resp.vdev_id, wlan_psoc_get_id(psoc));
return -EINVAL; return -EINVAL;
} }
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
if (!vdev_rsp) {
mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL",
psoc->soc_objmgr.psoc_id, vdev_del_resp.vdev_id);
goto release_vdev_target_if_ref;
}
status = target_if_vdev_mgr_rsp_timer_stop( status = target_if_vdev_mgr_rsp_timer_stop(
vdev, vdev_rsp, psoc, vdev_rsp,
DELETE_RESPONSE_BIT); DELETE_RESPONSE_BIT);
if (QDF_IS_STATUS_ERROR(status)) { if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed", mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
psoc->soc_objmgr.psoc_id, vdev_del_resp.vdev_id); wlan_psoc_get_id(psoc), vdev_del_resp.vdev_id);
goto release_vdev_target_if_ref; goto err;
} }
rsp.vdev_id = vdev_del_resp.vdev_id; rsp.vdev_id = vdev_del_resp.vdev_id;
status = rx_ops->vdev_mgr_delete_response(psoc, &rsp); status = rx_ops->vdev_mgr_delete_response(psoc, &rsp);
release_vdev_target_if_ref: err:
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
return qdf_status_to_os_return(status); return qdf_status_to_os_return(status);
} }
@@ -486,7 +449,6 @@ static int target_if_vdev_mgr_peer_delete_all_response_handler(
struct wmi_host_vdev_peer_delete_all_response_event struct wmi_host_vdev_peer_delete_all_response_event
vdev_peer_del_all_resp; vdev_peer_del_all_resp;
struct vdev_response_timer *vdev_rsp; struct vdev_response_timer *vdev_rsp;
struct wlan_objmgr_vdev *vdev;
if (!scn || !data) { if (!scn || !data) {
mlme_err("Invalid input"); mlme_err("Invalid input");
@@ -518,41 +480,32 @@ static int target_if_vdev_mgr_peer_delete_all_response_handler(
return -EINVAL; return -EINVAL;
} }
vdev = wlan_objmgr_get_vdev_by_id_from_psoc( vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
psoc,
vdev_peer_del_all_resp.vdev_id,
WLAN_VDEV_TARGET_IF_ID);
if (!vdev) {
mlme_err("PSOC_%d: VDEV_%d is NULL", psoc->soc_objmgr.psoc_id,
vdev_peer_del_all_resp.vdev_id); vdev_peer_del_all_resp.vdev_id);
if (!vdev_rsp) {
mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
vdev_peer_del_all_resp.vdev_id,
wlan_psoc_get_id(psoc));
return -EINVAL; return -EINVAL;
} }
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
if (!vdev_rsp) {
mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL",
psoc->soc_objmgr.psoc_id,
vdev_peer_del_all_resp.vdev_id);
goto release_vdev_target_if_ref;
}
status = target_if_vdev_mgr_rsp_timer_stop( status = target_if_vdev_mgr_rsp_timer_stop(
vdev, vdev_rsp, psoc,
vdev_rsp,
PEER_DELETE_ALL_RESPONSE_BIT); PEER_DELETE_ALL_RESPONSE_BIT);
if (QDF_IS_STATUS_ERROR(status)) { if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed", mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
psoc->soc_objmgr.psoc_id, psoc->soc_objmgr.psoc_id,
vdev_peer_del_all_resp.vdev_id); vdev_peer_del_all_resp.vdev_id);
goto release_vdev_target_if_ref; goto err;
} }
rsp.vdev_id = vdev_peer_del_all_resp.vdev_id; rsp.vdev_id = vdev_peer_del_all_resp.vdev_id;
rsp.status = vdev_peer_del_all_resp.status; rsp.status = vdev_peer_del_all_resp.status;
status = rx_ops->vdev_mgr_peer_delete_all_response(psoc, &rsp); status = rx_ops->vdev_mgr_peer_delete_all_response(psoc, &rsp);
release_vdev_target_if_ref: err:
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
return qdf_status_to_os_return(status); return qdf_status_to_os_return(status);
} }

View File

@@ -37,6 +37,7 @@
#include <wlan_cmn.h> #include <wlan_cmn.h>
#include <wmi_unified_vdev_api.h> #include <wmi_unified_vdev_api.h>
#include <cdp_txrx_ctrl.h> #include <cdp_txrx_ctrl.h>
#include <target_if_psoc_timer_tx_ops.h>
static QDF_STATUS target_if_vdev_mgr_register_event_handler( static QDF_STATUS target_if_vdev_mgr_register_event_handler(
struct wlan_objmgr_psoc *psoc) struct wlan_objmgr_psoc *psoc)
@@ -50,25 +51,20 @@ static QDF_STATUS target_if_vdev_mgr_unregister_event_handler(
return target_if_vdev_mgr_wmi_event_unregister(psoc); return target_if_vdev_mgr_wmi_event_unregister(psoc);
} }
static QDF_STATUS target_if_vdev_mgr_rsp_timer_mod( QDF_STATUS
struct wlan_objmgr_vdev *vdev, target_if_vdev_mgr_rsp_timer_stop(struct wlan_objmgr_psoc *psoc,
struct vdev_response_timer *vdev_rsp, struct vdev_response_timer *vdev_rsp,
int mseconds) enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit)
{ {
if (!vdev || !vdev_rsp) { struct wlan_lmac_if_mlme_tx_ops *txops;
mlme_err("Invalid input");
txops = target_if_vdev_mgr_get_tx_ops(psoc);
if (!txops || !txops->psoc_vdev_rsp_timer_deinit) {
mlme_err("Failed to get mlme txrx_ops VDEV_%d PSOC_%d",
vdev_rsp->vdev_id, wlan_psoc_get_id(psoc));
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
qdf_timer_mod(&vdev_rsp->rsp_timer, mseconds);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS target_if_vdev_mgr_rsp_timer_stop(
struct wlan_objmgr_vdev *vdev,
struct vdev_response_timer *vdev_rsp,
uint8_t clear_bit)
{
if (qdf_atomic_test_and_clear_bit(clear_bit, &vdev_rsp->rsp_status)) { if (qdf_atomic_test_and_clear_bit(clear_bit, &vdev_rsp->rsp_status)) {
/* /*
* This is triggered from timer expiry case only for * This is triggered from timer expiry case only for
@@ -78,46 +74,43 @@ QDF_STATUS target_if_vdev_mgr_rsp_timer_stop(
qdf_timer_stop(&vdev_rsp->rsp_timer); qdf_timer_stop(&vdev_rsp->rsp_timer);
vdev_rsp->timer_status = QDF_STATUS_SUCCESS; vdev_rsp->timer_status = QDF_STATUS_SUCCESS;
if (clear_bit == DELETE_RESPONSE_BIT)
txops->psoc_vdev_rsp_timer_deinit(psoc,
vdev_rsp->vdev_id);
/* /*
* Releasing reference taken at the time of * Releasing reference taken at the time of
* starting response timer * starting response timer
*/ */
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
static QDF_STATUS target_if_vdev_mgr_rsp_timer_start( static QDF_STATUS target_if_vdev_mgr_rsp_timer_start(
struct wlan_objmgr_vdev *vdev, struct wlan_objmgr_psoc *psoc,
struct vdev_response_timer *vdev_rsp, struct vdev_response_timer *vdev_rsp,
uint8_t set_bit) enum wlan_vdev_mgr_tgt_if_rsp_bit set_bit)
{ {
uint8_t vdev_id;
uint8_t rsp_pos; uint8_t rsp_pos;
struct wlan_objmgr_psoc *psoc; uint8_t vdev_id;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
mlme_err("PSOC is NULL");
return QDF_STATUS_E_INVAL;
}
vdev_id = wlan_vdev_get_id(vdev);
/* it is expected to be only one command with FW at a time */ /* it is expected to be only one command with FW at a time */
for (rsp_pos = START_RESPONSE_BIT; rsp_pos <= RESPONSE_BIT_MAX; for (rsp_pos = START_RESPONSE_BIT; rsp_pos <= RESPONSE_BIT_MAX;
rsp_pos++) { rsp_pos++) {
if (rsp_pos != set_bit) { if (rsp_pos != set_bit) {
if (qdf_atomic_test_bit(rsp_pos, if (qdf_atomic_test_bit(rsp_pos,
&vdev_rsp->rsp_status)) { &vdev_rsp->rsp_status)) {
vdev_id = vdev_rsp->vdev_id;
mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response", mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response",
wlan_psoc_get_id(psoc), wlan_psoc_get_id(psoc),
vdev_id, string_from_rsp_bit(set_bit), vdev_id,
string_from_rsp_bit(set_bit),
string_from_rsp_bit(rsp_pos)); string_from_rsp_bit(rsp_pos));
target_if_vdev_mgr_assert_mgmt(vdev, vdev_rsp, target_if_vdev_mgr_assert_mgmt(psoc,
rsp_pos); vdev_id);
target_if_vdev_mgr_rsp_timer_stop(vdev, target_if_vdev_mgr_rsp_timer_stop(psoc,
vdev_rsp, vdev_rsp,
rsp_pos); rsp_pos);
} }
@@ -127,39 +120,21 @@ static QDF_STATUS target_if_vdev_mgr_rsp_timer_start(
if (qdf_atomic_test_and_set_bit(set_bit, &vdev_rsp->rsp_status)) { if (qdf_atomic_test_and_set_bit(set_bit, &vdev_rsp->rsp_status)) {
mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response", mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response",
wlan_psoc_get_id(psoc), wlan_psoc_get_id(psoc),
vdev_id, string_from_rsp_bit(set_bit), vdev_rsp->vdev_id, string_from_rsp_bit(set_bit),
string_from_rsp_bit(set_bit)); string_from_rsp_bit(set_bit));
target_if_vdev_mgr_assert_mgmt(vdev, vdev_rsp, target_if_vdev_mgr_assert_mgmt(psoc, vdev_rsp->vdev_id);
set_bit); target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, set_bit);
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, set_bit);
qdf_atomic_set_bit(set_bit, &vdev_rsp->rsp_status); qdf_atomic_set_bit(set_bit, &vdev_rsp->rsp_status);
} }
/* reference taken for timer start, will be released with stop */ /* reference taken for timer start, will be released with stop */
wlan_objmgr_vdev_get_ref(vdev, WLAN_VDEV_TARGET_IF_ID); wlan_objmgr_psoc_get_ref(psoc, WLAN_PSOC_TARGET_IF_ID);
qdf_timer_start(&vdev_rsp->rsp_timer, vdev_rsp->expire_time); qdf_timer_start(&vdev_rsp->rsp_timer, vdev_rsp->expire_time);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
static QDF_STATUS target_if_vdev_mgr_rsp_timer_init(
struct wlan_objmgr_vdev *vdev,
qdf_timer_t *rsp_timer)
{
if (!vdev || !rsp_timer) {
mlme_err("Invalid input");
return QDF_STATUS_E_INVAL;
}
qdf_timer_init(NULL, rsp_timer,
target_if_vdev_mgr_rsp_timer_mgmt_cb,
(void *)vdev, QDF_TIMER_TYPE_WAKE_APPS);
mlme_debug("VDEV_%d: Response timer initialized",
wlan_vdev_get_id(vdev));
return QDF_STATUS_SUCCESS;
}
struct wmi_unified struct wmi_unified
*target_if_vdev_mgr_wmi_handle_get(struct wlan_objmgr_vdev *vdev) *target_if_vdev_mgr_wmi_handle_get(struct wlan_objmgr_vdev *vdev)
@@ -390,12 +365,29 @@ static QDF_STATUS target_if_vdev_mgr_create_send(
QDF_STATUS status; QDF_STATUS status;
struct wmi_unified *wmi_handle; struct wmi_unified *wmi_handle;
uint8_t vap_addr[QDF_MAC_ADDR_SIZE] = {0}; uint8_t vap_addr[QDF_MAC_ADDR_SIZE] = {0};
struct wlan_lmac_if_mlme_tx_ops *txops;
struct wlan_objmgr_psoc *psoc;
uint8_t vdev_id;
if (!vdev || !param) { if (!vdev || !param) {
mlme_err("Invalid input"); mlme_err("Invalid input");
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
mlme_err("Failed to get psoc for VDEV_%d",
wlan_vdev_get_id(vdev));
return QDF_STATUS_E_INVAL;
}
txops = wlan_mlme_get_lmac_tx_ops(psoc);
if (!txops || !txops->psoc_vdev_rsp_timer_init) {
mlme_err("Failed to get mlme txrx_ops for VDEV_%d PSOC_%d",
wlan_vdev_get_id(vdev), wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
}
wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
if (!wmi_handle) { if (!wmi_handle) {
mlme_err("Failed to get WMI handle!"); mlme_err("Failed to get WMI handle!");
@@ -406,6 +398,10 @@ static QDF_STATUS target_if_vdev_mgr_create_send(
status = wmi_unified_vdev_create_send(wmi_handle, vap_addr, status = wmi_unified_vdev_create_send(wmi_handle, vap_addr,
param); param);
vdev_id = wlan_vdev_get_id(vdev);
if (QDF_IS_STATUS_SUCCESS(status))
status = txops->psoc_vdev_rsp_timer_init(psoc, vdev_id);
return status; return status;
} }
@@ -417,8 +413,8 @@ static QDF_STATUS target_if_vdev_mgr_start_send(
struct wmi_unified *wmi_handle; struct wmi_unified *wmi_handle;
struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_psoc *psoc;
struct wlan_lmac_if_mlme_rx_ops *rx_ops; struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct vdev_response_timer *vdev_rsp;
uint8_t vdev_id; uint8_t vdev_id;
struct vdev_response_timer *vdev_rsp;
if (!vdev || !param) { if (!vdev || !param) {
mlme_err("Invalid input"); mlme_err("Invalid input");
@@ -434,24 +430,27 @@ static QDF_STATUS target_if_vdev_mgr_start_send(
vdev_id = wlan_vdev_get_id(vdev); vdev_id = wlan_vdev_get_id(vdev);
psoc = wlan_vdev_get_psoc(vdev); psoc = wlan_vdev_get_psoc(vdev);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) { if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("VDEV_%d: No Rx Ops", vdev_id); mlme_err("VEV_%d: PSOC_%d No Rx Ops", vdev_id,
wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) { if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response structure", vdev_id); mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
return QDF_STATUS_E_FAILURE; wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
} }
target_if_wake_lock_timeout_acquire(vdev, START_WAKELOCK);
vdev_rsp->expire_time = START_RESPONSE_TIMER; vdev_rsp->expire_time = START_RESPONSE_TIMER;
target_if_wake_lock_timeout_acquire(vdev, START_WAKELOCK);
if (param->is_restart) if (param->is_restart)
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
RESTART_RESPONSE_BIT); RESTART_RESPONSE_BIT);
else else
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
START_RESPONSE_BIT); START_RESPONSE_BIT);
status = wmi_unified_vdev_start_send(wmi_handle, param); status = wmi_unified_vdev_start_send(wmi_handle, param);
@@ -460,13 +459,12 @@ static QDF_STATUS target_if_vdev_mgr_start_send(
vdev_rsp->expire_time = 0; vdev_rsp->expire_time = 0;
target_if_wake_lock_timeout_release(vdev, START_WAKELOCK); target_if_wake_lock_timeout_release(vdev, START_WAKELOCK);
if (param->is_restart) if (param->is_restart)
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
RESTART_RESPONSE_BIT); RESTART_RESPONSE_BIT);
else else
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
START_RESPONSE_BIT); START_RESPONSE_BIT);
} }
return status; return status;
} }
@@ -492,9 +490,9 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
QDF_STATUS status; QDF_STATUS status;
struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_psoc *psoc;
struct wmi_unified *wmi_handle; struct wmi_unified *wmi_handle;
struct vdev_response_timer *vdev_rsp;
struct wlan_lmac_if_mlme_rx_ops *rx_ops; struct wlan_lmac_if_mlme_rx_ops *rx_ops;
uint8_t vdev_id; uint8_t vdev_id;
struct vdev_response_timer *vdev_rsp;
if (!vdev || !param) { if (!vdev || !param) {
mlme_err("Invalid input"); mlme_err("Invalid input");
@@ -510,19 +508,22 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
vdev_id = wlan_vdev_get_id(vdev); vdev_id = wlan_vdev_get_id(vdev);
psoc = wlan_vdev_get_psoc(vdev); psoc = wlan_vdev_get_psoc(vdev);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) { if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("VDEV_%d: No Rx Ops", vdev_id); mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) { if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response structure", vdev_id); mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
return QDF_STATUS_E_FAILURE; wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
} }
target_if_wake_lock_timeout_acquire(vdev, DELETE_WAKELOCK); target_if_wake_lock_timeout_acquire(vdev, DELETE_WAKELOCK);
vdev_rsp->expire_time = DELETE_RESPONSE_TIMER; vdev_rsp->expire_time = DELETE_RESPONSE_TIMER;
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
DELETE_RESPONSE_BIT); DELETE_RESPONSE_BIT);
status = wmi_unified_vdev_delete_send(wmi_handle, param->vdev_id); status = wmi_unified_vdev_delete_send(wmi_handle, param->vdev_id);
@@ -534,7 +535,7 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
wmi_service_sync_delete_cmds) || wmi_service_sync_delete_cmds) ||
wlan_psoc_nif_feat_cap_get(psoc, wlan_psoc_nif_feat_cap_get(psoc,
WLAN_SOC_F_TESTMODE_ENABLE)) { WLAN_SOC_F_TESTMODE_ENABLE)) {
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
DELETE_RESPONSE_BIT); DELETE_RESPONSE_BIT);
target_if_vdev_mgr_delete_response_send(vdev, rx_ops); target_if_vdev_mgr_delete_response_send(vdev, rx_ops);
} }
@@ -542,10 +543,9 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
target_if_wake_lock_timeout_release(vdev, DELETE_WAKELOCK); target_if_wake_lock_timeout_release(vdev, DELETE_WAKELOCK);
vdev_rsp->expire_time = 0; vdev_rsp->expire_time = 0;
vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
DELETE_RESPONSE_BIT); DELETE_RESPONSE_BIT);
} }
return status; return status;
} }
@@ -557,8 +557,9 @@ static QDF_STATUS target_if_vdev_mgr_stop_send(
struct wmi_unified *wmi_handle; struct wmi_unified *wmi_handle;
struct wlan_lmac_if_mlme_rx_ops *rx_ops; struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_psoc *psoc;
struct vdev_response_timer *vdev_rsp;
uint8_t vdev_id; uint8_t vdev_id;
struct vdev_response_timer *vdev_rsp;
if (!vdev || !param) { if (!vdev || !param) {
mlme_err("Invalid input"); mlme_err("Invalid input");
@@ -574,31 +575,31 @@ static QDF_STATUS target_if_vdev_mgr_stop_send(
vdev_id = wlan_vdev_get_id(vdev); vdev_id = wlan_vdev_get_id(vdev);
psoc = wlan_vdev_get_psoc(vdev); psoc = wlan_vdev_get_psoc(vdev);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) { mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
mlme_err("VDEV_%d: No Rx Ops", vdev_id); wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) { if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response structure", vdev_id); mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
return QDF_STATUS_E_FAILURE; wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
} }
target_if_wake_lock_timeout_acquire(vdev, STOP_WAKELOCK); target_if_wake_lock_timeout_acquire(vdev, STOP_WAKELOCK);
vdev_rsp->expire_time = STOP_RESPONSE_TIMER; vdev_rsp->expire_time = STOP_RESPONSE_TIMER;
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, STOP_RESPONSE_BIT); target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, STOP_RESPONSE_BIT);
status = wmi_unified_vdev_stop_send(wmi_handle, param->vdev_id); status = wmi_unified_vdev_stop_send(wmi_handle, param->vdev_id);
if (QDF_IS_STATUS_ERROR(status)) { if (QDF_IS_STATUS_ERROR(status)) {
vdev_rsp->expire_time = 0; vdev_rsp->expire_time = 0;
vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
target_if_wake_lock_timeout_release(vdev, STOP_WAKELOCK); target_if_wake_lock_timeout_release(vdev, STOP_WAKELOCK);
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
STOP_RESPONSE_BIT); STOP_RESPONSE_BIT);
} }
return status; return status;
} }
@@ -837,15 +838,16 @@ static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref(
{ {
struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_vdev *tvdev; struct wlan_objmgr_vdev *tvdev;
struct vdev_response_timer *vdev_rsp = NULL;
struct wlan_lmac_if_mlme_rx_ops *rx_ops; struct wlan_lmac_if_mlme_rx_ops *rx_ops;
uint32_t vdev_idx; int32_t vdev_idx = -1;
int32_t last_vdev_idx = -1; int32_t last_vdev_idx = -1;
struct vdev_response_timer *vdev_rsp;
psoc = wlan_pdev_get_psoc(pdev); psoc = wlan_pdev_get_psoc(pdev);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!(rx_ops && rx_ops->vdev_mgr_get_response_timer_info)) {
mlme_err("No Rx Ops"); if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("VDEV_%d: No Rx Ops", vdev_idx);
return last_vdev_idx; return last_vdev_idx;
} }
@@ -860,15 +862,16 @@ static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref(
return last_vdev_idx; return last_vdev_idx;
} }
last_vdev_idx = vdev_idx; vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
vdev_rsp = vdev_idx);
rx_ops->vdev_mgr_get_response_timer_info(tvdev);
if (!vdev_rsp) { if (!vdev_rsp) {
mlme_err("VDEV_%d: No Rx Ops", vdev_idx); mlme_err("VDEV_%d PSOC_%d No vdev rsp timer",
vdev_idx, wlan_psoc_get_id(psoc));
return last_vdev_idx; return last_vdev_idx;
} }
target_if_vdev_mgr_rsp_timer_start(tvdev, vdev_rsp, last_vdev_idx = vdev_idx;
target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
RESTART_RESPONSE_BIT); RESTART_RESPONSE_BIT);
vdev_timer_started[vdev_idx] = true; vdev_timer_started[vdev_idx] = true;
} }
@@ -886,19 +889,30 @@ static void target_if_vdev_mgr_multi_vdev_restart_rel_ref(
struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_vdev *tvdev; struct wlan_objmgr_vdev *tvdev;
struct wlan_lmac_if_mlme_rx_ops *rx_ops; struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct vdev_response_timer *vdev_rsp = NULL;
uint32_t vdev_idx; uint32_t vdev_idx;
struct vdev_response_timer *vdev_rsp;
psoc = wlan_pdev_get_psoc(pdev); psoc = wlan_pdev_get_psoc(pdev);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("VDEV_%d: No Rx Ops", last_vdev_idx);
return;
}
for (vdev_idx = 0; vdev_idx <= last_vdev_idx; vdev_idx++) { for (vdev_idx = 0; vdev_idx <= last_vdev_idx; vdev_idx++) {
tvdev = vdev_list[vdev_idx]; tvdev = vdev_list[vdev_idx];
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
vdev_idx);
if (!vdev_rsp) {
mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer",
vdev_idx, wlan_psoc_get_id(psoc));
return;
}
if (QDF_IS_STATUS_ERROR(status)) { if (QDF_IS_STATUS_ERROR(status)) {
vdev_rsp = if (vdev_timer_started[vdev_idx]) {
rx_ops->vdev_mgr_get_response_timer_info(tvdev);
if (vdev_rsp && vdev_timer_started[vdev_idx]) {
target_if_vdev_mgr_rsp_timer_stop( target_if_vdev_mgr_rsp_timer_stop(
tvdev, vdev_rsp, psoc, vdev_rsp,
RESTART_RESPONSE_BIT); RESTART_RESPONSE_BIT);
vdev_timer_started[vdev_idx] = false; vdev_timer_started[vdev_idx] = false;
} }
@@ -1018,8 +1032,8 @@ static QDF_STATUS target_if_vdev_mgr_peer_delete_all_send(
struct wmi_unified *wmi_handle; struct wmi_unified *wmi_handle;
struct wlan_lmac_if_mlme_rx_ops *rx_ops; struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_psoc *psoc;
struct vdev_response_timer *vdev_rsp;
uint8_t vdev_id; uint8_t vdev_id;
struct vdev_response_timer *vdev_rsp;
if (!vdev || !param) { if (!vdev || !param) {
mlme_err("Invalid input"); mlme_err("Invalid input");
@@ -1036,29 +1050,30 @@ static QDF_STATUS target_if_vdev_mgr_peer_delete_all_send(
psoc = wlan_vdev_get_psoc(vdev); psoc = wlan_vdev_get_psoc(vdev);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) { if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("VDEV_%d: No Rx Ops", vdev_id); mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) { if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response structure", vdev_id); mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
return QDF_STATUS_E_FAILURE; wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
} }
vdev_rsp->expire_time = PEER_DELETE_ALL_RESPONSE_TIMER; vdev_rsp->expire_time = PEER_DELETE_ALL_RESPONSE_TIMER;
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
PEER_DELETE_ALL_RESPONSE_BIT); PEER_DELETE_ALL_RESPONSE_BIT);
status = wmi_unified_peer_delete_all_send(wmi_handle, param); status = wmi_unified_peer_delete_all_send(wmi_handle, param);
if (QDF_IS_STATUS_ERROR(status)) { if (QDF_IS_STATUS_ERROR(status)) {
vdev_rsp->expire_time = 0; vdev_rsp->expire_time = 0;
vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
PEER_DELETE_ALL_RESPONSE_BIT); PEER_DELETE_ALL_RESPONSE_BIT);
} }
return status; return status;
} }
@@ -1147,13 +1162,17 @@ target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
target_if_vdev_set_tx_rx_decap_type; target_if_vdev_set_tx_rx_decap_type;
mlme_tx_ops->vdev_sta_ps_param_send = mlme_tx_ops->vdev_sta_ps_param_send =
target_if_vdev_mgr_sta_ps_param_send; target_if_vdev_mgr_sta_ps_param_send;
mlme_tx_ops->vdev_mgr_rsp_timer_init = mlme_tx_ops->psoc_vdev_rsp_timer_mod =
target_if_vdev_mgr_rsp_timer_init;
mlme_tx_ops->vdev_mgr_rsp_timer_mod =
target_if_vdev_mgr_rsp_timer_mod; target_if_vdev_mgr_rsp_timer_mod;
mlme_tx_ops->peer_delete_all_send = mlme_tx_ops->peer_delete_all_send =
target_if_vdev_mgr_peer_delete_all_send; target_if_vdev_mgr_peer_delete_all_send;
target_if_vdev_register_tx_fils(mlme_tx_ops); target_if_vdev_register_tx_fils(mlme_tx_ops);
mlme_tx_ops->psoc_vdev_rsp_timer_init =
target_if_psoc_vdev_rsp_timer_init;
mlme_tx_ops->psoc_vdev_rsp_timer_deinit =
target_if_psoc_vdev_rsp_timer_deinit;
mlme_tx_ops->psoc_vdev_rsp_timer_inuse =
target_if_psoc_vdev_rsp_timer_inuse;
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -256,6 +256,7 @@ typedef void (*wlan_objmgr_peer_status_handler)(
* @WLAN_MISC_ID: power manager, PAPI, rate set, etc. * @WLAN_MISC_ID: power manager, PAPI, rate set, etc.
* @WLAN_FWOL_NB_ID: fw offload northbound operations * @WLAN_FWOL_NB_ID: fw offload northbound operations
* @WLAN_FWOL_SB_ID: fw offload southbound operations * @WLAN_FWOL_SB_ID: fw offload southbound operations
* @WLAN_PSOC_TARGET_IF_ID PSOC related target_if operations
* @WLAN_REF_ID_MAX: Max id used to generate ref count tracking array * @WLAN_REF_ID_MAX: Max id used to generate ref count tracking array
*/ */
/* New value added to the enum must also be reflected in function /* New value added to the enum must also be reflected in function
@@ -334,6 +335,7 @@ typedef enum {
WLAN_MISC_ID = 69, WLAN_MISC_ID = 69,
WLAN_FWOL_NB_ID = 70, WLAN_FWOL_NB_ID = 70,
WLAN_FWOL_SB_ID = 71, WLAN_FWOL_SB_ID = 71,
WLAN_PSOC_TARGET_IF_ID = 72,
WLAN_REF_ID_MAX, WLAN_REF_ID_MAX,
} wlan_objmgr_ref_dbgid; } wlan_objmgr_ref_dbgid;

View File

@@ -185,8 +185,6 @@ enum wlan_mlme_cfg_id;
* @get_wifi_iface_id: function to get wifi interface id * @get_wifi_iface_id: function to get wifi interface id
* @vdev_mlme_attach: function to register events * @vdev_mlme_attach: function to register events
* @vdev_mlme_detach: function to unregister events * @vdev_mlme_detach: function to unregister events
* @vdev_mgr_rsp_timer_init: function to initialize vdev response timer
* @vdev_mgr_rsp_timer_mod: function to timer_mod vdev response timer
* @vdev_create_send: function to send vdev create * @vdev_create_send: function to send vdev create
* @vdev_start_send: function to send vdev start * @vdev_start_send: function to send vdev start
* @vdev_up_send: function to send vdev up * @vdev_up_send: function to send vdev up
@@ -207,18 +205,16 @@ enum wlan_mlme_cfg_id;
* @vdev_bcn_miss_offload_send: function to send beacon miss offload * @vdev_bcn_miss_offload_send: function to send beacon miss offload
* @vdev_sta_ps_param_send: function to sent STA power save config * @vdev_sta_ps_param_send: function to sent STA power save config
* @peer_delete_all_send: function to send vdev delete all peer request * @peer_delete_all_send: function to send vdev delete all peer request
* @psoc_vdev_rsp_timer_init: function to initialize psoc vdev response timer
* @psoc_vdev_rsp_timer_deinit: function to deinitialize psoc vdev rsp timer
* @psoc_vdev_rsp_timer_inuse: function to determine whether the vdev rsp
* timer is inuse or not
* @psoc_vdev_rsp_timer_mod: function to modify the time of vdev rsp timer
*/ */
struct wlan_lmac_if_mlme_tx_ops { struct wlan_lmac_if_mlme_tx_ops {
uint32_t (*get_wifi_iface_id) (struct wlan_objmgr_pdev *pdev); uint32_t (*get_wifi_iface_id) (struct wlan_objmgr_pdev *pdev);
QDF_STATUS (*vdev_mlme_attach)(struct wlan_objmgr_psoc *psoc); QDF_STATUS (*vdev_mlme_attach)(struct wlan_objmgr_psoc *psoc);
QDF_STATUS (*vdev_mlme_detach)(struct wlan_objmgr_psoc *psoc); QDF_STATUS (*vdev_mlme_detach)(struct wlan_objmgr_psoc *psoc);
QDF_STATUS (*vdev_mgr_rsp_timer_init)(
struct wlan_objmgr_vdev *vdev,
qdf_timer_t *rsp_timer);
QDF_STATUS (*vdev_mgr_rsp_timer_mod)(
struct wlan_objmgr_vdev *vdev,
struct vdev_response_timer *vdev_rsp,
int mseconds);
QDF_STATUS (*vdev_create_send)(struct wlan_objmgr_vdev *vdev, QDF_STATUS (*vdev_create_send)(struct wlan_objmgr_vdev *vdev,
struct vdev_create_params *param); struct vdev_create_params *param);
QDF_STATUS (*vdev_start_send)(struct wlan_objmgr_vdev *vdev, QDF_STATUS (*vdev_start_send)(struct wlan_objmgr_vdev *vdev,
@@ -272,6 +268,20 @@ struct wlan_lmac_if_mlme_tx_ops {
QDF_STATUS (*peer_delete_all_send)( QDF_STATUS (*peer_delete_all_send)(
struct wlan_objmgr_vdev *vdev, struct wlan_objmgr_vdev *vdev,
struct peer_delete_all_params *param); struct peer_delete_all_params *param);
QDF_STATUS (*psoc_vdev_rsp_timer_init)(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
void (*psoc_vdev_rsp_timer_deinit)(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
QDF_STATUS (*psoc_vdev_rsp_timer_inuse)(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
QDF_STATUS (*psoc_vdev_rsp_timer_mod)(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
int mseconds);
}; };
/** /**
@@ -1489,7 +1499,6 @@ struct wlan_lmac_if_dfs_rx_ops {
/** /**
* struct wlan_lmac_if_mlme_rx_ops: Function pointer to call MLME functions * struct wlan_lmac_if_mlme_rx_ops: Function pointer to call MLME functions
* @vdev_mgr_get_response_timer_info: function to get response timer info
* @vdev_mgr_start_response: function to handle start response * @vdev_mgr_start_response: function to handle start response
* @vdev_mgr_stop_response: function to handle stop response * @vdev_mgr_stop_response: function to handle stop response
* @vdev_mgr_delete_response: function to handle delete response * @vdev_mgr_delete_response: function to handle delete response
@@ -1499,10 +1508,10 @@ struct wlan_lmac_if_dfs_rx_ops {
* @vdev_mgr_peer_delete_all_response: function to handle vdev delete all peer * @vdev_mgr_peer_delete_all_response: function to handle vdev delete all peer
* event * event
* @vdev_mgr_get_wakelock_info: function to get wakelock info * @vdev_mgr_get_wakelock_info: function to get wakelock info
* @psoc_get_vdev_response_timer_info: function to get vdev response timer
* structure for a specific vdev id
*/ */
struct wlan_lmac_if_mlme_rx_ops { struct wlan_lmac_if_mlme_rx_ops {
struct vdev_response_timer *(*vdev_mgr_get_response_timer_info)(
struct wlan_objmgr_vdev *vdev);
QDF_STATUS (*vdev_mgr_start_response)( QDF_STATUS (*vdev_mgr_start_response)(
struct wlan_objmgr_psoc *psoc, struct wlan_objmgr_psoc *psoc,
struct vdev_start_response *rsp); struct vdev_start_response *rsp);
@@ -1525,6 +1534,9 @@ struct wlan_lmac_if_mlme_rx_ops {
struct vdev_mlme_wakelock *(*vdev_mgr_get_wakelock_info)( struct vdev_mlme_wakelock *(*vdev_mgr_get_wakelock_info)(
struct wlan_objmgr_vdev *vdev); struct wlan_objmgr_vdev *vdev);
#endif #endif
struct vdev_response_timer *(*psoc_get_vdev_response_timer_info)(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
}; };
#ifdef WLAN_SUPPORT_GREEN_AP #ifdef WLAN_SUPPORT_GREEN_AP

View File

@@ -21,15 +21,19 @@
#define _WLAN_PSOC_MLME_H_ #define _WLAN_PSOC_MLME_H_
#include <wlan_ext_mlme_obj_types.h> #include <wlan_ext_mlme_obj_types.h>
#include <wlan_vdev_mgr_tgt_if_rx_defs.h>
#include <qdf_timer.h>
/** /**
* struct psoc_mlme_obj - PSOC MLME component object * struct psoc_mlme_obj - PSoC MLME component object
* @psoc: PSOC object * @psoc: PSoC object
* @ext_psoc_ptr: extended psoc mlme pointer * @ext_psoc_ptr: PSoC legacy pointer
* @psoc_vdev_rt: PSoC Vdev response timer
*/ */
struct psoc_mlme_obj { struct psoc_mlme_obj {
struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_psoc *psoc;
mlme_psoc_ext_t *ext_psoc_ptr; mlme_psoc_ext_t *ext_psoc_ptr;
struct vdev_response_timer psoc_vdev_rt[WLAN_UMAC_PSOC_MAX_VDEVS];
}; };
#endif #endif

View File

@@ -567,7 +567,6 @@ struct vdev_mlme_obj {
struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_vdev *vdev;
struct vdev_mlme_ops *ops; struct vdev_mlme_ops *ops;
mlme_vdev_ext_t *ext_vdev_ptr; mlme_vdev_ext_t *ext_vdev_ptr;
struct vdev_response_timer vdev_rt;
#ifdef FEATURE_VDEV_RSP_WAKELOCK #ifdef FEATURE_VDEV_RSP_WAKELOCK
struct vdev_mlme_wakelock vdev_wakelock; struct vdev_mlme_wakelock vdev_wakelock;
#endif #endif

View File

@@ -40,4 +40,12 @@ QDF_STATUS wlan_psoc_mlme_init(void);
*/ */
QDF_STATUS wlan_psoc_mlme_deinit(void); QDF_STATUS wlan_psoc_mlme_deinit(void);
/**
* mlme_psoc_get_priv: get MLME priv object from psoc object
* @psoc: pointer to psoc object
*
* Return: pointer to MLME psoc private object
*/
struct psoc_mlme_obj *mlme_psoc_get_priv(struct wlan_objmgr_psoc *psoc);
#endif #endif

View File

@@ -26,6 +26,20 @@
#include <wlan_psoc_mlme_main.h> #include <wlan_psoc_mlme_main.h>
#include <wlan_psoc_mlme_api.h> #include <wlan_psoc_mlme_api.h>
struct psoc_mlme_obj *mlme_psoc_get_priv(struct wlan_objmgr_psoc *psoc)
{
struct psoc_mlme_obj *psoc_mlme;
psoc_mlme = wlan_objmgr_psoc_get_comp_private_obj(psoc,
WLAN_UMAC_COMP_MLME);
if (!psoc_mlme) {
mlme_err("PSOC MLME component object is NULL");
return NULL;
}
return psoc_mlme;
}
static QDF_STATUS mlme_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc, static QDF_STATUS mlme_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc,
void *arg) void *arg)
{ {
@@ -67,8 +81,7 @@ static QDF_STATUS mlme_psoc_obj_destroy_handler(struct wlan_objmgr_psoc *psoc,
{ {
struct psoc_mlme_obj *psoc_mlme; struct psoc_mlme_obj *psoc_mlme;
psoc_mlme = wlan_objmgr_psoc_get_comp_private_obj(psoc, psoc_mlme = mlme_psoc_get_priv(psoc);
WLAN_UMAC_COMP_MLME);
if (!psoc_mlme) { if (!psoc_mlme) {
mlme_err("PSOC MLME component object is NULL"); mlme_err("PSOC MLME component object is NULL");
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;

View File

@@ -22,23 +22,28 @@
#include <wlan_objmgr_global_obj.h> #include <wlan_objmgr_global_obj.h>
#include <wlan_objmgr_vdev_obj.h> #include <wlan_objmgr_vdev_obj.h>
#include <wlan_mlme_dbg.h> #include <wlan_mlme_dbg.h>
#include "include/wlan_mlme_cmn.h" #include <include/wlan_mlme_cmn.h>
#include "include/wlan_vdev_mlme.h" #include <include/wlan_vdev_mlme.h>
#include "include/wlan_pdev_mlme.h" #include <include/wlan_pdev_mlme.h>
#include "vdev_mgr/core/src/vdev_mlme_sm.h" #include <vdev_mgr/core/src/vdev_mlme_sm.h>
#include "wlan_pdev_mlme_api.h" #include <wlan_pdev_mlme_api.h>
#include "wlan_vdev_mlme_api.h" #include <wlan_vdev_mlme_api.h>
#include "wlan_serialization_api.h" #include <wlan_serialization_api.h>
#include "wlan_utility.h" #include <wlan_utility.h>
#include <cdp_txrx_cmn.h> #include <cdp_txrx_cmn.h>
#include "target_if_vdev_mgr_wake_lock.h" #include <target_if_vdev_mgr_wake_lock.h>
#include <wlan_lmac_if_def.h>
#include <target_if_vdev_mgr_tx_ops.h>
static QDF_STATUS mlme_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev, static QDF_STATUS mlme_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev,
void *arg) void *arg)
{ {
struct vdev_mlme_obj *vdev_mlme; struct vdev_mlme_obj *vdev_mlme;
struct wlan_objmgr_pdev *pdev; struct wlan_objmgr_pdev *pdev;
struct wlan_objmgr_psoc *psoc;
struct pdev_mlme_obj *pdev_mlme; struct pdev_mlme_obj *pdev_mlme;
struct wlan_lmac_if_mlme_tx_ops *txops;
QDF_STATUS status;
if (!vdev) { if (!vdev) {
mlme_err(" VDEV is NULL"); mlme_err(" VDEV is NULL");
@@ -51,6 +56,30 @@ static QDF_STATUS mlme_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev,
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
/**
* 1st check whether for this vdev any vdev commands are pending for
* response.
*/
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc) {
mlme_err("PSOC is NULL");
return QDF_STATUS_E_FAILURE;
}
txops = target_if_vdev_mgr_get_tx_ops(psoc);
if (!txops || !txops->psoc_vdev_rsp_timer_inuse) {
mlme_err("Failed to get mlme txrx_ops PSOC_%d",
wlan_psoc_get_id(psoc));
return QDF_STATUS_E_FAILURE;
}
status = txops->psoc_vdev_rsp_timer_inuse(psoc, wlan_vdev_get_id(vdev));
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("The vdev response is pending for VDEV_%d status:%d",
wlan_vdev_get_id(vdev), status);
return QDF_STATUS_E_FAILURE;
}
pdev_mlme = wlan_pdev_mlme_get_cmpt_obj(pdev); pdev_mlme = wlan_pdev_mlme_get_cmpt_obj(pdev);
if (!pdev_mlme) { if (!pdev_mlme) {
mlme_err("PDEV MLME is NULL"); mlme_err("PDEV MLME is NULL");
@@ -105,15 +134,6 @@ init_failed:
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
static void mlme_vdev_obj_timer_deinit(
struct vdev_mlme_obj *vdev_mlme)
{
struct vdev_response_timer *vdev_rsp;
vdev_rsp = &vdev_mlme->vdev_rt;
qdf_timer_free(&vdev_rsp->rsp_timer);
}
static QDF_STATUS mlme_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev, static QDF_STATUS mlme_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev,
void *arg) void *arg)
{ {
@@ -143,8 +163,6 @@ static QDF_STATUS mlme_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev,
NULL, NULL); NULL, NULL);
} }
mlme_vdev_obj_timer_deinit(vdev_mlme);
mlme_vdev_sm_destroy(vdev_mlme); mlme_vdev_sm_destroy(vdev_mlme);
mlme_vdev_ops_ext_hdl_destroy(vdev_mlme); mlme_vdev_ops_ext_hdl_destroy(vdev_mlme);

View File

@@ -81,16 +81,22 @@ static inline char *string_from_rsp_bit(enum wlan_vdev_mgr_tgt_if_rsp_bit bit)
/** /**
* struct vdev_response_timer - vdev mgmt response ops timer * struct vdev_response_timer - vdev mgmt response ops timer
* @psoc: Object manager psoc
* @rsp_timer: VDEV MLME mgmt response timer * @rsp_timer: VDEV MLME mgmt response timer
* @rsp_status: variable to check response status * @rsp_status: variable to check response status
* @expire_time: time to expire timer * @expire_time: time to expire timer
* @timer_status: status of timer * @timer_status: status of timer
* @rsp_timer_inuse: Status bit to inform whether the rsp timer is inuse
* @vdev_id: vdev object id
*/ */
struct vdev_response_timer { struct vdev_response_timer {
struct wlan_objmgr_psoc *psoc;
qdf_timer_t rsp_timer; qdf_timer_t rsp_timer;
unsigned long rsp_status; unsigned long rsp_status;
uint32_t expire_time; uint32_t expire_time;
QDF_STATUS timer_status; QDF_STATUS timer_status;
qdf_atomic_t rsp_timer_inuse;
uint8_t vdev_id;
}; };
/** /**

View File

@@ -28,19 +28,23 @@
#include <wlan_mlme_dbg.h> #include <wlan_mlme_dbg.h>
#include <wlan_vdev_mlme_api.h> #include <wlan_vdev_mlme_api.h>
#include <target_if_vdev_mgr_tx_ops.h> #include <target_if_vdev_mgr_tx_ops.h>
#include <wlan_psoc_mlme_main.h>
#include <include/wlan_psoc_mlme.h>
static struct vdev_response_timer * static struct vdev_response_timer *
tgt_vdev_mgr_get_response_timer_info(struct wlan_objmgr_vdev *vdev) tgt_vdev_mgr_get_response_timer_info(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id)
{ {
struct vdev_mlme_obj *vdev_mlme; struct psoc_mlme_obj *psoc_mlme;
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); psoc_mlme = mlme_psoc_get_priv(psoc);
if (!vdev_mlme) { if (!psoc_mlme) {
mlme_err("VDEV_%d: VDEV_MLME is NULL", wlan_vdev_get_id(vdev)); mlme_err("VDEV_%d PSOC_%d PSOC_MLME is NULL", vdev_id,
wlan_psoc_get_id(psoc));
return NULL; return NULL;
} }
return &vdev_mlme->vdev_rt; return &psoc_mlme->psoc_vdev_rt[vdev_id];
} }
static QDF_STATUS tgt_vdev_mgr_start_response_handler( static QDF_STATUS tgt_vdev_mgr_start_response_handler(
@@ -65,7 +69,8 @@ static QDF_STATUS tgt_vdev_mgr_start_response_handler(
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) { if (!vdev_mlme) {
mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id); mlme_err("VDEV_%d PSOC_%d VDEV_MLME is NULL", rsp->vdev_id,
wlan_psoc_get_id(psoc));
goto tgt_vdev_mgr_start_response_handler_end; goto tgt_vdev_mgr_start_response_handler_end;
} }
@@ -101,7 +106,8 @@ static QDF_STATUS tgt_vdev_mgr_stop_response_handler(
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) { if (!vdev_mlme) {
mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id); mlme_err("VDEV_%d: PSOC_%d VDEV_MLME is NULL", rsp->vdev_id,
wlan_psoc_get_id(psoc));
goto tgt_vdev_mgr_stop_response_handler_end; goto tgt_vdev_mgr_stop_response_handler_end;
} }
@@ -138,7 +144,8 @@ static QDF_STATUS tgt_vdev_mgr_delete_response_handler(
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) { if (!vdev_mlme) {
mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id); mlme_err("VDEV_%d: PSOC_%d VDEV_MLME is NULL", rsp->vdev_id,
wlan_psoc_get_id(psoc));
goto tgt_vdev_mgr_delete_response_handler_end; goto tgt_vdev_mgr_delete_response_handler_end;
} }
@@ -176,7 +183,8 @@ static QDF_STATUS tgt_vdev_mgr_peer_delete_all_response_handler(
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) { if (!vdev_mlme) {
mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id); mlme_err("VDEV_%d: PSOC_%d VDEV_MLME is NULL", rsp->vdev_id,
wlan_psoc_get_id(psoc));
goto tgt_vdev_mgr_peer_delete_all_response_handler_end; goto tgt_vdev_mgr_peer_delete_all_response_handler_end;
} }
@@ -262,8 +270,7 @@ void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
tgt_vdev_mgr_delete_response_handler; tgt_vdev_mgr_delete_response_handler;
mlme_rx_ops->vdev_mgr_peer_delete_all_response = mlme_rx_ops->vdev_mgr_peer_delete_all_response =
tgt_vdev_mgr_peer_delete_all_response_handler; tgt_vdev_mgr_peer_delete_all_response_handler;
mlme_rx_ops->vdev_mgr_get_response_timer_info = mlme_rx_ops->psoc_get_vdev_response_timer_info =
tgt_vdev_mgr_get_response_timer_info; tgt_vdev_mgr_get_response_timer_info;
tgt_vdev_mgr_reg_wakelock_info_rx_op(&rx_ops->mops); tgt_vdev_mgr_reg_wakelock_info_rx_op(&rx_ops->mops);
} }

View File

@@ -63,7 +63,6 @@ QDF_STATUS tgt_vdev_mgr_create_send(
enum wlan_op_subtype cdp_txrx_subtype; enum wlan_op_subtype cdp_txrx_subtype;
uint32_t vdev_id; uint32_t vdev_id;
uint8_t *vdev_addr; uint8_t *vdev_addr;
struct vdev_response_timer *vdev_rsp;
if (!param) { if (!param) {
mlme_err("Invalid input"); mlme_err("Invalid input");
@@ -73,25 +72,27 @@ QDF_STATUS tgt_vdev_mgr_create_send(
vdev = mlme_obj->vdev; vdev = mlme_obj->vdev;
vdev_id = wlan_vdev_get_id(vdev); vdev_id = wlan_vdev_get_id(vdev);
txops = wlan_vdev_mlme_get_lmac_txops(vdev); txops = wlan_vdev_mlme_get_lmac_txops(vdev);
if (!txops || !txops->vdev_create_send || if (!txops || !txops->vdev_create_send) {
!txops->vdev_mgr_rsp_timer_init) { mlme_err("VDEV_%d No Tx Ops", vdev_id);
mlme_err("VDEV_%d: No Tx Ops", vdev_id); return QDF_STATUS_E_INVAL;
}
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
mlme_err("psoc object is NULL");
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
status = txops->vdev_create_send(vdev, param); status = txops->vdev_create_send(vdev, param);
if (QDF_IS_STATUS_SUCCESS(status)) { if (QDF_IS_STATUS_ERROR(status)) {
vdev_rsp = &mlme_obj->vdev_rt; mlme_err("VDEV_%d PSOC_%d Tx Ops Error : %d", vdev_id,
txops->vdev_mgr_rsp_timer_init(vdev, &vdev_rsp->rsp_timer); wlan_psoc_get_id(psoc), status);
} else {
mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
return status; return status;
} }
cdp_txrx_opmode = wlan_util_vdev_get_cdp_txrx_opmode(vdev); cdp_txrx_opmode = wlan_util_vdev_get_cdp_txrx_opmode(vdev);
cdp_txrx_subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev); cdp_txrx_subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev);
vdev_addr = wlan_vdev_mlme_get_macaddr(vdev); vdev_addr = wlan_vdev_mlme_get_macaddr(vdev);
psoc = wlan_vdev_get_psoc(vdev);
pdev = wlan_vdev_get_pdev(vdev); pdev = wlan_vdev_get_pdev(vdev);
soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
pdev_txrx_handle = wlan_pdev_get_dp_handle(pdev); pdev_txrx_handle = wlan_pdev_get_dp_handle(pdev);
@@ -107,7 +108,6 @@ QDF_STATUS tgt_vdev_mgr_create_send(
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
wlan_vdev_set_dp_handle(vdev, vdev_txrx_handle); wlan_vdev_set_dp_handle(vdev, vdev_txrx_handle);
return status; return status;
} }