diff options
author | Anurag Chouhan <achouhan@codeaurora.org> | 2017-08-24 11:47:59 +0530 |
---|---|---|
committer | snandini <snandini@codeaurora.org> | 2017-08-29 21:27:50 -0700 |
commit | 4f5777332333140b4b63448c25a707db27956b78 (patch) | |
tree | c58e56accffd010d01993a7b25a31c80469640aa /core/cds | |
parent | 527e64c8b3ecba26aa8f40a6f3f319697489dcd6 (diff) | |
download | qcacld-4f5777332333140b4b63448c25a707db27956b78.tar.gz |
qcacld-3.0: Add vendor event to get the driver hang reason
Add Vendor Event to get the driver hang reason indicating to the
user space that the driver has detected an internal failure.
This event carries the information indicating the reason that triggered
this detection.
Change-Id: I3934f2a18c796ed3b53175dcbe7efd7f4d1409b9
CRs-fixed: 2098498
Diffstat (limited to 'core/cds')
-rw-r--r-- | core/cds/inc/cds_api.h | 23 | ||||
-rw-r--r-- | core/cds/inc/cds_config.h | 26 | ||||
-rw-r--r-- | core/cds/inc/cds_sched.h | 1 | ||||
-rw-r--r-- | core/cds/src/cds_api.c | 41 |
4 files changed, 89 insertions, 2 deletions
diff --git a/core/cds/inc/cds_api.h b/core/cds/inc/cds_api.h index 46318c8f43..e8b6442486 100644 --- a/core/cds/inc/cds_api.h +++ b/core/cds/inc/cds_api.h @@ -422,7 +422,28 @@ bool cds_is_packet_log_enabled(void); uint64_t cds_get_monotonic_boottime(void); -void cds_trigger_recovery(void); +/** + * cds_get_recovery_reason() - get self recovery reason + * @reason: cds hang reason + * + * Return: None + */ +void cds_get_recovery_reason(enum cds_hang_reason *reason); + +/** + * cds_reset_recovery_reason() - reset the reason to unspecified + * + * Return: None + */ +void cds_reset_recovery_reason(void); + +/** + * cds_trigger_recovery() - trigger self recovery + * @reason: recovery reason + * + * Return: none + */ +void cds_trigger_recovery(enum cds_hang_reason reason); void cds_set_wakelock_logging(bool value); bool cds_is_wakelock_enabled(void); diff --git a/core/cds/inc/cds_config.h b/core/cds/inc/cds_config.h index 4553eb0fad..2de4add797 100644 --- a/core/cds/inc/cds_config.h +++ b/core/cds/inc/cds_config.h @@ -56,6 +56,32 @@ enum active_bpf_mode { }; /** + * enum cds_hang_reason - host hang/ssr reason + * @CDS_REASON_UNSPECIFIED: Unspecified reason + * @CDS_RX_HASH_NO_ENTRY_FOUND: No Map for the MAC entry for the received frame + * @CDS_PEER_DELETION_TIMEDOUT: peer deletion timeout happened + * @CDS_PEER_UNMAP_TIMEDOUT: peer unmap timeout + * @CDS_SCAN_REQ_EXPIRED: Scan request timed out + * @CDS_SCAN_ATTEMPT_FAILURES: Consecutive Scan attempt failures + * @CDS_GET_MSG_BUFF_FAILURE: Unable to get the message buffer + * @CDS_ACTIVE_LIST_TIMEOUT: Current command processing is timedout + * @CDS_SUSPEND_TIMEOUT: Timeout for an ACK from FW for suspend request + * @CDS_RESUME_TIMEOUT: Timeout for an ACK from FW for resume request + */ +enum cds_hang_reason { + CDS_REASON_UNSPECIFIED = 0, + CDS_RX_HASH_NO_ENTRY_FOUND = 1, + CDS_PEER_DELETION_TIMEDOUT = 2, + CDS_PEER_UNMAP_TIMEDOUT = 3, + CDS_SCAN_REQ_EXPIRED = 4, + CDS_SCAN_ATTEMPT_FAILURES = 5, + CDS_GET_MSG_BUFF_FAILURE = 6, + CDS_ACTIVE_LIST_TIMEOUT = 7, + CDS_SUSPEND_TIMEOUT = 8, + CDS_RESUME_TIMEOUT = 9, +}; + +/** * struct cds_config_info - Place Holder for cds configuration * @max_station: Max station supported * @max_bssid: Max Bssid Supported diff --git a/core/cds/inc/cds_sched.h b/core/cds/inc/cds_sched.h index f6ee2e422f..7cf7105f86 100644 --- a/core/cds/inc/cds_sched.h +++ b/core/cds/inc/cds_sched.h @@ -338,6 +338,7 @@ typedef struct _cds_context_type { uint8_t cur_conc_system_pref; qdf_work_t cds_recovery_work; qdf_workqueue_t *cds_recovery_wq; + enum cds_hang_reason recovery_reason; } cds_context_type, *p_cds_contextType; extern struct _cds_sched_context *gp_cds_sched_context; diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c index 0a57255bce..d633866fb9 100644 --- a/core/cds/src/cds_api.c +++ b/core/cds/src/cds_api.c @@ -1857,12 +1857,51 @@ static void cds_trigger_recovery_work(void *param) } /** + * cds_get_recovery_reason() - get self recovery reason + * @reason: recovery reason + * + * Return: None + */ +void cds_get_recovery_reason(enum cds_hang_reason *reason) +{ + if (!gp_cds_context) { + cds_err("gp_cds_context is null"); + return; + } + + *reason = gp_cds_context->recovery_reason; +} + +/** + * cds_reset_recovery_reason() - reset the reason to unspecified + * + * Return: None + */ +void cds_reset_recovery_reason(void) +{ + if (!gp_cds_context) { + cds_err("gp_cds_context is null"); + return; + } + + gp_cds_context->recovery_reason = CDS_REASON_UNSPECIFIED; +} + +/** * cds_trigger_recovery() - trigger self recovery + * @reason: recovery reason * * Return: none */ -void cds_trigger_recovery(void) +void cds_trigger_recovery(enum cds_hang_reason reason) { + if (!gp_cds_context) { + cds_err("gp_cds_context is null"); + return; + } + + gp_cds_context->recovery_reason = reason; + if (in_atomic()) { qdf_queue_work(0, gp_cds_context->cds_recovery_wq, &gp_cds_context->cds_recovery_work); |