|
@@ -37,10 +37,6 @@
|
|
|
#define MAX_USER_COMMAND_SIZE_WOWL_PATTERN 512
|
|
|
#define MAX_USER_COMMAND_SIZE_FRAME 4096
|
|
|
|
|
|
-#ifdef WLAN_POWER_DEBUGFS
|
|
|
-#define POWER_DEBUGFS_BUFFER_MAX_LEN 4096
|
|
|
-#endif
|
|
|
-
|
|
|
#define MAX_DEBUGFS_WAIT_ITERATIONS 20
|
|
|
#define DEBUGFS_WAIT_SLEEP_TIME 100
|
|
|
|
|
@@ -424,227 +420,6 @@ static ssize_t wcnss_patterngen_write(struct file *file,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-#ifdef WLAN_POWER_DEBUGFS
|
|
|
-struct power_stats_priv {
|
|
|
- struct power_stats_response power_stats;
|
|
|
-};
|
|
|
-
|
|
|
-static void hdd_power_debugstats_dealloc(void *priv)
|
|
|
-{
|
|
|
- struct power_stats_priv *stats = priv;
|
|
|
-
|
|
|
- qdf_mem_free(stats->power_stats.debug_registers);
|
|
|
-}
|
|
|
-
|
|
|
-static void hdd_power_debugstats_cb(struct power_stats_response *response,
|
|
|
- void *context)
|
|
|
-{
|
|
|
- struct osif_request *request;
|
|
|
- struct power_stats_priv *priv;
|
|
|
- uint32_t *debug_registers;
|
|
|
- uint32_t debug_registers_len;
|
|
|
-
|
|
|
- hdd_enter();
|
|
|
-
|
|
|
- request = osif_request_get(context);
|
|
|
- if (!request) {
|
|
|
- hdd_err("Obsolete request");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- priv = osif_request_priv(request);
|
|
|
-
|
|
|
- /* copy fixed-sized data */
|
|
|
- priv->power_stats = *response;
|
|
|
-
|
|
|
- /* copy variable-size data */
|
|
|
- if (response->num_debug_register) {
|
|
|
- debug_registers_len = (sizeof(response->debug_registers[0]) *
|
|
|
- response->num_debug_register);
|
|
|
- debug_registers = qdf_mem_malloc(debug_registers_len);
|
|
|
- priv->power_stats.debug_registers = debug_registers;
|
|
|
- if (debug_registers) {
|
|
|
- qdf_mem_copy(debug_registers,
|
|
|
- response->debug_registers,
|
|
|
- debug_registers_len);
|
|
|
- } else {
|
|
|
- hdd_err("Power stats memory alloc fails!");
|
|
|
- priv->power_stats.num_debug_register = 0;
|
|
|
- }
|
|
|
- }
|
|
|
- osif_request_complete(request);
|
|
|
- osif_request_put(request);
|
|
|
- hdd_exit();
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * __wlan_hdd_read_power_debugfs() - API to collect Chip power stats from FW
|
|
|
- * @file: file pointer
|
|
|
- * @buf: buffer
|
|
|
- * @count: count
|
|
|
- * @pos: position pointer
|
|
|
- *
|
|
|
- * Return: Number of bytes read on success, error number otherwise
|
|
|
- */
|
|
|
-static ssize_t __wlan_hdd_read_power_debugfs(struct file *file,
|
|
|
- char __user *buf,
|
|
|
- size_t count, loff_t *pos)
|
|
|
-{
|
|
|
- struct hdd_adapter *adapter;
|
|
|
- struct hdd_context *hdd_ctx;
|
|
|
- QDF_STATUS status;
|
|
|
- struct power_stats_response *chip_power_stats;
|
|
|
- ssize_t ret_cnt = 0;
|
|
|
- int j;
|
|
|
- unsigned int len = 0;
|
|
|
- char *power_debugfs_buf = NULL;
|
|
|
- void *cookie;
|
|
|
- struct osif_request *request;
|
|
|
- struct power_stats_priv *priv;
|
|
|
- static const struct osif_request_params params = {
|
|
|
- .priv_size = sizeof(*priv),
|
|
|
- .timeout_ms = WLAN_WAIT_TIME_STATS,
|
|
|
- .dealloc = hdd_power_debugstats_dealloc,
|
|
|
- };
|
|
|
-
|
|
|
- hdd_enter();
|
|
|
- adapter = (struct hdd_adapter *)file->private_data;
|
|
|
- if ((!adapter) || (WLAN_HDD_ADAPTER_MAGIC != adapter->magic)) {
|
|
|
- hdd_err("Invalid adapter or adapter has invalid magic");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
- hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
|
|
- ret_cnt = wlan_hdd_validate_context(hdd_ctx);
|
|
|
- if (0 != ret_cnt)
|
|
|
- return ret_cnt;
|
|
|
-
|
|
|
- if (!wlan_hdd_validate_modules_state(hdd_ctx))
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- request = osif_request_alloc(¶ms);
|
|
|
- if (!request) {
|
|
|
- hdd_err("Request allocation failure");
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
- cookie = osif_request_cookie(request);
|
|
|
-
|
|
|
- status = sme_power_debug_stats_req(hdd_ctx->mac_handle,
|
|
|
- hdd_power_debugstats_cb,
|
|
|
- cookie);
|
|
|
- if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
- hdd_err("chip power stats request failed");
|
|
|
- ret_cnt = -EINVAL;
|
|
|
- goto cleanup;
|
|
|
- }
|
|
|
-
|
|
|
- ret_cnt = osif_request_wait_for_response(request);
|
|
|
- if (ret_cnt) {
|
|
|
- hdd_err("Target response timed out Power stats");
|
|
|
- ret_cnt = -ETIMEDOUT;
|
|
|
- goto cleanup;
|
|
|
- }
|
|
|
-
|
|
|
- priv = osif_request_priv(request);
|
|
|
- chip_power_stats = &priv->power_stats;
|
|
|
-
|
|
|
- power_debugfs_buf = qdf_mem_malloc(POWER_DEBUGFS_BUFFER_MAX_LEN);
|
|
|
- if (!power_debugfs_buf) {
|
|
|
- hdd_err("Power stats buffer alloc fails!");
|
|
|
- ret_cnt = -EINVAL;
|
|
|
- goto cleanup;
|
|
|
- }
|
|
|
-
|
|
|
- len += scnprintf(power_debugfs_buf, POWER_DEBUGFS_BUFFER_MAX_LEN,
|
|
|
- "POWER DEBUG STATS\n=================\n"
|
|
|
- "cumulative_sleep_time_ms: %d\n"
|
|
|
- "cumulative_total_on_time_ms: %d\n"
|
|
|
- "deep_sleep_enter_counter: %d\n"
|
|
|
- "last_deep_sleep_enter_tstamp_ms: %d\n"
|
|
|
- "debug_register_fmt: %d\n"
|
|
|
- "num_debug_register: %d\n",
|
|
|
- chip_power_stats->cumulative_sleep_time_ms,
|
|
|
- chip_power_stats->cumulative_total_on_time_ms,
|
|
|
- chip_power_stats->deep_sleep_enter_counter,
|
|
|
- chip_power_stats->last_deep_sleep_enter_tstamp_ms,
|
|
|
- chip_power_stats->debug_register_fmt,
|
|
|
- chip_power_stats->num_debug_register);
|
|
|
-
|
|
|
- for (j = 0; j < chip_power_stats->num_debug_register; j++) {
|
|
|
- if ((POWER_DEBUGFS_BUFFER_MAX_LEN - len) > 0)
|
|
|
- len += scnprintf(power_debugfs_buf + len,
|
|
|
- POWER_DEBUGFS_BUFFER_MAX_LEN - len,
|
|
|
- "debug_registers[%d]: 0x%x\n", j,
|
|
|
- chip_power_stats->debug_registers[j]);
|
|
|
- else
|
|
|
- j = chip_power_stats->num_debug_register;
|
|
|
- }
|
|
|
-
|
|
|
- ret_cnt = simple_read_from_buffer(buf, count, pos,
|
|
|
- power_debugfs_buf, len);
|
|
|
-
|
|
|
- cleanup:
|
|
|
- qdf_mem_free(power_debugfs_buf);
|
|
|
- osif_request_put(request);
|
|
|
-
|
|
|
- return ret_cnt;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wlan_hdd_read_power_debugfs() - SSR wrapper function to read power debugfs
|
|
|
- * @file: file pointer
|
|
|
- * @buf: buffer
|
|
|
- * @count: count
|
|
|
- * @pos: position pointer
|
|
|
- *
|
|
|
- * Return: Number of bytes read on success, error number otherwise
|
|
|
- */
|
|
|
-static ssize_t wlan_hdd_read_power_debugfs(struct file *file,
|
|
|
- char __user *buf,
|
|
|
- size_t count, loff_t *pos)
|
|
|
-{
|
|
|
- int ret;
|
|
|
-
|
|
|
- cds_ssr_protect(__func__);
|
|
|
- ret = __wlan_hdd_read_power_debugfs(file, buf, count, pos);
|
|
|
- cds_ssr_unprotect(__func__);
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * __wlan_hdd_open_power_debugfs() - Function to save private on open
|
|
|
- * @inode: Pointer to inode structure
|
|
|
- * @file: file pointer
|
|
|
- *
|
|
|
- * Return: zero
|
|
|
- */
|
|
|
-static int __wlan_hdd_open_power_debugfs(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- file->private_data = inode->i_private;
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-/**
|
|
|
- * wlan_hdd_open_power_debugfs() - SSR wrapper function to save private on open
|
|
|
- * @inode: Pointer to inode structure
|
|
|
- * @file: file pointer
|
|
|
- *
|
|
|
- * Return: zero
|
|
|
- */
|
|
|
-static int wlan_hdd_open_power_debugfs(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- int ret;
|
|
|
-
|
|
|
- cds_ssr_protect(__func__);
|
|
|
- ret = __wlan_hdd_open_power_debugfs(inode, file);
|
|
|
- cds_ssr_unprotect(__func__);
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
/**
|
|
|
* __wcnss_debugfs_open() - Generic debugfs open() handler
|
|
|
* @inode: inode of the debugfs file
|
|
@@ -709,37 +484,6 @@ static const struct file_operations fops_patterngen = {
|
|
|
.llseek = default_llseek,
|
|
|
};
|
|
|
|
|
|
-#ifdef WLAN_POWER_DEBUGFS
|
|
|
-static const struct file_operations fops_powerdebugs = {
|
|
|
- .read = wlan_hdd_read_power_debugfs,
|
|
|
- .open = wlan_hdd_open_power_debugfs,
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .llseek = default_llseek,
|
|
|
-};
|
|
|
-
|
|
|
-/**
|
|
|
- * wlan_hdd_create_power_stats_file() - API to create power stats file
|
|
|
- * @adapter: interface adapter pointer
|
|
|
- *
|
|
|
- * Return: QDF_STATUS
|
|
|
- */
|
|
|
-static QDF_STATUS wlan_hdd_create_power_stats_file(struct hdd_adapter *adapter)
|
|
|
-{
|
|
|
- if (!debugfs_create_file("power_stats", 00400 | 00040 | 00004,
|
|
|
- adapter->debugfs_phy, adapter,
|
|
|
- &fops_powerdebugs))
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
-
|
|
|
- return QDF_STATUS_SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-#else
|
|
|
-static QDF_STATUS wlan_hdd_create_power_stats_file(struct hdd_adapter *adapter)
|
|
|
-{
|
|
|
- return QDF_STATUS_SUCCESS;
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
/**
|
|
|
* hdd_debugfs_init() - Initialize debugfs interface
|
|
|
* @adapter: interface adapter pointer
|
|
@@ -771,9 +515,6 @@ QDF_STATUS hdd_debugfs_init(struct hdd_adapter *adapter)
|
|
|
&fops_patterngen))
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
|
|
|
- if (QDF_STATUS_SUCCESS != wlan_hdd_create_power_stats_file(adapter))
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
-
|
|
|
if (0 != wlan_hdd_create_ll_stats_file(adapter))
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
|