ath6kl: fix testmode when fw-2.bin or fw-3.bin is used
authorKalle Valo <kvalo@qca.qualcomm.com>
Tue, 24 Jan 2012 11:50:16 +0000 (13:50 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Mon, 30 Jan 2012 19:08:45 +0000 (21:08 +0200)
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: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath6kl/core.c
drivers/net/wireless/ath/ath6kl/core.h
drivers/net/wireless/ath/ath6kl/init.c

index 0d92e7179f8a75b1a16c299da75183a03b4950e5..2a5198185d5708d175a482b5dbdfcf31a7121802 100644 (file)
@@ -28,11 +28,13 @@ unsigned int debug_mask;
 static bool suspend_cutpower;
 static unsigned int uart_debug;
 static unsigned int ath6kl_p2p;
+static unsigned int testmode;
 
 module_param(debug_mask, uint, 0644);
 module_param(suspend_cutpower, bool, 0444);
 module_param(uart_debug, uint, 0644);
 module_param(ath6kl_p2p, uint, 0644);
+module_param(testmode, uint, 0644);
 
 int ath6kl_core_init(struct ath6kl *ar)
 {
@@ -76,6 +78,8 @@ int ath6kl_core_init(struct ath6kl *ar)
                goto err_power_off;
        }
 
+       ar->testmode = testmode;
+
        ret = ath6kl_init_fetch_firmwares(ar);
        if (ret)
                goto err_htc_cleanup;
index ed9fcc11b5fccb700849a34583a834e1c4163d29..7f1869d00d70d4fbaaf904f3f8cb4878d96536cd 100644 (file)
@@ -532,6 +532,7 @@ struct ath6kl {
        struct wiphy *wiphy;
 
        enum ath6kl_state state;
+       unsigned int testmode;
 
        struct ath6kl_bmi bmi;
        const struct ath6kl_hif_ops *hif_ops;
index 4d8eb1cca6e9602172345bbeffffc6c88a4061f3..bf56e5f17618ea5fedb8acc4fa4c0d65194ba1b3 100644 (file)
 #include "debug.h"
 #include "hif-ops.h"
 
-static unsigned int testmode;
-
-module_param(testmode, uint, 0644);
-
 static const struct ath6kl_hw hw_list[] = {
        {
                .id                             = AR6003_HW_2_0_VERSION,
@@ -731,39 +727,54 @@ static int ath6kl_fetch_otp_file(struct ath6kl *ar)
        return 0;
 }
 
-static int ath6kl_fetch_fw_file(struct ath6kl *ar)
+static int ath6kl_fetch_testmode_file(struct ath6kl *ar)
 {
        char filename[100];
        int ret;
 
-       if (ar->fw != NULL)
+       if (ar->testmode == 0)
                return 0;
 
-       if (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;
-                       }
+       ath6kl_dbg(ATH6KL_DBG_BOOT, "testmode %d\n", ar->testmode);
 
-                       snprintf(filename, sizeof(filename), "%s/%s",
-                               ar->hw.fw.dir, ar->hw.fw.utf);
-               } else {
-                       if (ar->hw.fw.tcmd == NULL) {
-                               ath6kl_warn("testmode 1 not supported\n");
-                               return -EOPNOTSUPP;
-                       }
+       if (ar->testmode == 2) {
+               if (ar->hw.fw.utf == NULL) {
+                       ath6kl_warn("testmode 2 not supported\n");
+                       return -EOPNOTSUPP;
+               }
 
-                       snprintf(filename, sizeof(filename), "%s/%s",
-                               ar->hw.fw.dir, ar->hw.fw.tcmd);
+               snprintf(filename, sizeof(filename), "%s/%s",
+                        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 */
        if (WARN_ON(ar->hw.fw.fw == NULL))
                return -EINVAL;
@@ -771,7 +782,6 @@ static int ath6kl_fetch_fw_file(struct ath6kl *ar)
        snprintf(filename, sizeof(filename), "%s/%s",
                 ar->hw.fw.dir, ar->hw.fw.fw);
 
-get_fw:
        ret = ath6kl_get_fw(ar, filename, &ar->fw, &ar->fw_len);
        if (ret) {
                ath6kl_err("Failed to get firmware file %s: %d\n",
@@ -812,7 +822,7 @@ static int ath6kl_fetch_testscript_file(struct ath6kl *ar)
        char filename[100];
        int ret;
 
-       if (testmode != 2)
+       if (ar->testmode != 2)
                return 0;
 
        if (ar->fw_testscript != NULL)
@@ -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",
                                ie_len);
 
+                       /* in testmode we already might have a fw file */
+                       if (ar->fw != NULL)
+                               break;
+
                        ar->fw = kmemdup(data, ie_len, GFP_KERNEL);
 
                        if (ar->fw == NULL) {
@@ -1038,6 +1052,10 @@ int ath6kl_init_fetch_firmwares(struct ath6kl *ar)
        if (ret)
                return ret;
 
+       ret = ath6kl_fetch_testmode_file(ar);
+       if (ret)
+               return ret;
+
        ret = ath6kl_fetch_fw_apin(ar, ATH6KL_FW_API3_FILE);
        if (ret == 0) {
                ar->fw_api = 3;
@@ -1283,7 +1301,7 @@ static int ath6kl_upload_testscript(struct ath6kl *ar)
        u32 address, param;
        int ret;
 
-       if (testmode != 2)
+       if (ar->testmode != 2)
                return 0;
 
        if (ar->fw_testscript == NULL)