From c8a43fff94a34db8cfffd7baebf247e075a66256 Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Thu, 18 Mar 2021 16:27:50 -0700 Subject: [PATCH] cnss2: Add support to download hds.bin file to firmware Add support to download hds.bin file as part of boot sequence to firmware for debugging HALPHY issues and use a sysfs node to control the download. Change-Id: I226198d3d9343a13d1bf44456ae35ec54aade683 Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/main.c | 30 ++++++++++++++++++++++++++++++ drivers/net/wireless/cnss2/main.h | 2 ++ drivers/net/wireless/cnss2/qmi.c | 4 ++++ 3 files changed, 36 insertions(+) diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index 719f03bf74fa..29a13b454f8c 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -436,6 +436,8 @@ static int cnss_fw_mem_ready_hdlr(struct cnss_plat_data *plat_priv) if (ret) goto out; + if (plat_priv->hds_enabled) + cnss_wlfw_bdf_dnld_send_sync(plat_priv, CNSS_BDF_HDS); cnss_wlfw_bdf_dnld_send_sync(plat_priv, CNSS_BDF_REGDB); if (plat_priv->device_id == QCN7605_DEVICE_ID) @@ -2635,6 +2637,32 @@ static int cnss_register_bus_scale(struct cnss_plat_data *plat_priv) static void cnss_unregister_bus_scale(struct cnss_plat_data *plat_priv) {} #endif /* CONFIG_INTERCONNECT */ +static ssize_t enable_hds_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct cnss_plat_data *plat_priv = dev_get_drvdata(dev); + unsigned int enable_hds = 0; + + if (!plat_priv) + return -ENODEV; + + if (sscanf(buf, "%du", &enable_hds) != 1) { + cnss_pr_err("Invalid enable_hds sysfs command\n"); + return -EINVAL; + } + + if (enable_hds) + plat_priv->hds_enabled = true; + else + plat_priv->hds_enabled = false; + + cnss_pr_dbg("%s HDS file download, count is %zu\n", + plat_priv->hds_enabled ? "Enable" : "Disable", count); + + return count; +} + static ssize_t recovery_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -2778,6 +2806,7 @@ static ssize_t hw_trace_override_store(struct device *dev, static DEVICE_ATTR_WO(fs_ready); static DEVICE_ATTR_WO(shutdown); static DEVICE_ATTR_WO(recovery); +static DEVICE_ATTR_WO(enable_hds); static DEVICE_ATTR_WO(qdss_trace_start); static DEVICE_ATTR_WO(qdss_trace_stop); static DEVICE_ATTR_WO(qdss_conf_download); @@ -2787,6 +2816,7 @@ static struct attribute *cnss_attrs[] = { &dev_attr_fs_ready.attr, &dev_attr_shutdown.attr, &dev_attr_recovery.attr, + &dev_attr_enable_hds.attr, &dev_attr_qdss_trace_start.attr, &dev_attr_qdss_trace_stop.attr, &dev_attr_qdss_conf_download.attr, diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index 3f614bc2d046..21c12cab7d05 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -343,6 +343,7 @@ enum cnss_bdf_type { CNSS_BDF_BIN, CNSS_BDF_ELF, CNSS_BDF_REGDB = 4, + CNSS_BDF_HDS = 6, }; enum cnss_cal_status { @@ -432,6 +433,7 @@ struct cnss_plat_data { enum cnss_driver_status driver_status; u32 recovery_count; u8 recovery_enabled; + u8 hds_enabled; unsigned long driver_state; struct list_head event_list; spinlock_t event_lock; /* spinlock for driver work event handling */ diff --git a/drivers/net/wireless/cnss2/qmi.c b/drivers/net/wireless/cnss2/qmi.c index a81967ae499c..86ada98758c3 100644 --- a/drivers/net/wireless/cnss2/qmi.c +++ b/drivers/net/wireless/cnss2/qmi.c @@ -23,6 +23,7 @@ #define BIN_BDF_FILE_NAME_PREFIX "bdwlan.b" #define BIN_BDF_FILE_NAME_GF_PREFIX "bdwlang.b" #define REGDB_FILE_NAME "regdb.bin" +#define HDS_FILE_NAME "hds.bin" #define CHIP_ID_GF_MASK 0x10 #define QDSS_TRACE_CONFIG_FILE "qdss_trace_config" @@ -559,6 +560,9 @@ static int cnss_get_bdf_file_name(struct cnss_plat_data *plat_priv, case CNSS_BDF_REGDB: snprintf(filename_tmp, filename_len, REGDB_FILE_NAME); break; + case CNSS_BDF_HDS: + snprintf(filename_tmp, filename_len, HDS_FILE_NAME); + break; default: cnss_pr_err("Invalid BDF type: %d\n", plat_priv->ctrl_params.bdf_type);