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:
Srinivas Dasari
2022-01-13 01:36:57 +05:30
cometido por Madan Koyyalamudi
padre e7074b084e
commit f8921a74b9
Se han modificado 12 ficheros con 182 adiciones y 27 borrados

Ver fichero

@@ -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__ */

Ver fichero

@@ -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);

Ver fichero

@@ -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;