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;
 
 
        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;
 
        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
        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)
 
                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;
 
        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;
 
        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;
 
        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;
        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);
        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;
 
        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;
 
 {
 }
 
-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;
 }