From bf48fb69ac36257fb5efb4a7ecb8d6443c236937 Mon Sep 17 00:00:00 2001 From: Naga Date: Tue, 23 Jul 2019 12:36:16 +0530 Subject: [PATCH] qcacmn: Add support to print vdev req/resp string Add support to print vdev req/resp string on target_if timer start conflict and timer timeout handler Change-Id: I0116c03089f4ab80623596bb9e8d0268efb0dd87 CRs-Fixed: 2495018 --- .../vdev_mgr/src/target_if_vdev_mgr_rx_ops.c | 60 +++++++++++++------ .../vdev_mgr/src/target_if_vdev_mgr_tx_ops.c | 11 ++-- .../inc/wlan_vdev_mgr_tgt_if_rx_defs.h | 40 +++++++++++-- 3 files changed, 81 insertions(+), 30 deletions(-) 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 4213cea319ba..f78f75f2c6b7 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 @@ -45,6 +45,7 @@ void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg) struct vdev_delete_response del_rsp = {0}; struct peer_delete_all_response peer_del_all_rsp = {0}; uint8_t vdev_id; + uint16_t rsp_pos = RESPONSE_BIT_MAX; vdev_id = wlan_vdev_get_id(vdev); mlme_debug("Response timer expired for VDEV %d", vdev_id); @@ -77,10 +78,13 @@ void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg) qdf_is_fw_down()) { /* this ensures stop timer will not be done in target_if */ vdev_rsp->timer_status = QDF_STATUS_E_TIMEOUT; - if (qdf_atomic_test_bit(START_RESPONSE_BIT, - &vdev_rsp->rsp_status) || - qdf_atomic_test_bit(RESTART_RESPONSE_BIT, - &vdev_rsp->rsp_status)) { + } + + if (qdf_atomic_test_bit(START_RESPONSE_BIT, + &vdev_rsp->rsp_status) || + qdf_atomic_test_bit(RESTART_RESPONSE_BIT, + &vdev_rsp->rsp_status)) { + if (vdev_rsp->timer_status == QDF_STATUS_E_TIMEOUT) { start_rsp.vdev_id = wlan_vdev_get_id(vdev); start_rsp.status = WLAN_MLME_HOST_VDEV_START_TIMEOUT; if (qdf_atomic_test_bit(START_RESPONSE_BIT, @@ -92,39 +96,57 @@ void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg) WMI_HOST_VDEV_RESTART_RESP_EVENT; rx_ops->vdev_mgr_start_response(psoc, &start_rsp); + } else { + if (qdf_atomic_test_bit(START_RESPONSE_BIT, + &vdev_rsp->rsp_status)) + rsp_pos = START_RESPONSE_BIT; + else + rsp_pos = RESTART_RESPONSE_BIT; } - - if (qdf_atomic_test_bit(STOP_RESPONSE_BIT, - &vdev_rsp->rsp_status)) { + } else if (qdf_atomic_test_bit(STOP_RESPONSE_BIT, + &vdev_rsp->rsp_status)) { + if (vdev_rsp->timer_status == QDF_STATUS_E_TIMEOUT) { stop_rsp.vdev_id = wlan_vdev_get_id(vdev); rx_ops->vdev_mgr_stop_response(psoc, &stop_rsp); + } else { + rsp_pos = STOP_RESPONSE_BIT; } - - if (qdf_atomic_test_bit(DELETE_RESPONSE_BIT, - &vdev_rsp->rsp_status)) { + } else if (qdf_atomic_test_bit(DELETE_RESPONSE_BIT, + &vdev_rsp->rsp_status)) { + if (vdev_rsp->timer_status == QDF_STATUS_E_TIMEOUT) { del_rsp.vdev_id = wlan_vdev_get_id(vdev); rx_ops->vdev_mgr_delete_response(psoc, &del_rsp); + } else { + rsp_pos = DELETE_RESPONSE_BIT; } - if (qdf_atomic_test_bit(PEER_DELETE_ALL_RESPONSE_BIT, - &vdev_rsp->rsp_status)) { + } else if (qdf_atomic_test_bit(PEER_DELETE_ALL_RESPONSE_BIT, + &vdev_rsp->rsp_status)) { + if (vdev_rsp->timer_status == QDF_STATUS_E_TIMEOUT) { peer_del_all_rsp.vdev_id = wlan_vdev_get_id(vdev); rx_ops->vdev_mgr_peer_delete_all_response( - psoc, - &peer_del_all_rsp); + psoc, + &peer_del_all_rsp); + } else { + rsp_pos = PEER_DELETE_ALL_RESPONSE_BIT; } - + } else { + mlme_err("PSOC_%d VDEV_%d: Unknown error", + wlan_psoc_get_id(psoc), vdev_id); return; } + if (vdev_rsp->timer_status == QDF_STATUS_E_TIMEOUT) + return; + if (target_if_vdev_mgr_is_panic_on_bug()) { - QDF_DEBUG_PANIC("PSOC_%d VDEV_%d: Panic on bug, rsp status:%d", + QDF_DEBUG_PANIC("PSOC_%d VDEV_%d: Panic, %s response timeout", wlan_psoc_get_id(psoc), - vdev_id, vdev_rsp->rsp_status); + vdev_id, string_from_rsp_bit(rsp_pos)); } else { - mlme_err("PSOC_%d VDEV_%d: Trigger Self recovery, rsp status%d", + mlme_err("PSOC_%d VDEV_%d: Self recovery, %s response timeout", wlan_psoc_get_id(psoc), - vdev_id, vdev_rsp->rsp_status); + 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); diff --git a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c index c84e2fd5dfa8..49b6ddaa7d07 100644 --- a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c +++ b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c @@ -109,10 +109,10 @@ static QDF_STATUS target_if_vdev_mgr_rsp_timer_start( if (rsp_pos != set_bit) { if (qdf_atomic_test_bit(rsp_pos, &vdev_rsp->rsp_status)) { - mlme_err("PSOC_%d VDEV_%d: Request bit %d, response bit %d", + mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response", wlan_psoc_get_id(psoc), - vdev_id, set_bit, - vdev_rsp->rsp_status); + vdev_id, string_from_rsp_bit(set_bit), + string_from_rsp_bit(rsp_pos)); target_if_vdev_mgr_assert_mgmt(vdev, vdev_rsp, rsp_pos); target_if_vdev_mgr_rsp_timer_stop(vdev, @@ -123,9 +123,10 @@ static QDF_STATUS target_if_vdev_mgr_rsp_timer_start( } if (qdf_atomic_test_and_set_bit(set_bit, &vdev_rsp->rsp_status)) { - mlme_err("PSOC_%d VDEV_%d: Request bit: %d, response bit %d", + mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response", wlan_psoc_get_id(psoc), - vdev_id, set_bit, vdev_rsp->rsp_status); + vdev_id, string_from_rsp_bit(set_bit), + string_from_rsp_bit(set_bit)); target_if_vdev_mgr_assert_mgmt(vdev, vdev_rsp, set_bit); target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, set_bit); diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h index a237b58dc7ab..15283e65e946 100644 --- a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h +++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h @@ -28,12 +28,40 @@ #include -#define START_RESPONSE_BIT 0x1 -#define RESTART_RESPONSE_BIT 0x2 -#define STOP_RESPONSE_BIT 0x3 -#define DELETE_RESPONSE_BIT 0x4 -#define PEER_DELETE_ALL_RESPONSE_BIT 0x5 -#define RESPONSE_BIT_MAX PEER_DELETE_ALL_RESPONSE_BIT +/** + * enum wlan_vdev_mgr_tgt_if_rsp_bit - response status bit + * START_RESPONSE_BIT: vdev start response bit + * RESTART_RESPONSE_BIT: vdev restart response bit + * STOP_RESPONSE_BIT: vdev stop response bit + * DELETE_RESPONSE_BIT: vdev delete response bit + * PEER_DELETE_ALL_RESPONSE_BIT: vdev peer delete all response bit + */ +enum wlan_vdev_mgr_tgt_if_rsp_bit { + START_RESPONSE_BIT = 0, + RESTART_RESPONSE_BIT = 1, + STOP_RESPONSE_BIT = 2, + DELETE_RESPONSE_BIT = 3, + PEER_DELETE_ALL_RESPONSE_BIT = 4, + RESPONSE_BIT_MAX, +}; + +/** + * string_from_rsp_bit() - Convert response bit to string + * @bit - response bit as in wlan_vdev_mgr_tgt_if_rsp_bit + * + * Please note to add new string in the array at index equal to + * its enum value in wlan_vdev_mgr_tgt_if_rsp_bit. + */ +static inline char *string_from_rsp_bit(enum wlan_vdev_mgr_tgt_if_rsp_bit bit) +{ + static const char *strings[] = { "START", + "RESTART", + "STOP", + "DELETE", + "PEER DELETE ALL", + "RESPONE MAX"}; + return (char *)strings[bit]; +} #define START_RESPONSE_TIMER 6000 /* 6 seconds */ #define STOP_RESPONSE_TIMER 3000 /* 3 seconds */