From bdcd6ce25e9350191756ae804b4fe29e9553dc1c Mon Sep 17 00:00:00 2001 From: Sourav Mohapatra Date: Mon, 24 Feb 2020 09:51:15 +0530 Subject: [PATCH] qcacmn: Add appropriate hang reason codes for various scenarios Presently, the reason codes for driver to trigger recovery on are limited in their scope; most of the scenarios are not correctly capture. Add new reason codes to cover all the possible scenarios where the driver has need to trigger recovery. Change-Id: Ia257855bc30cd0bc7e81b9d0e21e4b84427d546b CRs-Fixed: 2630951 --- qdf/inc/qdf_types.h | 40 ++++++++++++++----- .../vdev_mgr/src/target_if_vdev_mgr_rx_ops.c | 8 +++- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index 36f6cf0e8b..54593f1187 100644 --- a/qdf/inc/qdf_types.h +++ b/qdf/inc/qdf_types.h @@ -1188,19 +1188,37 @@ enum qdf_suspend_type { * @QDF_SUSPEND_TIMEOUT: Timeout for an ACK from FW for suspend request * @QDF_RESUME_TIMEOUT: Timeout for an ACK from FW for resume request * @QDF_WMI_EXCEED_MAX_PENDING_CMDS: wmi exceed max pending cmd + * @QDF_AP_STA_CONNECT_REQ_TIMEOUT: SAP peer assoc timeout from FW + * @QDF_STA_AP_CONNECT_REQ_TIMEOUT: STA peer assoc timeout from FW + * @QDF_MAC_HW_MODE_CHANGE_TIMEOUT: HW mode change timeout from FW + * @QDF_MAC_HW_MODE_CONFIG_TIMEOUT: HW dual mac cfg timeout from FW + * @QDF_VDEV_START_RESPONSE_TIMED_OUT: Start response timeout from FW + * @QDF_VDEV_RESTART_RESPONSE_TIMED_OUT: Restart response timeout from FW + * @QDF_VDEV_STOP_RESPONSE_TIMED_OUT: Stop response timeout from FW + * @QDF_VDEV_DELETE_RESPONSE_TIMED_OUT: Delete response timeout from FW + * @QDF_VDEV_PEER_DELETE_ALL_RESPONSE_TIMED_OUT: Peer delete all resp timeout */ enum qdf_hang_reason { - QDF_REASON_UNSPECIFIED = 0, - QDF_RX_HASH_NO_ENTRY_FOUND = 1, - QDF_PEER_DELETION_TIMEDOUT = 2, - QDF_PEER_UNMAP_TIMEDOUT = 3, - QDF_SCAN_REQ_EXPIRED = 4, - QDF_SCAN_ATTEMPT_FAILURES = 5, - QDF_GET_MSG_BUFF_FAILURE = 6, - QDF_ACTIVE_LIST_TIMEOUT = 7, - QDF_SUSPEND_TIMEOUT = 8, - QDF_RESUME_TIMEOUT = 9, - QDF_WMI_EXCEED_MAX_PENDING_CMDS = 10, + QDF_REASON_UNSPECIFIED, + QDF_RX_HASH_NO_ENTRY_FOUND, + QDF_PEER_DELETION_TIMEDOUT, + QDF_PEER_UNMAP_TIMEDOUT, + QDF_SCAN_REQ_EXPIRED, + QDF_SCAN_ATTEMPT_FAILURES, + QDF_GET_MSG_BUFF_FAILURE, + QDF_ACTIVE_LIST_TIMEOUT, + QDF_SUSPEND_TIMEOUT, + QDF_RESUME_TIMEOUT, + QDF_WMI_EXCEED_MAX_PENDING_CMDS, + QDF_AP_STA_CONNECT_REQ_TIMEOUT, + QDF_STA_AP_CONNECT_REQ_TIMEOUT, + QDF_MAC_HW_MODE_CHANGE_TIMEOUT, + QDF_MAC_HW_MODE_CONFIG_TIMEOUT, + QDF_VDEV_START_RESPONSE_TIMED_OUT, + QDF_VDEV_RESTART_RESPONSE_TIMED_OUT, + QDF_VDEV_STOP_RESPONSE_TIMED_OUT, + QDF_VDEV_DELETE_RESPONSE_TIMED_OUT, + QDF_VDEV_PEER_DELETE_ALL_RESPONSE_TIMED_OUT, }; /** 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 a4a8cc1b9b..68526be914 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 @@ -40,6 +40,7 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp) struct vdev_stop_response stop_rsp = {0}; struct vdev_delete_response del_rsp = {0}; struct peer_delete_all_response peer_del_all_rsp = {0}; + enum qdf_hang_reason recovery_reason; uint8_t vdev_id; uint16_t rsp_pos = RESPONSE_BIT_MAX; @@ -91,10 +92,12 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp) start_rsp.resp_type = WMI_HOST_VDEV_START_RESP_EVENT; rsp_pos = START_RESPONSE_BIT; + recovery_reason = QDF_VDEV_START_RESPONSE_TIMED_OUT; } else { start_rsp.resp_type = WMI_HOST_VDEV_RESTART_RESP_EVENT; rsp_pos = RESTART_RESPONSE_BIT; + recovery_reason = QDF_VDEV_RESTART_RESPONSE_TIMED_OUT; } target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos); @@ -104,6 +107,7 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp) &vdev_rsp->rsp_status)) { rsp_pos = STOP_RESPONSE_BIT; stop_rsp.vdev_id = vdev_id; + recovery_reason = QDF_VDEV_STOP_RESPONSE_TIMED_OUT; target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos); rx_ops->vdev_mgr_stop_response(psoc, &stop_rsp); @@ -111,6 +115,7 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp) &vdev_rsp->rsp_status)) { del_rsp.vdev_id = vdev_id; rsp_pos = DELETE_RESPONSE_BIT; + recovery_reason = QDF_VDEV_DELETE_RESPONSE_TIMED_OUT; target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos); rx_ops->vdev_mgr_delete_response(psoc, &del_rsp); @@ -118,6 +123,7 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp) &vdev_rsp->rsp_status)) { peer_del_all_rsp.vdev_id = vdev_id; rsp_pos = PEER_DELETE_ALL_RESPONSE_BIT; + recovery_reason = QDF_VDEV_PEER_DELETE_ALL_RESPONSE_TIMED_OUT; target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos); rx_ops->vdev_mgr_peer_delete_all_response( @@ -140,7 +146,7 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp) wlan_psoc_get_id(psoc), vdev_id, string_from_rsp_bit(rsp_pos)); - qdf_trigger_self_recovery(psoc, QDF_REASON_UNSPECIFIED); + qdf_trigger_self_recovery(psoc, recovery_reason); } #ifdef SERIALIZE_VDEV_RESP