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

@@ -51,33 +51,6 @@ static inline bool target_if_vdev_mgr_is_panic_allowed(void)
}
#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
@@ -175,4 +148,12 @@ QDF_STATUS target_if_vdev_mgr_wmi_event_register(
QDF_STATUS target_if_vdev_mgr_wmi_event_unregister(
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__ */

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
* @vdev: pointer to objmgr vdev
* @vdev_rsp: pointer to vdev mlme response timer
* @set_bit: bit to be set
* @PSOC: pointer to objmgr psoc
* @vdev_id: vdev id
*
* Return: NA
*/
#ifdef VDEV_ASSERT_MANAGEMENT
static inline void target_if_vdev_mgr_assert_mgmt(
struct wlan_objmgr_vdev *vdev,
struct vdev_response_timer *vdev_rsp,
uint8_t set_bit)
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id)
{
}
#else
static inline void target_if_vdev_mgr_assert_mgmt(
struct wlan_objmgr_vdev *vdev,
struct vdev_response_timer *vdev_rsp,
uint8_t set_bit)
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id)
{
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
* vdev manager operations
* @vdev: pointer to vdev object
* @vdev_rsp: pointer to response timer
* @clear_bit: acton bit
* @psoc: pointer to psoc object
* @vdev_rsp: vdev response timer
* @clear_bit: enum of wlan_vdev_mgr_tgt_if_rsp_bit
*
* Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
*/
QDF_STATUS target_if_vdev_mgr_rsp_timer_stop(
struct wlan_objmgr_vdev *vdev,
struct vdev_response_timer *vdev_rsp,
uint8_t clear_bit);
struct wlan_objmgr_psoc *psoc,
struct vdev_response_timer *vdev_rsp,
enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit);
#endif /* __TARGET_IF_VDEV_MGR_TX_OPS_H__ */

View File

@@ -32,12 +32,10 @@
#include <wlan_vdev_mlme_main.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_lmac_if_mlme_rx_ops *rx_ops;
struct vdev_response_timer *vdev_rsp;
struct crash_inject param;
struct wmi_unified *wmi_handle;
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;
uint16_t rsp_pos = RESPONSE_BIT_MAX;
vdev_id = wlan_vdev_get_id(vdev);
mlme_debug("Response timer expired for VDEV %d", vdev_id);
if (!vdev_rsp) {
mlme_err("Vdev response timer is NULL");
return;
}
psoc = wlan_vdev_get_psoc(vdev);
psoc = vdev_rsp->psoc;
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) {
if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("No Rx Ops");
return;
}
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
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(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(
PEER_DELETE_ALL_RESPONSE_BIT,
&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;
}
@@ -79,7 +86,7 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
&vdev_rsp->rsp_status) ||
qdf_atomic_test_bit(RESTART_RESPONSE_BIT,
&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;
if (qdf_atomic_test_bit(START_RESPONSE_BIT,
&vdev_rsp->rsp_status)) {
@@ -92,31 +99,28 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
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);
} else if (qdf_atomic_test_bit(STOP_RESPONSE_BIT,
&vdev_rsp->rsp_status)) {
rsp_pos = STOP_RESPONSE_BIT;
stop_rsp.vdev_id = wlan_vdev_get_id(vdev);
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos);
stop_rsp.vdev_id = vdev_id;
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
rx_ops->vdev_mgr_stop_response(psoc, &stop_rsp);
} else if (qdf_atomic_test_bit(DELETE_RESPONSE_BIT,
&vdev_rsp->rsp_status)) {
del_rsp.vdev_id = wlan_vdev_get_id(vdev);
del_rsp.vdev_id = vdev_id;
rsp_pos = DELETE_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_delete_response(psoc, &del_rsp);
} else if (qdf_atomic_test_bit(PEER_DELETE_ALL_RESPONSE_BIT,
&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;
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_peer_delete_all_response(
psoc,
@@ -134,7 +138,7 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
}
/* 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) {
mlme_err("PSOC_%d VDEV_%d: Self recovery, %s rsp timeout",
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
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)
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
if (!msg->bodyptr) {
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;
}
@@ -198,12 +187,19 @@ static void
target_if_vdev_mgr_rsp_cb_mc_ctx(void *arg)
{
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.reserved = SYS_MSG_COOKIE;
msg.callback = target_if_vdev_mgr_rsp_timer_cb;
msg.bodyptr = arg;
msg.bodyptr = vdev_rsp;
msg.bodyval = 0;
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;
mlme_err("Could not enqueue timer to timer queue");
if (vdev)
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
if (psoc)
wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID);
}
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 vdev_start_response rsp = {0};
wmi_host_vdev_start_resp vdev_start_resp;
uint8_t vdev_id;
struct vdev_response_timer *vdev_rsp;
struct wlan_objmgr_vdev *vdev;
if (!scn || !data) {
mlme_err("Invalid input");
@@ -274,35 +270,26 @@ static int target_if_vdev_mgr_start_response_handler(ol_scn_t scn,
return -EINVAL;
}
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(
psoc,
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);
vdev_id = vdev_start_resp.vdev_id;
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) {
mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL",
psoc->soc_objmgr.psoc_id, vdev_start_resp.vdev_id);
goto release_vdev_target_if_ref;
mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
vdev_id, wlan_psoc_get_id(psoc));
return -EINVAL;
}
if (vdev_start_resp.resp_type == WMI_HOST_VDEV_RESTART_RESP_EVENT)
status = target_if_vdev_mgr_rsp_timer_stop(
vdev, vdev_rsp,
psoc, vdev_rsp,
RESTART_RESPONSE_BIT);
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);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
psoc->soc_objmgr.psoc_id, vdev_start_resp.vdev_id);
goto release_vdev_target_if_ref;
psoc->soc_objmgr.psoc_id, vdev_id);
goto err;
}
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);
release_vdev_target_if_ref:
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
err:
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};
uint32_t vdev_id;
struct vdev_response_timer *vdev_rsp;
struct wlan_objmgr_vdev *vdev;
if (!scn || !data) {
mlme_err("Invalid input");
@@ -363,37 +348,26 @@ static int target_if_vdev_mgr_stop_response_handler(ol_scn_t scn,
return -EINVAL;
}
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(
psoc,
vdev_id,
WLAN_VDEV_TARGET_IF_ID);
if (!vdev) {
mlme_err("PSOC_%d: VDEV_%d is NULL", psoc->soc_objmgr.psoc_id,
vdev_id);
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) {
mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
vdev_id, wlan_psoc_get_id(psoc));
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_id);
goto release_vdev_target_if_ref;
}
status = target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
status = target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
STOP_RESPONSE_BIT);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
psoc->soc_objmgr.psoc_id, vdev_id);
goto release_vdev_target_if_ref;
goto err;
}
rsp.vdev_id = vdev_id;
status = rx_ops->vdev_mgr_stop_response(psoc, &rsp);
release_vdev_target_if_ref:
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
err:
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 wmi_host_vdev_delete_resp vdev_del_resp;
struct vdev_response_timer *vdev_rsp;
struct wlan_objmgr_vdev *vdev;
if (!scn || !data) {
mlme_err("Invalid input");
@@ -438,38 +411,28 @@ static int target_if_vdev_mgr_delete_response_handler(ol_scn_t scn,
return -EINVAL;
}
vdev = wlan_objmgr_get_vdev_by_id_from_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_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
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;
}
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(
vdev, vdev_rsp,
psoc, vdev_rsp,
DELETE_RESPONSE_BIT);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
psoc->soc_objmgr.psoc_id, vdev_del_resp.vdev_id);
goto release_vdev_target_if_ref;
wlan_psoc_get_id(psoc), vdev_del_resp.vdev_id);
goto err;
}
rsp.vdev_id = vdev_del_resp.vdev_id;
status = rx_ops->vdev_mgr_delete_response(psoc, &rsp);
release_vdev_target_if_ref:
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
err:
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
vdev_peer_del_all_resp;
struct vdev_response_timer *vdev_rsp;
struct wlan_objmgr_vdev *vdev;
if (!scn || !data) {
mlme_err("Invalid input");
@@ -518,41 +480,32 @@ static int target_if_vdev_mgr_peer_delete_all_response_handler(
return -EINVAL;
}
vdev = wlan_objmgr_get_vdev_by_id_from_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_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
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;
}
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(
vdev, vdev_rsp,
psoc,
vdev_rsp,
PEER_DELETE_ALL_RESPONSE_BIT);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
psoc->soc_objmgr.psoc_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.status = vdev_peer_del_all_resp.status;
status = rx_ops->vdev_mgr_peer_delete_all_response(psoc, &rsp);
release_vdev_target_if_ref:
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
err:
return qdf_status_to_os_return(status);
}

View File

@@ -37,6 +37,7 @@
#include <wlan_cmn.h>
#include <wmi_unified_vdev_api.h>
#include <cdp_txrx_ctrl.h>
#include <target_if_psoc_timer_tx_ops.h>
static QDF_STATUS target_if_vdev_mgr_register_event_handler(
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);
}
static QDF_STATUS target_if_vdev_mgr_rsp_timer_mod(
struct wlan_objmgr_vdev *vdev,
struct vdev_response_timer *vdev_rsp,
int mseconds)
QDF_STATUS
target_if_vdev_mgr_rsp_timer_stop(struct wlan_objmgr_psoc *psoc,
struct vdev_response_timer *vdev_rsp,
enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit)
{
if (!vdev || !vdev_rsp) {
mlme_err("Invalid input");
struct wlan_lmac_if_mlme_tx_ops *txops;
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;
}
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)) {
/*
* 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);
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
* 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_E_FAILURE;
}
static QDF_STATUS target_if_vdev_mgr_rsp_timer_start(
struct wlan_objmgr_vdev *vdev,
struct vdev_response_timer *vdev_rsp,
uint8_t set_bit)
struct wlan_objmgr_psoc *psoc,
struct vdev_response_timer *vdev_rsp,
enum wlan_vdev_mgr_tgt_if_rsp_bit set_bit)
{
uint8_t vdev_id;
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 */
for (rsp_pos = START_RESPONSE_BIT; rsp_pos <= RESPONSE_BIT_MAX;
rsp_pos++) {
if (rsp_pos != set_bit) {
if (qdf_atomic_test_bit(rsp_pos,
&vdev_rsp->rsp_status)) {
vdev_id = vdev_rsp->vdev_id;
mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response",
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));
target_if_vdev_mgr_assert_mgmt(vdev, vdev_rsp,
rsp_pos);
target_if_vdev_mgr_rsp_timer_stop(vdev,
target_if_vdev_mgr_assert_mgmt(psoc,
vdev_id);
target_if_vdev_mgr_rsp_timer_stop(psoc,
vdev_rsp,
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)) {
mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response",
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));
target_if_vdev_mgr_assert_mgmt(vdev, vdev_rsp,
set_bit);
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, set_bit);
target_if_vdev_mgr_assert_mgmt(psoc, vdev_rsp->vdev_id);
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, set_bit);
qdf_atomic_set_bit(set_bit, &vdev_rsp->rsp_status);
}
/* 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);
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
*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;
struct wmi_unified *wmi_handle;
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) {
mlme_err("Invalid input");
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);
if (!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,
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;
}
@@ -417,8 +413,8 @@ static QDF_STATUS target_if_vdev_mgr_start_send(
struct wmi_unified *wmi_handle;
struct wlan_objmgr_psoc *psoc;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct vdev_response_timer *vdev_rsp;
uint8_t vdev_id;
struct vdev_response_timer *vdev_rsp;
if (!vdev || !param) {
mlme_err("Invalid input");
@@ -434,24 +430,27 @@ static QDF_STATUS target_if_vdev_mgr_start_send(
vdev_id = wlan_vdev_get_id(vdev);
psoc = wlan_vdev_get_psoc(vdev);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) {
mlme_err("VDEV_%d: No Rx Ops", vdev_id);
if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
mlme_err("VEV_%d: PSOC_%d No Rx Ops", vdev_id,
wlan_psoc_get_id(psoc));
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) {
mlme_err("VDEV_%d: Invalid response structure", vdev_id);
return QDF_STATUS_E_FAILURE;
mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
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;
target_if_wake_lock_timeout_acquire(vdev, START_WAKELOCK);
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);
else
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp,
target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
START_RESPONSE_BIT);
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;
target_if_wake_lock_timeout_release(vdev, START_WAKELOCK);
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);
else
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
START_RESPONSE_BIT);
}
return status;
}
@@ -492,9 +490,9 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
QDF_STATUS status;
struct wlan_objmgr_psoc *psoc;
struct wmi_unified *wmi_handle;
struct vdev_response_timer *vdev_rsp;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
uint8_t vdev_id;
struct vdev_response_timer *vdev_rsp;
if (!vdev || !param) {
mlme_err("Invalid input");
@@ -510,19 +508,22 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
vdev_id = wlan_vdev_get_id(vdev);
psoc = wlan_vdev_get_psoc(vdev);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) {
mlme_err("VDEV_%d: No Rx Ops", vdev_id);
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->vdev_mgr_get_response_timer_info(vdev);
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response structure", vdev_id);
return QDF_STATUS_E_FAILURE;
mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
}
target_if_wake_lock_timeout_acquire(vdev, DELETE_WAKELOCK);
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);
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) ||
wlan_psoc_nif_feat_cap_get(psoc,
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);
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);
vdev_rsp->expire_time = 0;
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);
}
return status;
}
@@ -557,8 +557,9 @@ static QDF_STATUS target_if_vdev_mgr_stop_send(
struct wmi_unified *wmi_handle;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct wlan_objmgr_psoc *psoc;
struct vdev_response_timer *vdev_rsp;
uint8_t vdev_id;
struct vdev_response_timer *vdev_rsp;
if (!vdev || !param) {
mlme_err("Invalid input");
@@ -574,31 +575,31 @@ static QDF_STATUS target_if_vdev_mgr_stop_send(
vdev_id = wlan_vdev_get_id(vdev);
psoc = wlan_vdev_get_psoc(vdev);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) {
mlme_err("VDEV_%d: No Rx Ops", vdev_id);
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->vdev_mgr_get_response_timer_info(vdev);
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response structure", vdev_id);
return QDF_STATUS_E_FAILURE;
mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
}
target_if_wake_lock_timeout_acquire(vdev, STOP_WAKELOCK);
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);
if (QDF_IS_STATUS_ERROR(status)) {
vdev_rsp->expire_time = 0;
vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
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);
}
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_vdev *tvdev;
struct vdev_response_timer *vdev_rsp = NULL;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
uint32_t vdev_idx;
int32_t vdev_idx = -1;
int32_t last_vdev_idx = -1;
struct vdev_response_timer *vdev_rsp;
psoc = wlan_pdev_get_psoc(pdev);
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;
}
@@ -860,15 +862,16 @@ static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref(
return last_vdev_idx;
}
last_vdev_idx = vdev_idx;
vdev_rsp =
rx_ops->vdev_mgr_get_response_timer_info(tvdev);
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
vdev_idx);
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;
}
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);
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_vdev *tvdev;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct vdev_response_timer *vdev_rsp = NULL;
uint32_t vdev_idx;
struct vdev_response_timer *vdev_rsp;
psoc = wlan_pdev_get_psoc(pdev);
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++) {
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)) {
vdev_rsp =
rx_ops->vdev_mgr_get_response_timer_info(tvdev);
if (vdev_rsp && vdev_timer_started[vdev_idx]) {
if (vdev_timer_started[vdev_idx]) {
target_if_vdev_mgr_rsp_timer_stop(
tvdev, vdev_rsp,
psoc, vdev_rsp,
RESTART_RESPONSE_BIT);
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 wlan_lmac_if_mlme_rx_ops *rx_ops;
struct wlan_objmgr_psoc *psoc;
struct vdev_response_timer *vdev_rsp;
uint8_t vdev_id;
struct vdev_response_timer *vdev_rsp;
if (!vdev || !param) {
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);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) {
mlme_err("VDEV_%d: No Rx Ops", vdev_id);
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->vdev_mgr_get_response_timer_info(vdev);
vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response structure", vdev_id);
return QDF_STATUS_E_FAILURE;
mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
wlan_psoc_get_id(psoc));
return QDF_STATUS_E_INVAL;
}
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);
status = wmi_unified_peer_delete_all_send(wmi_handle, param);
if (QDF_IS_STATUS_ERROR(status)) {
vdev_rsp->expire_time = 0;
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);
}
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;
mlme_tx_ops->vdev_sta_ps_param_send =
target_if_vdev_mgr_sta_ps_param_send;
mlme_tx_ops->vdev_mgr_rsp_timer_init =
target_if_vdev_mgr_rsp_timer_init;
mlme_tx_ops->vdev_mgr_rsp_timer_mod =
mlme_tx_ops->psoc_vdev_rsp_timer_mod =
target_if_vdev_mgr_rsp_timer_mod;
mlme_tx_ops->peer_delete_all_send =
target_if_vdev_mgr_peer_delete_all_send;
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;
}