From b214c2454c47f48468ffb91b79246cc2cd07a486 Mon Sep 17 00:00:00 2001 From: c_priys Date: Tue, 12 Jun 2018 16:53:51 +0530 Subject: [PATCH] qcacmn: WMI Recording Failure on Multi-radio RDPs WMI recording is done per pdev and hence an instance of debugfs directory (eg: WMI0, WMI1, WMI2 for 3 radio boards) has to be created in /sys/kernel/debug/ path. The wmi handle is per pdev and hence is causing the problem of wmi_instance being 0 always as each pdev has its own wmi_handle. WMI1 and WMI2 debugfs directories are not created as wmi_instance is always 0. WMI debugfs directory is created for every pdev of the psoc and naming convention is changed to WMI_SOCx_PDEVx. Change-Id: Ieb7e9d072d84f699588a8f719508c5cd8d9873fb CRs-Fixed: 2232472 --- wmi/inc/wmi_unified_api.h | 1 + wmi/inc/wmi_unified_priv.h | 5 ++- wmi/src/wmi_unified.c | 78 ++++++++++++++------------------------ 3 files changed, 32 insertions(+), 52 deletions(-) diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index a676b3f915aa..79cd44411397 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -138,6 +138,7 @@ struct wmi_unified_attach_params { struct wmi_rx_ops *rx_ops; struct wlan_objmgr_psoc *psoc; uint16_t max_commands; + uint32_t soc_id; }; /** diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index cd0b00a642ed..def37d114618 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -169,7 +169,6 @@ struct wmi_debug_log_info { uint32_t buf_offset_command; uint32_t buf_offset_event; struct dentry *wmi_log_debugfs_dir; - uint8_t wmi_instance_id; }; #endif /*WMI_INTERFACE_EVENT_LOGGING */ @@ -1700,6 +1699,7 @@ struct wmi_host_abi_version { uint32_t abi_version_ns_3; }; +#define NUM_DEBUG_INFOS 9 struct wmi_unified { void *scn_handle; /* handle to device */ osdev_t osdev; /* handle to use OS-independent services */ @@ -1749,6 +1749,7 @@ struct wmi_unified { uint32_t *services; struct wmi_soc *soc; uint16_t wmi_max_cmds; + struct dentry *debugfs_de[NUM_DEBUG_INFOS]; }; #define WMI_MAX_RADIOS 3 @@ -1778,7 +1779,7 @@ struct wmi_soc { #endif uint32_t services[wmi_services_max]; uint16_t wmi_max_cmds; - + uint32_t soc_idx; }; void wmi_unified_register_module(enum wmi_target_type target_type, diff --git a/wmi/src/wmi_unified.c b/wmi/src/wmi_unified.c index 01f9c35d6287..6695f391c054 100644 --- a/wmi/src/wmi_unified.c +++ b/wmi/src/wmi_unified.c @@ -102,11 +102,6 @@ static int wmi_bp_seq_printf(struct seq_file *m, const char *f, ...) #endif #ifndef MAX_WMI_INSTANCES -#ifdef CONFIG_MCL -#define MAX_WMI_INSTANCES 1 -#else -#define MAX_WMI_INSTANCES 3 -#endif #define CUSTOM_MGMT_CMD_DATA_SIZE 4 #endif @@ -711,11 +706,6 @@ wmi_print_mgmt_event_log(wmi_unified_t wmi, uint32_t count, count, print, print_priv); } -#ifdef CONFIG_MCL -const int8_t * const debugfs_dir[MAX_WMI_INSTANCES] = {"WMI0"}; -#else -const int8_t * const debugfs_dir[MAX_WMI_INSTANCES] = {"WMI0", "WMI1", "WMI2"}; -#endif /* debugfs routines*/ @@ -1002,7 +992,6 @@ static ssize_t debug_wmi_log_size_write(struct file *file, /* Structure to maintain debug information */ struct wmi_debugfs_info { const char *name; - struct dentry *de[MAX_WMI_INSTANCES]; const struct file_operations *ops; }; @@ -1045,7 +1034,7 @@ GENERATE_DEBUG_STRUCTS(wmi_mgmt_event_log); GENERATE_DEBUG_STRUCTS(wmi_enable); GENERATE_DEBUG_STRUCTS(wmi_log_size); -struct wmi_debugfs_info wmi_debugfs_infos[] = { +struct wmi_debugfs_info wmi_debugfs_infos[NUM_DEBUG_INFOS] = { DEBUG_FOO(wmi_command_log), DEBUG_FOO(wmi_command_tx_cmp_log), DEBUG_FOO(wmi_event_log), @@ -1057,8 +1046,6 @@ struct wmi_debugfs_info wmi_debugfs_infos[] = { DEBUG_FOO(wmi_log_size), }; -#define NUM_DEBUG_INFOS (sizeof(wmi_debugfs_infos) / \ - sizeof(wmi_debugfs_infos[0])) /** * wmi_debugfs_create() - Create debug_fs entry for wmi logging. @@ -1070,20 +1057,19 @@ struct wmi_debugfs_info wmi_debugfs_infos[] = { * Return: none */ static void wmi_debugfs_create(wmi_unified_t wmi_handle, - struct dentry *par_entry, int id) + struct dentry *par_entry) { int i; - if (par_entry == NULL || (id < 0) || (id >= MAX_WMI_INSTANCES)) + if (!par_entry) goto out; for (i = 0; i < NUM_DEBUG_INFOS; ++i) { - - wmi_debugfs_infos[i].de[id] = debugfs_create_file( + wmi_handle->debugfs_de[i] = debugfs_create_file( wmi_debugfs_infos[i].name, 0644, par_entry, wmi_handle, wmi_debugfs_infos[i].ops); - if (wmi_debugfs_infos[i].de[id] == NULL) { + if (!wmi_handle->debugfs_de[i]) { qdf_print("%s: debug Entry creation failed!\n", __func__); goto out; @@ -1110,24 +1096,16 @@ static void wmi_debugfs_remove(wmi_unified_t wmi_handle) { int i; struct dentry *dentry = wmi_handle->log_info.wmi_log_debugfs_dir; - int id; - if (!wmi_handle->log_info.wmi_instance_id) - return; - - id = wmi_handle->log_info.wmi_instance_id - 1; - if (dentry && (!(id < 0) || (id >= MAX_WMI_INSTANCES))) { + if (dentry) { for (i = 0; i < NUM_DEBUG_INFOS; ++i) { - if (wmi_debugfs_infos[i].de[id]) - wmi_debugfs_infos[i].de[id] = NULL; + if (wmi_handle->debugfs_de[i]) + wmi_handle->debugfs_de[i] = NULL; } } if (dentry) debugfs_remove_recursive(dentry); - - if (wmi_handle->log_info.wmi_instance_id) - wmi_handle->log_info.wmi_instance_id--; } /** @@ -1138,25 +1116,22 @@ static void wmi_debugfs_remove(wmi_unified_t wmi_handle) * * Return: init status */ -static QDF_STATUS wmi_debugfs_init(wmi_unified_t wmi_handle) +static QDF_STATUS wmi_debugfs_init(wmi_unified_t wmi_handle, uint32_t pdev_idx) { - int wmi_index = wmi_handle->log_info.wmi_instance_id; + char buf[32]; - if (wmi_index < MAX_WMI_INSTANCES) { - wmi_handle->log_info.wmi_log_debugfs_dir = - debugfs_create_dir(debugfs_dir[wmi_index], NULL); + snprintf(buf, sizeof(buf), "WMI_SOC%u_PDEV%u", + wmi_handle->soc->soc_idx, pdev_idx); - if (!wmi_handle->log_info.wmi_log_debugfs_dir) { - qdf_print("error while creating debugfs dir for %s\n", - debugfs_dir[wmi_index]); - return QDF_STATUS_E_FAILURE; - } + wmi_handle->log_info.wmi_log_debugfs_dir = + debugfs_create_dir(buf, NULL); - wmi_debugfs_create(wmi_handle, - wmi_handle->log_info.wmi_log_debugfs_dir, - wmi_index); - wmi_handle->log_info.wmi_instance_id++; + if (!wmi_handle->log_info.wmi_log_debugfs_dir) { + qdf_print("error while creating debugfs dir for %s\n", buf); + return QDF_STATUS_E_FAILURE; } + wmi_debugfs_create(wmi_handle, + wmi_handle->log_info.wmi_log_debugfs_dir); return QDF_STATUS_SUCCESS; } @@ -2014,15 +1989,17 @@ void *wmi_unified_get_soc_handle(struct wmi_unified *wmi_handle) * return: None */ #ifdef WMI_INTERFACE_EVENT_LOGGING -static inline void wmi_interface_logging_init(struct wmi_unified *wmi_handle) +static inline void wmi_interface_logging_init(struct wmi_unified *wmi_handle, + uint32_t pdev_idx) { if (QDF_STATUS_SUCCESS == wmi_log_init(wmi_handle)) { qdf_spinlock_create(&wmi_handle->log_info.wmi_record_lock); - wmi_debugfs_init(wmi_handle); + wmi_debugfs_init(wmi_handle, pdev_idx); } } #else -static inline void wmi_interface_logging_init(struct wmi_unified *wmi_handle) +static inline void wmi_interface_logging_init(struct wmi_unified *wmi_handle, + uint32_t pdev_idx) { } #endif @@ -2091,12 +2068,12 @@ void *wmi_unified_get_pdev_handle(struct wmi_soc *soc, uint32_t pdev_idx) } wmi_handle->wmi_events = soc->wmi_events; wmi_target_params_init(soc, wmi_handle); - wmi_interface_logging_init(wmi_handle); + wmi_handle->soc = soc; + wmi_interface_logging_init(wmi_handle, pdev_idx); qdf_atomic_init(&wmi_handle->pending_cmds); qdf_atomic_init(&wmi_handle->is_target_suspended); wmi_handle->target_type = soc->target_type; wmi_handle->wmi_max_cmds = soc->wmi_max_cmds; - wmi_handle->soc = soc; soc->wmi_pdev[pdev_idx] = wmi_handle; } else @@ -2162,6 +2139,7 @@ void *wmi_unified_attach(void *scn_handle, return NULL; } wmi_handle->soc = soc; + wmi_handle->soc->soc_idx = param->soc_id; wmi_handle->event_id = soc->event_id; wmi_handle->event_handler = soc->event_handler; wmi_handle->ctx = soc->ctx; @@ -2182,7 +2160,7 @@ void *wmi_unified_attach(void *scn_handle, WMI_LOGE("failed to create wmi_rx_event_work_queue"); goto error; } - wmi_interface_logging_init(wmi_handle); + wmi_interface_logging_init(wmi_handle, WMI_HOST_PDEV_ID_0); /* Attach mc_thread context processing function */ wmi_handle->rx_ops.wma_process_fw_event_handler_cbk = param->rx_ops->wma_process_fw_event_handler_cbk;