From 81f73d678b1d69be6fb6acebe236d585b8a273c1 Mon Sep 17 00:00:00 2001 From: Arun Kumar Khandavalli Date: Tue, 24 Mar 2020 22:13:46 +0530 Subject: [PATCH] qcacld-3.0: update the hang data for the cds module Update the hang data for the cds module, as part of the hang data following information is filled: 1) Hang Event version 2) Wlan Driver version 3) Reason for recovery Change-Id: Ie5a008d1f9512f8e83a1d099fe333b0d2ce90abb CRs-Fixed: 2650848 --- core/cds/src/cds_api.c | 54 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c index dc5a6c92eaa9..ae7091e4864e 100644 --- a/core/cds/src/cds_api.c +++ b/core/cds/src/cds_api.c @@ -76,6 +76,10 @@ #include "wlan_mlme_ucfg_api.h" #include "cfg_ucfg_api.h" #include "wlan_cp_stats_mc_ucfg_api.h" +#include +#include +#include +#include /* Preprocessor Definitions and Constants */ @@ -88,6 +92,13 @@ static struct __qdf_device g_qdf_ctx; static uint8_t cds_multicast_logging; +struct cds_hang_event_fixed_param { + uint32_t tlv_header; + uint32_t recovery_reason; + char driver_version[11]; + char hang_event_version[3]; +} qdf_packed; + #ifdef QCA_WIFI_QCA8074 static inline int cds_send_delba(struct cdp_ctrl_objmgr_psoc *psoc, @@ -515,6 +526,47 @@ cds_set_ac_specs_params(struct cds_config_info *cds_cfg) } } +static int cds_hang_event_notifier_call(struct notifier_block *block, + unsigned long state, + void *data) +{ + struct qdf_notifer_data *cds_hang_data = data; + uint32_t total_len; + struct cds_hang_event_fixed_param *cmd; + uint8_t *cds_hang_evt_buff; + + if (!cds_hang_data) + return NOTIFY_STOP_MASK; + + cds_hang_evt_buff = cds_hang_data->hang_data; + + if (!cds_hang_evt_buff) + return NOTIFY_STOP_MASK; + + if (cds_hang_data->offset >= QDF_WLAN_MAX_HOST_OFFSET) + return NOTIFY_STOP_MASK; + + total_len = sizeof(*cmd); + + cds_hang_evt_buff = cds_hang_data->hang_data + cds_hang_data->offset; + cmd = (struct cds_hang_event_fixed_param *)cds_hang_evt_buff; + QDF_HANG_EVT_SET_HDR(&cmd->tlv_header, HANG_EVT_TAG_CDS, + QDF_HANG_GET_STRUCT_TLVLEN(*cmd)); + + cmd->recovery_reason = gp_cds_context->recovery_reason; + + qdf_mem_copy(&cmd->driver_version, QWLAN_VERSIONSTR, 11); + + qdf_mem_copy(&cmd->hang_event_version, QDF_HANG_EVENT_VERSION, 3); + + cds_hang_data->offset += total_len; + return NOTIFY_OK; +} + +static qdf_notif_block cds_hang_event_notifier = { + .notif_block.notifier_call = cds_hang_event_notifier_call, +}; + /** * cds_open() - open the CDS Module * @@ -740,6 +792,7 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc) } ucfg_mc_cp_stats_register_pmo_handler(); + qdf_hang_event_register_notifier(&cds_hang_event_notifier); return QDF_STATUS_SUCCESS; @@ -1169,6 +1222,7 @@ QDF_STATUS cds_close(struct wlan_objmgr_psoc *psoc) { QDF_STATUS qdf_status; + qdf_hang_event_unregister_notifier(&cds_hang_event_notifier); qdf_status = cds_sched_close(); QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status)); if (QDF_IS_STATUS_ERROR(qdf_status))