ath10k: enable Factory Test Mode for WCN3990
authorRakesh Pillai <pillair@codeaurora.org>
Fri, 8 Feb 2019 13:50:10 +0000 (15:50 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 11 Feb 2019 16:33:53 +0000 (18:33 +0200)
The support to put WCN3990 firmware into Factory
test mode is not present currently. The WCN3990
firmware can operate in Factory test mode based
on the mode it receives in the wlan enable message
from the host driver.

When the host driver is started in testmode send
the operating mode as UTF mode, to the WCN3990
firmware, in the wlan enable message to start the
firmware in Factory test mode.

Tested on: WCN3990
Tested FW: WLAN.HL.2.0-01192-QCAHLSWMTPLZ-1.

Signed-off-by: Rakesh Pillai <pillair@codeaurora.org>
Reviewed-by: Brian Norris <briannorris@chromium.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath10k/ahb.c
drivers/net/wireless/ath/ath10k/core.c
drivers/net/wireless/ath/ath10k/hif.h
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/pci.c
drivers/net/wireless/ath/ath10k/sdio.c
drivers/net/wireless/ath/ath10k/snoc.c
drivers/net/wireless/ath/ath10k/testmode.c
drivers/net/wireless/ath/ath10k/usb.c

index 4cd69aca75e2029a5d70fd38c1c69b1d62c6fb28..66b7ca9ced1780ce6e5517329d0353bfe018f6aa 100644 (file)
@@ -661,7 +661,8 @@ static void ath10k_ahb_hif_stop(struct ath10k *ar)
        ath10k_pci_flush(ar);
 }
 
-static int ath10k_ahb_hif_power_up(struct ath10k *ar)
+static int ath10k_ahb_hif_power_up(struct ath10k *ar,
+                                  enum ath10k_firmware_mode fw_mode)
 {
        int ret;
 
index f64008b5da0dc3a7a2a221688ce8929f9a302486..ca6085076c6896cf94fd2603292f49a7dc126208 100644 (file)
@@ -2780,7 +2780,7 @@ static int ath10k_core_probe_fw(struct ath10k *ar)
        struct bmi_target_info target_info;
        int ret = 0;
 
-       ret = ath10k_hif_power_up(ar);
+       ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL);
        if (ret) {
                ath10k_err(ar, "could not power on hif bus (%d)\n", ret);
                return ret;
index 5f7f1e08866f834f04c46a35f034a93c0fb6e95d..04320d792c88836d7e6687bb4c95990b7eef6892 100644 (file)
@@ -83,7 +83,7 @@ struct ath10k_hif_ops {
        void (*write32)(struct ath10k *ar, u32 address, u32 value);
 
        /* Power up the device and enter BMI transfer mode for FW download */
-       int (*power_up)(struct ath10k *ar);
+       int (*power_up)(struct ath10k *ar, enum ath10k_firmware_mode fw_mode);
 
        /* Power down the device and free up resources. stop() must be called
         * before this if start() was called earlier
@@ -174,9 +174,10 @@ static inline u16 ath10k_hif_get_free_queue_number(struct ath10k *ar,
        return ar->hif.ops->get_free_queue_number(ar, pipe_id);
 }
 
-static inline int ath10k_hif_power_up(struct ath10k *ar)
+static inline int ath10k_hif_power_up(struct ath10k *ar,
+                                     enum ath10k_firmware_mode fw_mode)
 {
-       return ar->hif.ops->power_up(ar);
+       return ar->hif.ops->power_up(ar, fw_mode);
 }
 
 static inline void ath10k_hif_power_down(struct ath10k *ar)
index 6c66a3435d5712178af0fbf3bc5de23f500eaedb..c8af35ff201900b547fd14adea3c44f64a1d3bbe 100644 (file)
@@ -4705,7 +4705,7 @@ static int ath10k_start(struct ieee80211_hw *hw)
                goto err;
        }
 
-       ret = ath10k_hif_power_up(ar);
+       ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL);
        if (ret) {
                ath10k_err(ar, "Could not init hif: %d\n", ret);
                goto err_off;
index 600ddaad88451dba51778d53058c77f0323b53a7..71d854e2f9fc1991f38fcbd2bbfe99a251c6bfb3 100644 (file)
@@ -2794,7 +2794,8 @@ static int ath10k_pci_chip_reset(struct ath10k *ar)
        return ar_pci->pci_hard_reset(ar);
 }
 
-static int ath10k_pci_hif_power_up(struct ath10k *ar)
+static int ath10k_pci_hif_power_up(struct ath10k *ar,
+                                  enum ath10k_firmware_mode fw_mode)
 {
        struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
        int ret;
index f3b2e148e6cef9dba83c58bba78075593479df24..7654536b830b1a519db09bcb6d26fc834a8182ea 100644 (file)
@@ -1381,7 +1381,8 @@ static int ath10k_sdio_hif_disable_intrs(struct ath10k *ar)
        return ret;
 }
 
-static int ath10k_sdio_hif_power_up(struct ath10k *ar)
+static int ath10k_sdio_hif_power_up(struct ath10k *ar,
+                                   enum ath10k_firmware_mode fw_mode)
 {
        struct ath10k_sdio *ar_sdio = ath10k_sdio_priv(ar);
        struct sdio_func *func = ar_sdio->func;
index eff19fd543c836e0110a3ca5d2f6a43e625a339c..b81b02ae384f1cb79adcaeb6fb4872f89459e7fe 100644 (file)
@@ -957,7 +957,8 @@ static int ath10k_snoc_init_pipes(struct ath10k *ar)
        return 0;
 }
 
-static int ath10k_snoc_wlan_enable(struct ath10k *ar)
+static int ath10k_snoc_wlan_enable(struct ath10k *ar,
+                                  enum ath10k_firmware_mode fw_mode)
 {
        struct ath10k_tgt_pipe_cfg tgt_cfg[CE_COUNT_MAX];
        struct ath10k_qmi_wlan_enable_cfg cfg;
@@ -991,7 +992,17 @@ static int ath10k_snoc_wlan_enable(struct ath10k *ar)
        cfg.shadow_reg_cfg = (struct ath10k_shadow_reg_cfg *)
                &target_shadow_reg_cfg_map;
 
-       mode = QMI_WLFW_MISSION_V01;
+       switch (fw_mode) {
+       case ATH10K_FIRMWARE_MODE_NORMAL:
+               mode = QMI_WLFW_MISSION_V01;
+               break;
+       case ATH10K_FIRMWARE_MODE_UTF:
+               mode = QMI_WLFW_FTM_V01;
+               break;
+       default:
+               ath10k_err(ar, "invalid firmware mode %d\n", fw_mode);
+               return -EINVAL;
+       }
 
        return ath10k_qmi_wlan_enable(ar, &cfg, mode,
                                       NULL);
@@ -1020,14 +1031,15 @@ static void ath10k_snoc_hif_power_down(struct ath10k *ar)
        ath10k_ce_free_rri(ar);
 }
 
-static int ath10k_snoc_hif_power_up(struct ath10k *ar)
+static int ath10k_snoc_hif_power_up(struct ath10k *ar,
+                                   enum ath10k_firmware_mode fw_mode)
 {
        int ret;
 
        ath10k_dbg(ar, ATH10K_DBG_SNOC, "%s:WCN3990 driver state = %d\n",
                   __func__, ar->state);
 
-       ret = ath10k_snoc_wlan_enable(ar);
+       ret = ath10k_snoc_wlan_enable(ar, fw_mode);
        if (ret) {
                ath10k_err(ar, "failed to enable wcn3990: %d\n", ret);
                return ret;
index c24ee616833c7b569d1bbe691161413acec6f8a7..67faafecaf06df47141d8edd14219dd792dbf9c3 100644 (file)
@@ -270,7 +270,7 @@ static int ath10k_tm_cmd_utf_start(struct ath10k *ar, struct nlattr *tb[])
        ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode wmi version %d\n",
                   ar->testmode.utf_mode_fw.fw_file.wmi_op_version);
 
-       ret = ath10k_hif_power_up(ar);
+       ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_UTF);
        if (ret) {
                ath10k_err(ar, "failed to power up hif (testmode): %d\n", ret);
                ar->state = ATH10K_STATE_OFF;
index f731d35ee76d2be60ae839ed53996535bd0c6949..d3677765f96c72ee56ec30de21dd5ee77499cd95 100644 (file)
@@ -706,7 +706,8 @@ static void ath10k_usb_hif_send_complete_check(struct ath10k *ar,
 {
 }
 
-static int ath10k_usb_hif_power_up(struct ath10k *ar)
+static int ath10k_usb_hif_power_up(struct ath10k *ar,
+                                  enum ath10k_firmware_mode fw_mode)
 {
        return 0;
 }