static int ath10k_download_and_run_otp(struct ath10k *ar) { u32 address = ar->hw_params.patch_load_addr; u32 exec_param; int ret; /* OTP is optional */ if (!ar->otp_data || !ar->otp_len) return 0; ret = ath10k_bmi_fast_download(ar, address, ar->otp_data, ar->otp_len); if (ret) { ath10k_err("could not write otp (%d)\n", ret); goto exit; } exec_param = 0; ret = ath10k_bmi_execute(ar, address, &exec_param); if (ret) { ath10k_err("could not execute otp (%d)\n", ret); goto exit; } exit: return ret; }
static int ath10k_download_fw(struct ath10k *ar) { const struct firmware *fw; u32 address; int ret; if (ar->hw_params.fw.fw == NULL) return -EINVAL; address = ar->hw_params.patch_load_addr; fw = ath10k_fetch_fw_file(ar, ar->hw_params.fw.dir, ar->hw_params.fw.fw); if (IS_ERR(fw)) { ath10k_err("could not fetch fw (%ld)\n", PTR_ERR(fw)); return PTR_ERR(fw); } ret = ath10k_bmi_fast_download(ar, address, fw->data, fw->size); if (ret) { ath10k_err("could not write fw (%d)\n", ret); goto exit; } exit: release_firmware(fw); return ret; }
static int ath10k_download_and_run_otp(struct ath10k *ar) { u32 result, address = ar->hw_params.patch_load_addr; u32 bmi_otp_exe_param = ar->hw_params.otp_exe_param; int ret; ret = ath10k_download_board_data(ar, ar->board_data, ar->board_len); if (ret) { ath10k_err(ar, "failed to download board data: %d\n", ret); return ret; } /* OTP is optional */ if (!ar->otp_data || !ar->otp_len) { ath10k_warn(ar, "Not running otp, calibration will be incorrect (otp-data %p otp_len %zd)!\n", ar->otp_data, ar->otp_len); return 0; } ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot upload otp to 0x%x len %zd\n", address, ar->otp_len); ret = ath10k_bmi_fast_download(ar, address, ar->otp_data, ar->otp_len); if (ret) { ath10k_err(ar, "could not write otp (%d)\n", ret); return ret; } ret = ath10k_bmi_execute(ar, address, bmi_otp_exe_param, &result); if (ret) { ath10k_err(ar, "could not execute otp (%d)\n", ret); return ret; } ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot otp execute result %d\n", result); if (!(skip_otp || test_bit(ATH10K_FW_FEATURE_IGNORE_OTP_RESULT, ar->fw_features)) && result != 0) { ath10k_err(ar, "otp calibration failed: %d", result); return -EINVAL; } return 0; }
static int ath10k_download_fw(struct ath10k *ar) { u32 address; int ret; address = ar->hw_params.patch_load_addr; ret = ath10k_bmi_fast_download(ar, address, ar->firmware_data, ar->firmware_len); if (ret) { ath10k_err("could not write fw (%d)\n", ret); goto exit; } exit: return ret; }
static int ath10k_download_fw(struct ath10k *ar, enum ath10k_firmware_mode mode) { u32 address, data_len; const char *mode_name; const void *data; int ret; address = ar->hw_params.patch_load_addr; switch (mode) { case ATH10K_FIRMWARE_MODE_NORMAL: data = ar->firmware_data; data_len = ar->firmware_len; mode_name = "normal"; ret = ath10k_swap_code_seg_configure(ar, ATH10K_SWAP_CODE_SEG_BIN_TYPE_FW); if (ret) { ath10k_err(ar, "failed to configure fw code swap: %d\n", ret); return ret; } break; case ATH10K_FIRMWARE_MODE_UTF: data = ar->testmode.utf->data; data_len = ar->testmode.utf->size; mode_name = "utf"; break; default: ath10k_err(ar, "unknown firmware mode: %d\n", mode); return -EINVAL; } ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot uploading firmware image %p len %d mode %s\n", data, data_len, mode_name); ret = ath10k_bmi_fast_download(ar, address, data, data_len); if (ret) { ath10k_err(ar, "failed to download %s firmware: %d\n", mode_name, ret); return ret; } return ret; }
static int ath10k_download_and_run_otp(struct ath10k *ar) { u32 result, address = ar->hw_params.patch_load_addr; int ret; /* OTP is optional */ if (!ar->otp_data || !ar->otp_len) { ath10k_warn("Not running otp, calibration will be incorrect (otp-data %p otp_len %zd)!\n", ar->otp_data, ar->otp_len); return 0; } ath10k_dbg(ATH10K_DBG_BOOT, "boot upload otp to 0x%x len %zd\n", address, ar->otp_len); ret = ath10k_bmi_fast_download(ar, address, ar->otp_data, ar->otp_len); if (ret) { ath10k_err("could not write otp (%d)\n", ret); return ret; } ret = ath10k_bmi_execute(ar, address, 0, &result); if (ret) { ath10k_err("could not execute otp (%d)\n", ret); return ret; } ath10k_dbg(ATH10K_DBG_BOOT, "boot otp execute result %d\n", result); if (result == 2) { ath10k_warn("otp stream is empty, using board.bin contents"); return 0; } else if (result != 0) { ath10k_err("otp calibration failed: %d", result); return -EINVAL; } return 0; }
static int ath10k_download_and_run_otp(struct ath10k *ar) { const struct firmware *fw; u32 address; u32 exec_param; int ret; /* OTP is optional */ if (ar->hw_params.fw.otp == NULL) { ath10k_info("otp file not defined\n"); return 0; } address = ar->hw_params.patch_load_addr; fw = ath10k_fetch_fw_file(ar, ar->hw_params.fw.dir, ar->hw_params.fw.otp); if (IS_ERR(fw)) { ath10k_warn("could not fetch otp (%ld)\n", PTR_ERR(fw)); return 0; } ret = ath10k_bmi_fast_download(ar, address, fw->data, fw->size); if (ret) { ath10k_err("could not write otp (%d)\n", ret); goto exit; } exec_param = 0; ret = ath10k_bmi_execute(ar, address, &exec_param); if (ret) { ath10k_err("could not execute otp (%d)\n", ret); goto exit; } exit: release_firmware(fw); return ret; }