From 004bb25c0b338526e3f0e37bcba6d72afd1c7591 Mon Sep 17 00:00:00 2001 From: Naga Date: Tue, 30 Jul 2019 10:32:23 +0530 Subject: [PATCH] qcacmn: Add support for self recovery in target_if Add support to trigger self recovery in case of vdev request timeout, as when host is asserted fw dumps are not collected Change-Id: I534ada61b114f5b96ecfae1ff27d692ee496edba CRs-Fixed: 2496796 --- .../vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h | 18 ++++++++++-- .../vdev_mgr/src/target_if_vdev_mgr_rx_ops.c | 29 ++++++++++--------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h b/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h index 991c653771..125bd829de 100644 --- a/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h +++ b/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h @@ -28,16 +28,28 @@ #include #include #include +#include /** - * target_if_vdev_mgr_is_driver_unloading: API to driver unload status + * target_if_vdev_mgr_is_panic_allowed: API to get if panic is allowed on + * timeout * - * Return: TRUE or FALSE + * Return: TRUE or FALSE when VDEV_ASSERT_MANAGEMENT is disabled else FALSE */ -static inline bool target_if_vdev_mgr_is_driver_unloading(void) +#ifdef VDEV_ASSERT_MANAGEMENT +static inline bool target_if_vdev_mgr_is_panic_allowed(void) { return false; } +#else +static inline bool target_if_vdev_mgr_is_panic_allowed(void) +{ + if (qdf_is_recovering() || qdf_is_fw_down()) + return false; + + return true; +} +#endif /** * target_if_vdev_mgr_delete_response_handler() - API to handle vdev delete diff --git a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c index db61f24164..6293fa2f24 100644 --- a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c +++ b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c @@ -29,7 +29,6 @@ #include #include #include -#include #include #include @@ -128,25 +127,29 @@ void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg) return; } - if (target_if_vdev_mgr_is_driver_unloading() || qdf_is_recovering() || - qdf_is_fw_down()) { + if (!target_if_vdev_mgr_is_panic_allowed()) { + mlme_debug("PSOC_%d VDEV_%d: Panic not allowed", + wlan_psoc_get_id(psoc), vdev_id); return; } + /* Trigger fw recovery to collect fw dump */ + wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); + if (wmi_handle) { + mlme_err("PSOC_%d VDEV_%d: Self recovery, %s rsp timeout", + wlan_psoc_get_id(psoc), vdev_id, + string_from_rsp_bit(rsp_pos)); + qdf_mem_set(¶m, sizeof(param), 0); + /* RECOVERY_SIM_SELF_RECOVERY */ + param.type = 0x08; + wmi_crash_inject(wmi_handle, ¶m); + } + + /* Host panic to collect host stacktrace */ if (target_if_vdev_mgr_is_panic_on_bug()) { QDF_DEBUG_PANIC("PSOC_%d VDEV_%d: Panic, %s response timeout", wlan_psoc_get_id(psoc), vdev_id, string_from_rsp_bit(rsp_pos)); - } else { - mlme_err("PSOC_%d VDEV_%d: Self recovery, %s response timeout", - wlan_psoc_get_id(psoc), - vdev_id, string_from_rsp_bit(rsp_pos)); - wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); - - qdf_mem_set(¶m, sizeof(param), 0); - /* RECOVERY_SIM_SELF_RECOVERY*/ - param.type = 0x08; - wmi_crash_inject(wmi_handle, ¶m); } }