Commit 3c545a25 authored by Rakesh Pillai's avatar Rakesh Pillai Committed by Kalle Valo

ath10k: enable Factory Test Mode for WCN3990

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: default avatarRakesh Pillai <pillair@codeaurora.org>
Reviewed-by: default avatarBrian Norris <briannorris@chromium.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 25733c4e
...@@ -661,7 +661,8 @@ static void ath10k_ahb_hif_stop(struct ath10k *ar) ...@@ -661,7 +661,8 @@ static void ath10k_ahb_hif_stop(struct ath10k *ar)
ath10k_pci_flush(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; int ret;
......
...@@ -2780,7 +2780,7 @@ static int ath10k_core_probe_fw(struct ath10k *ar) ...@@ -2780,7 +2780,7 @@ static int ath10k_core_probe_fw(struct ath10k *ar)
struct bmi_target_info target_info; struct bmi_target_info target_info;
int ret = 0; int ret = 0;
ret = ath10k_hif_power_up(ar); ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL);
if (ret) { if (ret) {
ath10k_err(ar, "could not power on hif bus (%d)\n", ret); ath10k_err(ar, "could not power on hif bus (%d)\n", ret);
return ret; return ret;
......
...@@ -83,7 +83,7 @@ struct ath10k_hif_ops { ...@@ -83,7 +83,7 @@ struct ath10k_hif_ops {
void (*write32)(struct ath10k *ar, u32 address, u32 value); void (*write32)(struct ath10k *ar, u32 address, u32 value);
/* Power up the device and enter BMI transfer mode for FW download */ /* 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 /* Power down the device and free up resources. stop() must be called
* before this if start() was called earlier * before this if start() was called earlier
...@@ -174,9 +174,10 @@ static inline u16 ath10k_hif_get_free_queue_number(struct ath10k *ar, ...@@ -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); 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) static inline void ath10k_hif_power_down(struct ath10k *ar)
......
...@@ -4705,7 +4705,7 @@ static int ath10k_start(struct ieee80211_hw *hw) ...@@ -4705,7 +4705,7 @@ static int ath10k_start(struct ieee80211_hw *hw)
goto err; goto err;
} }
ret = ath10k_hif_power_up(ar); ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL);
if (ret) { if (ret) {
ath10k_err(ar, "Could not init hif: %d\n", ret); ath10k_err(ar, "Could not init hif: %d\n", ret);
goto err_off; goto err_off;
......
...@@ -2794,7 +2794,8 @@ static int ath10k_pci_chip_reset(struct ath10k *ar) ...@@ -2794,7 +2794,8 @@ static int ath10k_pci_chip_reset(struct ath10k *ar)
return ar_pci->pci_hard_reset(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); struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
int ret; int ret;
......
...@@ -1381,7 +1381,8 @@ static int ath10k_sdio_hif_disable_intrs(struct ath10k *ar) ...@@ -1381,7 +1381,8 @@ static int ath10k_sdio_hif_disable_intrs(struct ath10k *ar)
return 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 ath10k_sdio *ar_sdio = ath10k_sdio_priv(ar);
struct sdio_func *func = ar_sdio->func; struct sdio_func *func = ar_sdio->func;
......
...@@ -957,7 +957,8 @@ static int ath10k_snoc_init_pipes(struct ath10k *ar) ...@@ -957,7 +957,8 @@ static int ath10k_snoc_init_pipes(struct ath10k *ar)
return 0; 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_tgt_pipe_cfg tgt_cfg[CE_COUNT_MAX];
struct ath10k_qmi_wlan_enable_cfg cfg; struct ath10k_qmi_wlan_enable_cfg cfg;
...@@ -991,7 +992,17 @@ static int ath10k_snoc_wlan_enable(struct ath10k *ar) ...@@ -991,7 +992,17 @@ static int ath10k_snoc_wlan_enable(struct ath10k *ar)
cfg.shadow_reg_cfg = (struct ath10k_shadow_reg_cfg *) cfg.shadow_reg_cfg = (struct ath10k_shadow_reg_cfg *)
&target_shadow_reg_cfg_map; &target_shadow_reg_cfg_map;
switch (fw_mode) {
case ATH10K_FIRMWARE_MODE_NORMAL:
mode = QMI_WLFW_MISSION_V01; 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, return ath10k_qmi_wlan_enable(ar, &cfg, mode,
NULL); NULL);
...@@ -1020,14 +1031,15 @@ static void ath10k_snoc_hif_power_down(struct ath10k *ar) ...@@ -1020,14 +1031,15 @@ static void ath10k_snoc_hif_power_down(struct ath10k *ar)
ath10k_ce_free_rri(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; int ret;
ath10k_dbg(ar, ATH10K_DBG_SNOC, "%s:WCN3990 driver state = %d\n", ath10k_dbg(ar, ATH10K_DBG_SNOC, "%s:WCN3990 driver state = %d\n",
__func__, ar->state); __func__, ar->state);
ret = ath10k_snoc_wlan_enable(ar); ret = ath10k_snoc_wlan_enable(ar, fw_mode);
if (ret) { if (ret) {
ath10k_err(ar, "failed to enable wcn3990: %d\n", ret); ath10k_err(ar, "failed to enable wcn3990: %d\n", ret);
return ret; return ret;
......
...@@ -270,7 +270,7 @@ static int ath10k_tm_cmd_utf_start(struct ath10k *ar, struct nlattr *tb[]) ...@@ -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", ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode wmi version %d\n",
ar->testmode.utf_mode_fw.fw_file.wmi_op_version); 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) { if (ret) {
ath10k_err(ar, "failed to power up hif (testmode): %d\n", ret); ath10k_err(ar, "failed to power up hif (testmode): %d\n", ret);
ar->state = ATH10K_STATE_OFF; ar->state = ATH10K_STATE_OFF;
......
...@@ -706,7 +706,8 @@ static void ath10k_usb_hif_send_complete_check(struct ath10k *ar, ...@@ -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; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment