[PATCH v2 3/3] ath10k: Add fw feature flag for non-bmi firmware load

Rakesh Pillai pillair at qti.qualcomm.com
Thu Dec 21 08:18:57 PST 2017


Hi Kalle,

I have sent a v3 for this patch with the corrected ownership.


Thanks,
Rakesh Pillai

> -----Original Message-----
> From: Rakesh Pillai [mailto:pillair at qti.qualcomm.com]
> Sent: Thursday, December 21, 2017 9:35 PM
> To: ath10k at lists.infradead.org
> Cc: linux-wireless at vger.kernel.org; Rakesh Pillai <pillair at codeaurora.org>;
> Rakesh Pillai <pillair at qti.qualcomm.com>
> Subject: [PATCH v2 3/3] ath10k: Add fw feature flag for non-bmi firmware load
> 
> From: Rakesh Pillai <pillair at codeaurora.org>
> 
> HL1.0 firmware is not loaded via bmi. The bmi specific
> code should not be executed for HL1.0
> 
> Add fw feature flag for non bmi targets and skip the bmi
> specific code for non bmi targets.
> 
> Signed-off-by: Rakesh Pillai <pillair at qti.qualcomm.com>
> ---
>  drivers/net/wireless/ath/ath10k/core.c | 180 +++++++++++++++++++-------------
> -
>  drivers/net/wireless/ath/ath10k/core.h |   3 +
>  2 files changed, 108 insertions(+), 75 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath10k/core.c
> b/drivers/net/wireless/ath/ath10k/core.c
> index b6d5bad6f5ec..188efa8dcfc0 100644
> --- a/drivers/net/wireless/ath/ath10k/core.c
> +++ b/drivers/net/wireless/ath/ath10k/core.c
> @@ -445,6 +445,7 @@ static const char *const ath10k_core_fw_feature_str[]
> = {
>  	[ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST] = "allows-mesh-
> bcast",
>  	[ATH10K_FW_FEATURE_NO_PS] = "no-ps",
>  	[ATH10K_FW_FEATURE_MGMT_TX_BY_REF] = "mgmt-tx-by-reference",
> +	[ATH10K_FW_FEATURE_NON_BMI] = "non-bmi",
>  };
> 
>  static unsigned int ath10k_core_get_fw_feature_str(char *buf,
> @@ -1524,8 +1525,8 @@ int ath10k_core_fetch_firmware_api_n(struct ath10k
> *ar, const char *name,
>  		data += ie_len;
>  	}
> 
> -	if (!fw_file->firmware_data ||
> -	    !fw_file->firmware_len) {
> +	if (!test_bit(ATH10K_FW_FEATURE_NON_BMI, fw_file->fw_features)
> &&
> +	    (!fw_file->firmware_data || !fw_file->firmware_len)) {
>  		ath10k_warn(ar, "No ATH10K_FW_IE_FW_IMAGE found from
> '%s/%s', skipping\n",
>  			    ar->hw_params.fw.dir, name);
>  		ret = -ENOMEDIUM;
> @@ -2079,43 +2080,47 @@ int ath10k_core_start(struct ath10k *ar, enum
> ath10k_firmware_mode mode,
> 
>  	ar->running_fw = fw;
> 
> -	ath10k_bmi_start(ar);
> +	if (!test_bit(ATH10K_FW_FEATURE_NON_BMI,
> +		      ar->running_fw->fw_file.fw_features)) {
> +		ath10k_bmi_start(ar);
> 
> -	if (ath10k_init_configure_target(ar)) {
> -		status = -EINVAL;
> -		goto err;
> -	}
> -
> -	status = ath10k_download_cal_data(ar);
> -	if (status)
> -		goto err;
> +		if (ath10k_init_configure_target(ar)) {
> +			status = -EINVAL;
> +			goto err;
> +		}
> 
> -	/* Some of of qca988x solutions are having global reset issue
> -	 * during target initialization. Bypassing PLL setting before
> -	 * downloading firmware and letting the SoC run on REF_CLK is
> -	 * fixing the problem. Corresponding firmware change is also needed
> -	 * to set the clock source once the target is initialized.
> -	 */
> -	if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_SKIP_CLOCK_INIT,
> -		     ar->running_fw->fw_file.fw_features)) {
> -		status = ath10k_bmi_write32(ar, hi_skip_clock_init, 1);
> -		if (status) {
> -			ath10k_err(ar, "could not write to skip_clock_init:
> %d\n",
> -				   status);
> +		status = ath10k_download_cal_data(ar);
> +		if (status)
>  			goto err;
> +
> +		/* Some of of qca988x solutions are having global reset issue
> +		 * during target initialization. Bypassing PLL setting before
> +		 * downloading firmware and letting the SoC run on REF_CLK is
> +		 * fixing the problem. Corresponding firmware change is also
> +		 * needed to set the clock source once the target is
> +		 * initialized.
> +		 */
> +		if
> (test_bit(ATH10K_FW_FEATURE_SUPPORTS_SKIP_CLOCK_INIT,
> +			     ar->running_fw->fw_file.fw_features)) {
> +			status = ath10k_bmi_write32(ar, hi_skip_clock_init, 1);
> +			if (status) {
> +				ath10k_err(ar, "could not write to
> skip_clock_init: %d\n",
> +					   status);
> +				goto err;
> +			}
>  		}
> -	}
> 
> -	status = ath10k_download_fw(ar);
> -	if (status)
> -		goto err;
> +		status = ath10k_download_fw(ar);
> +		if (status)
> +			goto err;
> 
> -	status = ath10k_init_uart(ar);
> -	if (status)
> -		goto err;
> +		status = ath10k_init_uart(ar);
> +		if (status)
> +			goto err;
> 
> -	if (ar->hif.bus == ATH10K_BUS_SDIO)
> -		ath10k_init_sdio(ar);
> +		if (ar->hif.bus == ATH10K_BUS_SDIO)
> +			ath10k_init_sdio(ar);
> +	}
> 
>  	ar->htc.htc_ops.target_send_suspend_complete =
>  		ath10k_send_suspend_complete;
> @@ -2126,9 +2131,12 @@ int ath10k_core_start(struct ath10k *ar, enum
> ath10k_firmware_mode mode,
>  		goto err;
>  	}
> 
> -	status = ath10k_bmi_done(ar);
> -	if (status)
> -		goto err;
> +	if (!test_bit(ATH10K_FW_FEATURE_NON_BMI,
> +		      ar->running_fw->fw_file.fw_features)) {
> +		status = ath10k_bmi_done(ar);
> +		if (status)
> +			goto err;
> +	}
> 
>  	status = ath10k_wmi_attach(ar);
>  	if (status) {
> @@ -2371,19 +2379,34 @@ static int ath10k_core_probe_fw(struct ath10k *ar)
>  		return ret;
>  	}
> 
> -	memset(&target_info, 0, sizeof(target_info));
> -	if (ar->hif.bus == ATH10K_BUS_SDIO)
> +	switch (ar->hif.bus) {
> +	case ATH10K_BUS_SDIO:
> +		memset(&target_info, 0, sizeof(target_info));
>  		ret = ath10k_bmi_get_target_info_sdio(ar, &target_info);
> -	else
> +		if (ret) {
> +			ath10k_err(ar, "could not get target info (%d)\n", ret);
> +			goto err_power_down;
> +		}
> +		ar->target_version = target_info.version;
> +		ar->hw->wiphy->hw_version = target_info.version;
> +		break;
> +	case ATH10K_BUS_PCI:
> +	case ATH10K_BUS_AHB:
> +		memset(&target_info, 0, sizeof(target_info));
>  		ret = ath10k_bmi_get_target_info(ar, &target_info);
> -	if (ret) {
> -		ath10k_err(ar, "could not get target info (%d)\n", ret);
> -		goto err_power_down;
> +		if (ret) {
> +			ath10k_err(ar, "could not get target info (%d)\n", ret);
> +			goto err_power_down;
> +		}
> +		ar->target_version = target_info.version;
> +		ar->hw->wiphy->hw_version = target_info.version;
> +		break;
> +	case ATH10K_BUS_SNOC:
> +		break;
> +	default:
> +		ath10k_err(ar, "incorrect hif bus type: %d\n", ar->hif.bus);
>  	}
> 
> -	ar->target_version = target_info.version;
> -	ar->hw->wiphy->hw_version = target_info.version;
> -
>  	ret = ath10k_init_hw_params(ar);
>  	if (ret) {
>  		ath10k_err(ar, "could not get hw params (%d)\n", ret);
> @@ -2403,37 +2426,40 @@ static int ath10k_core_probe_fw(struct ath10k *ar)
> 
>  	ath10k_debug_print_hwfw_info(ar);
> 
> -	ret = ath10k_core_pre_cal_download(ar);
> -	if (ret) {
> -		/* pre calibration data download is not necessary
> -		 * for all the chipsets. Ignore failures and continue.
> -		 */
> -		ath10k_dbg(ar, ATH10K_DBG_BOOT,
> -			   "could not load pre cal data: %d\n", ret);
> -	}
> +	if (!test_bit(ATH10K_FW_FEATURE_NON_BMI,
> +		      ar->normal_mode_fw.fw_file.fw_features)) {
> +		ret = ath10k_core_pre_cal_download(ar);
> +		if (ret) {
> +			/* pre calibration data download is not necessary
> +			 * for all the chipsets. Ignore failures and continue.
> +			 */
> +			ath10k_dbg(ar, ATH10K_DBG_BOOT,
> +				   "could not load pre cal data: %d\n", ret);
> +		}
> 
> -	ret = ath10k_core_get_board_id_from_otp(ar);
> -	if (ret && ret != -EOPNOTSUPP) {
> -		ath10k_err(ar, "failed to get board id from otp: %d\n",
> -			   ret);
> -		goto err_free_firmware_files;
> -	}
> +		ret = ath10k_core_get_board_id_from_otp(ar);
> +		if (ret && ret != -EOPNOTSUPP) {
> +			ath10k_err(ar, "failed to get board id from otp: %d\n",
> +				   ret);
> +			goto err_free_firmware_files;
> +		}
> 
> -	ret = ath10k_core_check_smbios(ar);
> -	if (ret)
> -		ath10k_dbg(ar, ATH10K_DBG_BOOT, "SMBIOS bdf variant name
> not set.\n");
> +		ret = ath10k_core_check_smbios(ar);
> +		if (ret)
> +			ath10k_dbg(ar, ATH10K_DBG_BOOT, "SMBIOS bdf
> variant name not set.\n");
> 
> -	ret = ath10k_core_check_dt(ar);
> -	if (ret)
> -		ath10k_dbg(ar, ATH10K_DBG_BOOT, "DT bdf variant name not
> set.\n");
> +		ret = ath10k_core_check_dt(ar);
> +		if (ret)
> +			ath10k_dbg(ar, ATH10K_DBG_BOOT, "DT bdf variant
> name not set.\n");
> 
> -	ret = ath10k_core_fetch_board_file(ar);
> -	if (ret) {
> -		ath10k_err(ar, "failed to fetch board file: %d\n", ret);
> -		goto err_free_firmware_files;
> -	}
> +		ret = ath10k_core_fetch_board_file(ar);
> +		if (ret) {
> +			ath10k_err(ar, "failed to fetch board file: %d\n", ret);
> +			goto err_free_firmware_files;
> +		}
> 
> -	ath10k_debug_print_board_info(ar);
> +		ath10k_debug_print_board_info(ar);
> +	}
> 
>  	ret = ath10k_core_init_firmware_features(ar);
>  	if (ret) {
> @@ -2442,11 +2468,15 @@ static int ath10k_core_probe_fw(struct ath10k *ar)
>  		goto err_free_firmware_files;
>  	}
> 
> -	ret = ath10k_swap_code_seg_init(ar, &ar->normal_mode_fw.fw_file);
> -	if (ret) {
> -		ath10k_err(ar, "failed to initialize code swap segment: %d\n",
> -			   ret);
> -		goto err_free_firmware_files;
> +	if (!test_bit(ATH10K_FW_FEATURE_NON_BMI,
> +		      ar->normal_mode_fw.fw_file.fw_features)) {
> +		ret = ath10k_swap_code_seg_init(ar,
> +						&ar-
> >normal_mode_fw.fw_file);
> +		if (ret) {
> +			ath10k_err(ar, "failed to initialize code swap segment:
> %d\n",
> +				   ret);
> +			goto err_free_firmware_files;
> +		}
>  	}
> 
>  	mutex_lock(&ar->conf_mutex);
> diff --git a/drivers/net/wireless/ath/ath10k/core.h
> b/drivers/net/wireless/ath/ath10k/core.h
> index 81285ab30a7d..b747ef52c186 100644
> --- a/drivers/net/wireless/ath/ath10k/core.h
> +++ b/drivers/net/wireless/ath/ath10k/core.h
> @@ -618,6 +618,9 @@ enum ath10k_fw_features {
>  	/* Firmware allows management tx by reference instead of by value. */
>  	ATH10K_FW_FEATURE_MGMT_TX_BY_REF = 18,
> 
> +	/* Firmware load is done externally, not by bmi */
> +	ATH10K_FW_FEATURE_NON_BMI = 19,
> +
>  	/* keep last */
>  	ATH10K_FW_FEATURE_COUNT,
>  };
> --
> 2.11.0




More information about the ath10k mailing list