summaryrefslogtreecommitdiff
path: root/core/cds
diff options
context:
space:
mode:
authorAnurag Chouhan <achouhan@codeaurora.org>2017-08-24 11:47:59 +0530
committersnandini <snandini@codeaurora.org>2017-08-29 21:27:50 -0700
commit4f5777332333140b4b63448c25a707db27956b78 (patch)
treec58e56accffd010d01993a7b25a31c80469640aa /core/cds
parent527e64c8b3ecba26aa8f40a6f3f319697489dcd6 (diff)
downloadqcacld-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.h23
-rw-r--r--core/cds/inc/cds_config.h26
-rw-r--r--core/cds/inc/cds_sched.h1
-rw-r--r--core/cds/src/cds_api.c41
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);