提交 5f1127ff 编写于 作者: K Kalle Valo

ath6kl: fix testmode when fw-2.bin or fw-3.bin is used

Testmode (TCMD and ART) was not enabled when fw-2.bin or fw-3.bin files
were available, fix that by fetching testmode file just after the
board file but before rest of the firmware files are fetched.

I also added testmode field to struct ath6kl and moved the module parameter
to core.c. Now all module parameters are grouped in one place.
Signed-off-by: NKalle Valo <kvalo@qca.qualcomm.com>
上级 1d2a4456
...@@ -28,11 +28,13 @@ unsigned int debug_mask; ...@@ -28,11 +28,13 @@ unsigned int debug_mask;
static bool suspend_cutpower; static bool suspend_cutpower;
static unsigned int uart_debug; static unsigned int uart_debug;
static unsigned int ath6kl_p2p; static unsigned int ath6kl_p2p;
static unsigned int testmode;
module_param(debug_mask, uint, 0644); module_param(debug_mask, uint, 0644);
module_param(suspend_cutpower, bool, 0444); module_param(suspend_cutpower, bool, 0444);
module_param(uart_debug, uint, 0644); module_param(uart_debug, uint, 0644);
module_param(ath6kl_p2p, uint, 0644); module_param(ath6kl_p2p, uint, 0644);
module_param(testmode, uint, 0644);
int ath6kl_core_init(struct ath6kl *ar) int ath6kl_core_init(struct ath6kl *ar)
{ {
...@@ -76,6 +78,8 @@ int ath6kl_core_init(struct ath6kl *ar) ...@@ -76,6 +78,8 @@ int ath6kl_core_init(struct ath6kl *ar)
goto err_power_off; goto err_power_off;
} }
ar->testmode = testmode;
ret = ath6kl_init_fetch_firmwares(ar); ret = ath6kl_init_fetch_firmwares(ar);
if (ret) if (ret)
goto err_htc_cleanup; goto err_htc_cleanup;
......
...@@ -532,6 +532,7 @@ struct ath6kl { ...@@ -532,6 +532,7 @@ struct ath6kl {
struct wiphy *wiphy; struct wiphy *wiphy;
enum ath6kl_state state; enum ath6kl_state state;
unsigned int testmode;
struct ath6kl_bmi bmi; struct ath6kl_bmi bmi;
const struct ath6kl_hif_ops *hif_ops; const struct ath6kl_hif_ops *hif_ops;
......
...@@ -27,10 +27,6 @@ ...@@ -27,10 +27,6 @@
#include "debug.h" #include "debug.h"
#include "hif-ops.h" #include "hif-ops.h"
static unsigned int testmode;
module_param(testmode, uint, 0644);
static const struct ath6kl_hw hw_list[] = { static const struct ath6kl_hw hw_list[] = {
{ {
.id = AR6003_HW_2_0_VERSION, .id = AR6003_HW_2_0_VERSION,
...@@ -731,39 +727,54 @@ static int ath6kl_fetch_otp_file(struct ath6kl *ar) ...@@ -731,39 +727,54 @@ static int ath6kl_fetch_otp_file(struct ath6kl *ar)
return 0; return 0;
} }
static int ath6kl_fetch_fw_file(struct ath6kl *ar) static int ath6kl_fetch_testmode_file(struct ath6kl *ar)
{ {
char filename[100]; char filename[100];
int ret; int ret;
if (ar->fw != NULL) if (ar->testmode == 0)
return 0; return 0;
if (testmode) { ath6kl_dbg(ATH6KL_DBG_BOOT, "testmode %d\n", ar->testmode);
ath6kl_dbg(ATH6KL_DBG_BOOT, "testmode %d\n",
testmode);
if (testmode == 2) {
if (ar->hw.fw.utf == NULL) {
ath6kl_warn("testmode 2 not supported\n");
return -EOPNOTSUPP;
}
snprintf(filename, sizeof(filename), "%s/%s", if (ar->testmode == 2) {
ar->hw.fw.dir, ar->hw.fw.utf); if (ar->hw.fw.utf == NULL) {
} else { ath6kl_warn("testmode 2 not supported\n");
if (ar->hw.fw.tcmd == NULL) { return -EOPNOTSUPP;
ath6kl_warn("testmode 1 not supported\n"); }
return -EOPNOTSUPP;
}
snprintf(filename, sizeof(filename), "%s/%s", snprintf(filename, sizeof(filename), "%s/%s",
ar->hw.fw.dir, ar->hw.fw.tcmd); ar->hw.fw.dir, ar->hw.fw.utf);
} else {
if (ar->hw.fw.tcmd == NULL) {
ath6kl_warn("testmode 1 not supported\n");
return -EOPNOTSUPP;
} }
set_bit(TESTMODE, &ar->flag);
goto get_fw; snprintf(filename, sizeof(filename), "%s/%s",
ar->hw.fw.dir, ar->hw.fw.tcmd);
} }
set_bit(TESTMODE, &ar->flag);
ret = ath6kl_get_fw(ar, filename, &ar->fw, &ar->fw_len);
if (ret) {
ath6kl_err("Failed to get testmode %d firmware file %s: %d\n",
ar->testmode, filename, ret);
return ret;
}
return 0;
}
static int ath6kl_fetch_fw_file(struct ath6kl *ar)
{
char filename[100];
int ret;
if (ar->fw != NULL)
return 0;
/* FIXME: remove WARN_ON() as we won't support FW API 1 for long */ /* FIXME: remove WARN_ON() as we won't support FW API 1 for long */
if (WARN_ON(ar->hw.fw.fw == NULL)) if (WARN_ON(ar->hw.fw.fw == NULL))
return -EINVAL; return -EINVAL;
...@@ -771,7 +782,6 @@ static int ath6kl_fetch_fw_file(struct ath6kl *ar) ...@@ -771,7 +782,6 @@ static int ath6kl_fetch_fw_file(struct ath6kl *ar)
snprintf(filename, sizeof(filename), "%s/%s", snprintf(filename, sizeof(filename), "%s/%s",
ar->hw.fw.dir, ar->hw.fw.fw); ar->hw.fw.dir, ar->hw.fw.fw);
get_fw:
ret = ath6kl_get_fw(ar, filename, &ar->fw, &ar->fw_len); ret = ath6kl_get_fw(ar, filename, &ar->fw, &ar->fw_len);
if (ret) { if (ret) {
ath6kl_err("Failed to get firmware file %s: %d\n", ath6kl_err("Failed to get firmware file %s: %d\n",
...@@ -812,7 +822,7 @@ static int ath6kl_fetch_testscript_file(struct ath6kl *ar) ...@@ -812,7 +822,7 @@ static int ath6kl_fetch_testscript_file(struct ath6kl *ar)
char filename[100]; char filename[100];
int ret; int ret;
if (testmode != 2) if (ar->testmode != 2)
return 0; return 0;
if (ar->fw_testscript != NULL) if (ar->fw_testscript != NULL)
...@@ -927,6 +937,10 @@ static int ath6kl_fetch_fw_apin(struct ath6kl *ar, const char *name) ...@@ -927,6 +937,10 @@ static int ath6kl_fetch_fw_apin(struct ath6kl *ar, const char *name)
ath6kl_dbg(ATH6KL_DBG_BOOT, "found fw image ie (%zd B)\n", ath6kl_dbg(ATH6KL_DBG_BOOT, "found fw image ie (%zd B)\n",
ie_len); ie_len);
/* in testmode we already might have a fw file */
if (ar->fw != NULL)
break;
ar->fw = kmemdup(data, ie_len, GFP_KERNEL); ar->fw = kmemdup(data, ie_len, GFP_KERNEL);
if (ar->fw == NULL) { if (ar->fw == NULL) {
...@@ -1038,6 +1052,10 @@ int ath6kl_init_fetch_firmwares(struct ath6kl *ar) ...@@ -1038,6 +1052,10 @@ int ath6kl_init_fetch_firmwares(struct ath6kl *ar)
if (ret) if (ret)
return ret; return ret;
ret = ath6kl_fetch_testmode_file(ar);
if (ret)
return ret;
ret = ath6kl_fetch_fw_apin(ar, ATH6KL_FW_API3_FILE); ret = ath6kl_fetch_fw_apin(ar, ATH6KL_FW_API3_FILE);
if (ret == 0) { if (ret == 0) {
ar->fw_api = 3; ar->fw_api = 3;
...@@ -1283,7 +1301,7 @@ static int ath6kl_upload_testscript(struct ath6kl *ar) ...@@ -1283,7 +1301,7 @@ static int ath6kl_upload_testscript(struct ath6kl *ar)
u32 address, param; u32 address, param;
int ret; int ret;
if (testmode != 2) if (ar->testmode != 2)
return 0; return 0;
if (ar->fw_testscript == NULL) if (ar->fw_testscript == NULL)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册