Add testmode interface for starting and using UTF firmware which is used to run
factory tests. This is implemented by adding new state ATH10K_STATE_UTF and user
space can enable this state with ATH10K_TM_CMD_UTF_START command. To go back to
normal mode user space can send ATH10K_TM_CMD_UTF_STOP.
Signed-off-by: Kalle Valo kv...@qca.qualcomm.com
---
drivers/net/wireless/ath/ath10k/Makefile |1
drivers/net/wireless/ath/ath10k/core.c | 88 --
drivers/net/wireless/ath/ath10k/core.h | 22 +-
drivers/net/wireless/ath/ath10k/debug.c |5
drivers/net/wireless/ath/ath10k/debug.h |1
drivers/net/wireless/ath/ath10k/hw.h |2
drivers/net/wireless/ath/ath10k/mac.c|9 +
drivers/net/wireless/ath/ath10k/testmode.c | 375 ++
drivers/net/wireless/ath/ath10k/testmode.h | 46 +++
drivers/net/wireless/ath/ath10k/testmode_i.h | 70 +
drivers/net/wireless/ath/ath10k/wmi.c| 17 +
11 files changed, 606 insertions(+), 30 deletions(-)
create mode 100644 drivers/net/wireless/ath/ath10k/testmode.c
create mode 100644 drivers/net/wireless/ath/ath10k/testmode.h
create mode 100644 drivers/net/wireless/ath/ath10k/testmode_i.h
diff --git a/drivers/net/wireless/ath/ath10k/Makefile
b/drivers/net/wireless/ath/ath10k/Makefile
index 2cfb63ca9327..8b1b1adb477a 100644
--- a/drivers/net/wireless/ath/ath10k/Makefile
+++ b/drivers/net/wireless/ath/ath10k/Makefile
@@ -11,6 +11,7 @@ ath10k_core-y += mac.o \
bmi.o
ath10k_core-$(CONFIG_ATH10K_DEBUGFS) += spectral.o
+ath10k_core-$(CONFIG_NL80211_TESTMODE) += testmode.o
ath10k_core-$(CONFIG_ATH10K_TRACING) += trace.o
obj-$(CONFIG_ATH10K_PCI) += ath10k_pci.o
diff --git a/drivers/net/wireless/ath/ath10k/core.c
b/drivers/net/wireless/ath/ath10k/core.c
index 651a6da8adf5..c01a37526ad5 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -26,6 +26,7 @@
#include bmi.h
#include debug.h
#include htt.h
+#include testmode.h
unsigned int ath10k_debug_mask;
static bool uart_print;
@@ -257,21 +258,42 @@ static int ath10k_download_and_run_otp(struct ath10k *ar)
return 0;
}
-static int ath10k_download_fw(struct ath10k *ar)
+static int ath10k_download_fw(struct ath10k *ar, enum ath10k_firmware_mode
mode)
{
- u32 address;
+ u32 address, data_len;
+ const char *mode_name;
+ const void *data;
int ret;
address = ar-hw_params.patch_load_addr;
- ret = ath10k_bmi_fast_download(ar, address, ar-firmware_data,
- ar-firmware_len);
+ switch (mode) {
+ case ATH10K_FIRMWARE_MODE_NORMAL:
+ data = ar-firmware_data;
+ data_len = ar-firmware_len;
+ mode_name = normal;
+ break;
+ case ATH10K_FIRMWARE_MODE_UTF:
+ data = ar-testmode.utf-data;
+ data_len = ar-testmode.utf-size;
+ mode_name = utf;
+ break;
+ default:
+ ath10k_err(ar, unknown firmware mode: %d\n, mode);
+ return -EINVAL;
+ }
+
+ ath10k_dbg(ar, ATH10K_DBG_BOOT,
+ boot uploading firmware image %p len %d mode %s\n,
+ data, data_len, mode_name);
+
+ ret = ath10k_bmi_fast_download(ar, address, data, data_len);
if (ret) {
- ath10k_err(ar, could not write fw (%d)\n, ret);
- goto exit;
+ ath10k_err(ar, failed to download %s firmware: %d\n,
+ mode_name, ret);
+ return ret;
}
-exit:
return ret;
}
@@ -567,7 +589,8 @@ success:
return 0;
}
-static int ath10k_init_download_firmware(struct ath10k *ar)
+static int ath10k_init_download_firmware(struct ath10k *ar,
+enum ath10k_firmware_mode mode)
{
int ret;
@@ -583,7 +606,7 @@ static int ath10k_init_download_firmware(struct ath10k *ar)
return ret;
}
- ret = ath10k_download_fw(ar);
+ ret = ath10k_download_fw(ar, mode);
if (ret) {
ath10k_err(ar, failed to download firmware: %d\n, ret);
return ret;
@@ -685,12 +708,15 @@ static void ath10k_core_restart(struct work_struct *work)
case ATH10K_STATE_WEDGED:
ath10k_warn(ar, device is wedged, will not restart\n);
break;
+ case ATH10K_STATE_UTF:
+ ath10k_warn(ar, firmware restart in UTF mode not supported\n);
+ break;
}
mutex_unlock(ar-conf_mutex);
}
-int ath10k_core_start(struct ath10k *ar)
+int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode)
{
int status;
@@ -703,7 +729,7 @@ int ath10k_core_start(struct ath10k *ar)
goto err;
}
- status = ath10k_init_download_firmware(ar);
+ status =