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
Este commit está contenido en:

cometido por
Madan Koyyalamudi

padre
e7074b084e
commit
f8921a74b9
@@ -118,4 +118,17 @@ QDF_STATUS target_if_vdev_mgr_rsp_timer_stop(
|
||||
struct vdev_response_timer *vdev_rsp,
|
||||
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__ */
|
||||
|
@@ -33,6 +33,9 @@
|
||||
#include <wlan_vdev_mlme_main.h>
|
||||
#include <wmi_unified_vdev_api.h>
|
||||
#include <target_if_psoc_wake_lock.h>
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
#include <target_if_cm_roam_offload.h>
|
||||
#endif
|
||||
|
||||
static inline
|
||||
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);
|
||||
}
|
||||
|
||||
#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)
|
||||
{
|
||||
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(STOP_RESPONSE_BIT, &vdev_rsp->rsp_status) &&
|
||||
!qdf_atomic_test_bit(DELETE_RESPONSE_BIT, &vdev_rsp->rsp_status) &&
|
||||
!qdf_atomic_test_bit(
|
||||
PEER_DELETE_ALL_RESPONSE_BIT,
|
||||
&vdev_rsp->rsp_status)) {
|
||||
!qdf_atomic_test_bit(PEER_DELETE_ALL_RESPONSE_BIT,
|
||||
&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",
|
||||
vdev_rsp->vdev_id);
|
||||
return;
|
||||
@@ -151,6 +171,14 @@ void target_if_vdev_mgr_rsp_timer_cb(void *arg)
|
||||
recovery_reason, rsp_pos);
|
||||
rx_ops->vdev_mgr_peer_delete_all_response(psoc,
|
||||
&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 {
|
||||
mlme_err("PSOC_%d VDEV_%d: Unknown error",
|
||||
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;
|
||||
}
|
||||
|
||||
static 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)
|
||||
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)
|
||||
{
|
||||
uint8_t rsp_pos;
|
||||
uint8_t vdev_id;
|
||||
|
Referencia en una nueva incidencia
Block a user