qcacmn: Wait for RSO stop response from firmware
Firmware doesn't expect any vdev commands from host while RSO stop is happening. It sends a response to the RSO_STOP command once it's done with cleanup. Host needs to run a timer and wait for a maximum of 6 seconds for the response. Host can stop the timer and allow the commands to firmware in the below cases, 1. RSO_STOP response with success status 2. RSO_STOP response with HO_FAIL status followed by HO_FAIL event: Host needs to wait till HO_FAIL event is received If firmware doesn't send any response in the 6 seconds wait, issue a recovery to help to check the firmware state. Change-Id: I4577f9b0aac71c0c86bd32b59e69d9527bf107b9 CRs-Fixed: 3106032
This commit is contained in:

committed by
Madan Koyyalamudi

parent
e7074b084e
commit
f8921a74b9
@@ -1412,6 +1412,7 @@ enum qdf_suspend_type {
|
|||||||
* @QDF_VDEV_SM_OUT_OF_SYNC: Vdev SM is out of sync and connect req received
|
* @QDF_VDEV_SM_OUT_OF_SYNC: Vdev SM is out of sync and connect req received
|
||||||
* when already connected
|
* when already connected
|
||||||
* @QDF_STATS_REQ_TIMEDOUT: Stats request timedout
|
* @QDF_STATS_REQ_TIMEDOUT: Stats request timedout
|
||||||
|
* @QDF_RSO_STOP_RSP_TIMEOUT: Firmware hasn't sent RSO stop response
|
||||||
*/
|
*/
|
||||||
enum qdf_hang_reason {
|
enum qdf_hang_reason {
|
||||||
QDF_REASON_UNSPECIFIED,
|
QDF_REASON_UNSPECIFIED,
|
||||||
@@ -1443,6 +1444,7 @@ enum qdf_hang_reason {
|
|||||||
QDF_VDEV_SM_OUT_OF_SYNC,
|
QDF_VDEV_SM_OUT_OF_SYNC,
|
||||||
QDF_STATS_REQ_TIMEDOUT,
|
QDF_STATS_REQ_TIMEDOUT,
|
||||||
QDF_TX_DESC_LEAK,
|
QDF_TX_DESC_LEAK,
|
||||||
|
QDF_RSO_STOP_RSP_TIMEOUT,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -118,4 +118,17 @@ QDF_STATUS target_if_vdev_mgr_rsp_timer_stop(
|
|||||||
struct vdev_response_timer *vdev_rsp,
|
struct vdev_response_timer *vdev_rsp,
|
||||||
enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit);
|
enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* target_if_vdev_mgr_rsp_timer_start() - API to start response timer for
|
||||||
|
* vdev manager operations
|
||||||
|
* @psoc: pointer to psoc object
|
||||||
|
* @vdev_rsp: vdev response timer
|
||||||
|
* @set_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_start(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct vdev_response_timer *vdev_rsp,
|
||||||
|
enum wlan_vdev_mgr_tgt_if_rsp_bit set_bit);
|
||||||
#endif /* __TARGET_IF_VDEV_MGR_TX_OPS_H__ */
|
#endif /* __TARGET_IF_VDEV_MGR_TX_OPS_H__ */
|
||||||
|
@@ -33,6 +33,9 @@
|
|||||||
#include <wlan_vdev_mlme_main.h>
|
#include <wlan_vdev_mlme_main.h>
|
||||||
#include <wmi_unified_vdev_api.h>
|
#include <wmi_unified_vdev_api.h>
|
||||||
#include <target_if_psoc_wake_lock.h>
|
#include <target_if_psoc_wake_lock.h>
|
||||||
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||||
|
#include <target_if_cm_roam_offload.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
void target_if_vdev_mgr_handle_recovery(struct wlan_objmgr_psoc *psoc,
|
void target_if_vdev_mgr_handle_recovery(struct wlan_objmgr_psoc *psoc,
|
||||||
@@ -49,6 +52,22 @@ void target_if_vdev_mgr_handle_recovery(struct wlan_objmgr_psoc *psoc,
|
|||||||
wlan_psoc_get_id(psoc), vdev_id);
|
wlan_psoc_get_id(psoc), vdev_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||||
|
static inline QDF_STATUS
|
||||||
|
target_if_send_rso_stop_failure_rsp(struct wlan_objmgr_psoc *psoc,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
return target_if_cm_send_rso_stop_failure_rsp(psoc, vdev_id);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline QDF_STATUS
|
||||||
|
target_if_send_rso_stop_failure_rsp(struct wlan_objmgr_psoc *psoc,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_E_NOSUPPORT;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void target_if_vdev_mgr_rsp_timer_cb(void *arg)
|
void target_if_vdev_mgr_rsp_timer_cb(void *arg)
|
||||||
{
|
{
|
||||||
struct wlan_objmgr_psoc *psoc;
|
struct wlan_objmgr_psoc *psoc;
|
||||||
@@ -83,9 +102,10 @@ void target_if_vdev_mgr_rsp_timer_cb(void *arg)
|
|||||||
!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) &&
|
||||||
!qdf_atomic_test_bit(DELETE_RESPONSE_BIT, &vdev_rsp->rsp_status) &&
|
!qdf_atomic_test_bit(DELETE_RESPONSE_BIT, &vdev_rsp->rsp_status) &&
|
||||||
!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)) {
|
!qdf_atomic_test_bit(RSO_STOP_RESPONSE_BIT,
|
||||||
|
&vdev_rsp->rsp_status)) {
|
||||||
mlme_debug("No response bit is set, ignoring actions :%d",
|
mlme_debug("No response bit is set, ignoring actions :%d",
|
||||||
vdev_rsp->vdev_id);
|
vdev_rsp->vdev_id);
|
||||||
return;
|
return;
|
||||||
@@ -151,6 +171,14 @@ void target_if_vdev_mgr_rsp_timer_cb(void *arg)
|
|||||||
recovery_reason, rsp_pos);
|
recovery_reason, rsp_pos);
|
||||||
rx_ops->vdev_mgr_peer_delete_all_response(psoc,
|
rx_ops->vdev_mgr_peer_delete_all_response(psoc,
|
||||||
&peer_del_all_rsp);
|
&peer_del_all_rsp);
|
||||||
|
} else if (qdf_atomic_test_bit(RSO_STOP_RESPONSE_BIT,
|
||||||
|
&vdev_rsp->rsp_status)) {
|
||||||
|
rsp_pos = RSO_STOP_RESPONSE_BIT;
|
||||||
|
recovery_reason = QDF_RSO_STOP_RSP_TIMEOUT;
|
||||||
|
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
|
||||||
|
target_if_vdev_mgr_handle_recovery(psoc, vdev_id,
|
||||||
|
recovery_reason, rsp_pos);
|
||||||
|
target_if_send_rso_stop_failure_rsp(psoc, vdev_id);
|
||||||
} else {
|
} else {
|
||||||
mlme_err("PSOC_%d VDEV_%d: Unknown error",
|
mlme_err("PSOC_%d VDEV_%d: Unknown error",
|
||||||
wlan_psoc_get_id(psoc), vdev_id);
|
wlan_psoc_get_id(psoc), vdev_id);
|
||||||
|
@@ -101,10 +101,10 @@ target_if_vdev_mgr_rsp_timer_stop(struct wlan_objmgr_psoc *psoc,
|
|||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QDF_STATUS target_if_vdev_mgr_rsp_timer_start(
|
QDF_STATUS
|
||||||
struct wlan_objmgr_psoc *psoc,
|
target_if_vdev_mgr_rsp_timer_start(struct wlan_objmgr_psoc *psoc,
|
||||||
struct vdev_response_timer *vdev_rsp,
|
struct vdev_response_timer *vdev_rsp,
|
||||||
enum wlan_vdev_mgr_tgt_if_rsp_bit set_bit)
|
enum wlan_vdev_mgr_tgt_if_rsp_bit set_bit)
|
||||||
{
|
{
|
||||||
uint8_t rsp_pos;
|
uint8_t rsp_pos;
|
||||||
uint8_t vdev_id;
|
uint8_t vdev_id;
|
||||||
|
@@ -377,29 +377,24 @@ QDF_STATUS cm_disconnect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
|
|||||||
{
|
{
|
||||||
struct wlan_cm_vdev_discon_req *req;
|
struct wlan_cm_vdev_discon_req *req;
|
||||||
struct cm_req *cm_req;
|
struct cm_req *cm_req;
|
||||||
struct qdf_mac_addr bssid = QDF_MAC_ADDR_ZERO_INIT;
|
QDF_STATUS status = QDF_STATUS_E_NOSUPPORT;
|
||||||
QDF_STATUS status;
|
|
||||||
|
|
||||||
cm_req = cm_get_req_by_cm_id(cm_ctx, *cm_id);
|
cm_req = cm_get_req_by_cm_id(cm_ctx, *cm_id);
|
||||||
if (!cm_req)
|
if (!cm_req)
|
||||||
return QDF_STATUS_E_INVAL;
|
return QDF_STATUS_E_INVAL;
|
||||||
|
|
||||||
|
cm_ctx->active_cm_id = *cm_id;
|
||||||
|
|
||||||
|
if (wlan_vdev_mlme_get_opmode(cm_ctx->vdev) == QDF_STA_MODE)
|
||||||
|
status = mlme_cm_rso_stop_req(cm_ctx->vdev);
|
||||||
|
|
||||||
|
if (status != QDF_STATUS_E_NOSUPPORT)
|
||||||
|
return status;
|
||||||
|
|
||||||
req = qdf_mem_malloc(sizeof(*req));
|
req = qdf_mem_malloc(sizeof(*req));
|
||||||
if (!req)
|
if (!req)
|
||||||
return QDF_STATUS_E_NOMEM;
|
return QDF_STATUS_E_NOMEM;
|
||||||
|
|
||||||
cm_ctx->active_cm_id = *cm_id;
|
|
||||||
wlan_vdev_get_bss_peer_mac(cm_ctx->vdev, &bssid);
|
|
||||||
/*
|
|
||||||
* for northbound req, bssid is not provided so update it from vdev
|
|
||||||
* in case bssid is not present
|
|
||||||
*/
|
|
||||||
if (qdf_is_macaddr_zero(&cm_req->discon_req.req.bssid) ||
|
|
||||||
qdf_is_macaddr_broadcast(&cm_req->discon_req.req.bssid))
|
|
||||||
qdf_copy_macaddr(&cm_req->discon_req.req.bssid, &bssid);
|
|
||||||
|
|
||||||
qdf_copy_macaddr(&req->req.bssid, &bssid);
|
|
||||||
|
|
||||||
req->cm_id = *cm_id;
|
req->cm_id = *cm_id;
|
||||||
req->req.vdev_id = wlan_vdev_get_id(cm_ctx->vdev);
|
req->req.vdev_id = wlan_vdev_get_id(cm_ctx->vdev);
|
||||||
req->req.source = cm_req->discon_req.req.source;
|
req->req.source = cm_req->discon_req.req.source;
|
||||||
@@ -407,20 +402,70 @@ QDF_STATUS cm_disconnect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
|
|||||||
req->req.is_no_disassoc_disconnect =
|
req->req.is_no_disassoc_disconnect =
|
||||||
cm_req->discon_req.req.is_no_disassoc_disconnect;
|
cm_req->discon_req.req.is_no_disassoc_disconnect;
|
||||||
|
|
||||||
|
cm_disconnect_continue_after_rso_stop(cm_ctx->vdev, false,
|
||||||
|
req);
|
||||||
|
qdf_mem_free(req);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
cm_disconnect_continue_after_rso_stop(struct wlan_objmgr_vdev *vdev,
|
||||||
|
bool is_ho_fail,
|
||||||
|
struct wlan_cm_vdev_discon_req *req)
|
||||||
|
{
|
||||||
|
struct cm_req *cm_req;
|
||||||
|
QDF_STATUS status;
|
||||||
|
struct qdf_mac_addr bssid = QDF_MAC_ADDR_ZERO_INIT;
|
||||||
|
struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev);
|
||||||
|
|
||||||
|
if (!cm_ctx)
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
|
||||||
|
if ((CM_ID_GET_PREFIX(req->cm_id)) != DISCONNECT_REQ_PREFIX) {
|
||||||
|
mlme_err(CM_PREFIX_FMT "active req is not disconnect req",
|
||||||
|
CM_PREFIX_REF(wlan_vdev_get_id(vdev), req->cm_id));
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cm_req = cm_get_req_by_cm_id(cm_ctx, req->cm_id);
|
||||||
|
if (!cm_req)
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
|
||||||
|
if (is_ho_fail) {
|
||||||
|
mlme_debug(CM_PREFIX_FMT "Updating source(%d) and reason code (%d) to RSO reason and source as ho fail is received in RSO stop",
|
||||||
|
CM_PREFIX_REF(req->req.vdev_id, req->cm_id),
|
||||||
|
req->req.source, req->req.reason_code);
|
||||||
|
req->req.source = CM_MLME_DISCONNECT;
|
||||||
|
req->req.reason_code = REASON_FW_TRIGGERED_ROAM_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlan_vdev_get_bss_peer_mac(cm_ctx->vdev, &bssid);
|
||||||
|
/*
|
||||||
|
* for northbound req, bssid is not provided so update it from vdev
|
||||||
|
* in case bssid is not present
|
||||||
|
*/
|
||||||
|
if (qdf_is_macaddr_zero(&cm_req->discon_req.req.bssid) ||
|
||||||
|
qdf_is_macaddr_broadcast(&cm_req->discon_req.req.bssid))
|
||||||
|
qdf_copy_macaddr(&cm_req->discon_req.req.bssid,
|
||||||
|
&req->req.bssid);
|
||||||
|
|
||||||
|
qdf_copy_macaddr(&req->req.bssid, &bssid);
|
||||||
cm_update_scan_mlme_on_disconnect(cm_ctx->vdev,
|
cm_update_scan_mlme_on_disconnect(cm_ctx->vdev,
|
||||||
&cm_req->discon_req);
|
&cm_req->discon_req);
|
||||||
|
|
||||||
mlme_debug(CM_PREFIX_FMT "disconnect " QDF_MAC_ADDR_FMT " source %d reason %d",
|
mlme_debug(CM_PREFIX_FMT "disconnect " QDF_MAC_ADDR_FMT
|
||||||
|
" source %d reason %d is_ho_fail: %u",
|
||||||
CM_PREFIX_REF(req->req.vdev_id, req->cm_id),
|
CM_PREFIX_REF(req->req.vdev_id, req->cm_id),
|
||||||
QDF_MAC_ADDR_REF(req->req.bssid.bytes),
|
QDF_MAC_ADDR_REF(req->req.bssid.bytes),
|
||||||
req->req.source, req->req.reason_code);
|
req->req.source, req->req.reason_code, is_ho_fail);
|
||||||
|
|
||||||
status = mlme_cm_disconnect_req(cm_ctx->vdev, req);
|
status = mlme_cm_disconnect_req(cm_ctx->vdev, req);
|
||||||
if (QDF_IS_STATUS_ERROR(status)) {
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
mlme_err(CM_PREFIX_FMT "disconnect req fail",
|
mlme_err(CM_PREFIX_FMT "disconnect req fail",
|
||||||
CM_PREFIX_REF(req->req.vdev_id, req->cm_id));
|
CM_PREFIX_REF(req->req.vdev_id, req->cm_id));
|
||||||
cm_send_disconnect_resp(cm_ctx, req->cm_id);
|
cm_send_disconnect_resp(cm_ctx, req->cm_id);
|
||||||
}
|
}
|
||||||
qdf_mem_free(req);
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2012-2015, 2020-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2012-2015, 2020-2021, The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for any
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
@@ -460,6 +461,19 @@ void cm_initiate_internal_disconnect(struct cnx_mgr *cm_ctx);
|
|||||||
*/
|
*/
|
||||||
void cm_send_disconnect_resp(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id);
|
void cm_send_disconnect_resp(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cm_disconnect_continue_after_rso_stop() - Continue disconnect after RSO stop
|
||||||
|
* @vdev: Objmgr vdev
|
||||||
|
* @is_ho_fail: True if ho_fail happened
|
||||||
|
* @req: pointer to cm vdev disconnect req
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
cm_disconnect_continue_after_rso_stop(struct wlan_objmgr_vdev *vdev,
|
||||||
|
bool is_ho_fail,
|
||||||
|
struct wlan_cm_vdev_discon_req *req);
|
||||||
|
|
||||||
/*************** UTIL APIs ****************/
|
/*************** UTIL APIs ****************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1153,5 +1167,4 @@ void cm_set_candidate_custom_sort_cb(
|
|||||||
qdf_list_t *list));
|
qdf_list_t *list));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __WLAN_CM_MAIN_API_H__ */
|
#endif /* __WLAN_CM_MAIN_API_H__ */
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for any
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
@@ -459,4 +460,19 @@ void wlan_cm_set_candidate_custom_sort_cb(
|
|||||||
*/
|
*/
|
||||||
struct reduced_neighbor_report *wlan_cm_get_rnr(struct wlan_objmgr_vdev *vdev,
|
struct reduced_neighbor_report *wlan_cm_get_rnr(struct wlan_objmgr_vdev *vdev,
|
||||||
wlan_cm_id cm_id);
|
wlan_cm_id cm_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_cm_disc_cont_after_rso_stop() - Continue disconnect after RSO stop
|
||||||
|
* @vdev: Objmgr vdev
|
||||||
|
* @is_ho_fail: True if ho_fail happened
|
||||||
|
* @req: pointer to cm vdev disconnect req
|
||||||
|
|
||||||
|
* This is a wrapper to call core API cm_disconnect_continue_after_rso_stop
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_cm_disc_cont_after_rso_stop(struct wlan_objmgr_vdev *vdev,
|
||||||
|
bool is_ho_fail,
|
||||||
|
struct wlan_cm_vdev_discon_req *req);
|
||||||
#endif /* __WLAN_CM_UCFG_API_H */
|
#endif /* __WLAN_CM_UCFG_API_H */
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2012-2015,2020-2021 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2012-2015,2020-2021 The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for any
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
@@ -35,7 +35,9 @@
|
|||||||
typedef uint32_t wlan_cm_id;
|
typedef uint32_t wlan_cm_id;
|
||||||
|
|
||||||
/* Diconnect active timeout */
|
/* Diconnect active timeout */
|
||||||
#define DISCONNECT_TIMEOUT STOP_RESPONSE_TIMER + DELETE_RESPONSE_TIMER + 1000
|
#define DISCONNECT_TIMEOUT \
|
||||||
|
((STOP_RESPONSE_TIMER) + (DELETE_RESPONSE_TIMER) +\
|
||||||
|
(RSO_STOP_RESPONSE_TIMER) + (1000))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disconnect command wait timeout VDEV timeouts + 5 sec buff for current active
|
* Disconnect command wait timeout VDEV timeouts + 5 sec buff for current active
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2012-2015, 2020-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2012-2015, 2020-2021, The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for any
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
@@ -370,3 +371,12 @@ struct reduced_neighbor_report *wlan_cm_get_rnr(struct wlan_objmgr_vdev *vdev,
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_cm_disc_cont_after_rso_stop(struct wlan_objmgr_vdev *vdev,
|
||||||
|
bool is_ho_fail,
|
||||||
|
struct wlan_cm_vdev_discon_req *req)
|
||||||
|
{
|
||||||
|
return cm_disconnect_continue_after_rso_stop(vdev, is_ho_fail,
|
||||||
|
req);
|
||||||
|
}
|
||||||
|
@@ -258,6 +258,7 @@ struct mlme_twt_ops {
|
|||||||
* complete
|
* complete
|
||||||
* @mlme_cm_ext_vdev_down_req_cb: callback to send vdev down to FW
|
* @mlme_cm_ext_vdev_down_req_cb: callback to send vdev down to FW
|
||||||
* @mlme_cm_ext_roam_start_ind_cb: callback to indicate roam start
|
* @mlme_cm_ext_roam_start_ind_cb: callback to indicate roam start
|
||||||
|
* @mlme_cm_ext_rso_stop_cb: callback to send rso stop to FW
|
||||||
* @mlme_cm_ext_reassoc_req_cb: callback for reassoc request to
|
* @mlme_cm_ext_reassoc_req_cb: callback for reassoc request to
|
||||||
* VDEV/PEER SM
|
* VDEV/PEER SM
|
||||||
* @mlme_vdev_send_set_mac_addr: callback to send set MAC address
|
* @mlme_vdev_send_set_mac_addr: callback to send set MAC address
|
||||||
@@ -329,6 +330,7 @@ struct mlme_ext_ops {
|
|||||||
QDF_STATUS (*mlme_cm_ext_roam_start_ind_cb)(
|
QDF_STATUS (*mlme_cm_ext_roam_start_ind_cb)(
|
||||||
struct wlan_objmgr_vdev *vdev,
|
struct wlan_objmgr_vdev *vdev,
|
||||||
struct wlan_cm_roam_req *req);
|
struct wlan_cm_roam_req *req);
|
||||||
|
QDF_STATUS (*mlme_cm_ext_rso_stop_cb)(struct wlan_objmgr_vdev *vdev);
|
||||||
QDF_STATUS (*mlme_cm_ext_reassoc_req_cb)(
|
QDF_STATUS (*mlme_cm_ext_reassoc_req_cb)(
|
||||||
struct wlan_objmgr_vdev *vdev,
|
struct wlan_objmgr_vdev *vdev,
|
||||||
struct wlan_cm_vdev_reassoc_req *req);
|
struct wlan_cm_vdev_reassoc_req *req);
|
||||||
@@ -629,6 +631,14 @@ QDF_STATUS mlme_cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
|
|||||||
QDF_STATUS mlme_cm_roam_start_ind(struct wlan_objmgr_vdev *vdev,
|
QDF_STATUS mlme_cm_roam_start_ind(struct wlan_objmgr_vdev *vdev,
|
||||||
struct wlan_cm_roam_req *req);
|
struct wlan_cm_roam_req *req);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mlme_cm_rso_stop_req() - Connection manager ext RSO stop request
|
||||||
|
* @vdev: VDEV object
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS mlme_cm_rso_stop_req(struct wlan_objmgr_vdev *vdev);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mlme_cm_reassoc_req() - Connection manager ext reassoc request
|
* mlme_cm_reassoc_req() - Connection manager ext reassoc request
|
||||||
* @vdev: VDEV object
|
* @vdev: VDEV object
|
||||||
|
@@ -356,6 +356,16 @@ QDF_STATUS mlme_cm_roam_start_ind(struct wlan_objmgr_vdev *vdev,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS mlme_cm_rso_stop_req(struct wlan_objmgr_vdev *vdev)
|
||||||
|
{
|
||||||
|
QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT;
|
||||||
|
|
||||||
|
if ((glbl_ops) && glbl_ops->mlme_cm_ext_rso_stop_cb)
|
||||||
|
ret = glbl_ops->mlme_cm_ext_rso_stop_cb(vdev);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
QDF_STATUS mlme_cm_reassoc_req(struct wlan_objmgr_vdev *vdev,
|
QDF_STATUS mlme_cm_reassoc_req(struct wlan_objmgr_vdev *vdev,
|
||||||
struct wlan_cm_vdev_reassoc_req *req)
|
struct wlan_cm_vdev_reassoc_req *req)
|
||||||
{
|
{
|
||||||
|
@@ -42,6 +42,7 @@
|
|||||||
* STOP_RESPONSE_BIT: vdev stop response bit
|
* STOP_RESPONSE_BIT: vdev stop response bit
|
||||||
* DELETE_RESPONSE_BIT: vdev delete response bit
|
* DELETE_RESPONSE_BIT: vdev delete response bit
|
||||||
* PEER_DELETE_ALL_RESPONSE_BIT: vdev peer delete all response bit
|
* PEER_DELETE_ALL_RESPONSE_BIT: vdev peer delete all response bit
|
||||||
|
* RSO_STOP_RESPONSE_BIT : RSO stop response bit
|
||||||
*/
|
*/
|
||||||
enum wlan_vdev_mgr_tgt_if_rsp_bit {
|
enum wlan_vdev_mgr_tgt_if_rsp_bit {
|
||||||
START_RESPONSE_BIT = 0,
|
START_RESPONSE_BIT = 0,
|
||||||
@@ -49,6 +50,7 @@ enum wlan_vdev_mgr_tgt_if_rsp_bit {
|
|||||||
STOP_RESPONSE_BIT = 2,
|
STOP_RESPONSE_BIT = 2,
|
||||||
DELETE_RESPONSE_BIT = 3,
|
DELETE_RESPONSE_BIT = 3,
|
||||||
PEER_DELETE_ALL_RESPONSE_BIT = 4,
|
PEER_DELETE_ALL_RESPONSE_BIT = 4,
|
||||||
|
RSO_STOP_RESPONSE_BIT = 5,
|
||||||
RESPONSE_BIT_MAX,
|
RESPONSE_BIT_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -66,6 +68,7 @@ static inline char *string_from_rsp_bit(enum wlan_vdev_mgr_tgt_if_rsp_bit bit)
|
|||||||
"STOP",
|
"STOP",
|
||||||
"DELETE",
|
"DELETE",
|
||||||
"PEER DELETE ALL",
|
"PEER DELETE ALL",
|
||||||
|
"RSO STOP",
|
||||||
"RESPONE MAX"};
|
"RESPONE MAX"};
|
||||||
return (char *)strings[bit];
|
return (char *)strings[bit];
|
||||||
}
|
}
|
||||||
@@ -76,17 +79,20 @@ static inline char *string_from_rsp_bit(enum wlan_vdev_mgr_tgt_if_rsp_bit bit)
|
|||||||
#define STOP_RESPONSE_TIMER (4000 + PMO_RESUME_TIMEOUT)
|
#define STOP_RESPONSE_TIMER (4000 + PMO_RESUME_TIMEOUT)
|
||||||
#define DELETE_RESPONSE_TIMER (4000 + PMO_RESUME_TIMEOUT)
|
#define DELETE_RESPONSE_TIMER (4000 + PMO_RESUME_TIMEOUT)
|
||||||
#define PEER_DELETE_ALL_RESPONSE_TIMER (6000 + PMO_RESUME_TIMEOUT)
|
#define PEER_DELETE_ALL_RESPONSE_TIMER (6000 + PMO_RESUME_TIMEOUT)
|
||||||
|
#define RSO_STOP_RESPONSE_TIMER (6000 + PMO_RESUME_TIMEOUT)
|
||||||
#elif defined(QCA_LOWMEM_CONFIG) || defined(QCA_512M_CONFIG) || \
|
#elif defined(QCA_LOWMEM_CONFIG) || defined(QCA_512M_CONFIG) || \
|
||||||
defined(QCA_WIFI_QCA5018)
|
defined(QCA_WIFI_QCA5018)
|
||||||
#define START_RESPONSE_TIMER 15000
|
#define START_RESPONSE_TIMER 15000
|
||||||
#define STOP_RESPONSE_TIMER 15000
|
#define STOP_RESPONSE_TIMER 15000
|
||||||
#define DELETE_RESPONSE_TIMER 15000
|
#define DELETE_RESPONSE_TIMER 15000
|
||||||
#define PEER_DELETE_ALL_RESPONSE_TIMER 15000
|
#define PEER_DELETE_ALL_RESPONSE_TIMER 15000
|
||||||
|
#define RSO_STOP_RESPONSE_TIMER 15000
|
||||||
#else
|
#else
|
||||||
#define START_RESPONSE_TIMER 8000
|
#define START_RESPONSE_TIMER 8000
|
||||||
#define STOP_RESPONSE_TIMER 6000
|
#define STOP_RESPONSE_TIMER 6000
|
||||||
#define DELETE_RESPONSE_TIMER 4000
|
#define DELETE_RESPONSE_TIMER 4000
|
||||||
#define PEER_DELETE_ALL_RESPONSE_TIMER 6000
|
#define PEER_DELETE_ALL_RESPONSE_TIMER 6000
|
||||||
|
#define RSO_STOP_RESPONSE_TIMER 6000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
|
#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
|
||||||
|
Reference in New Issue
Block a user