[PATCH 1/1] wifi: ath12k: support calibration-variant from device tree
Andrew LaMarche
andrewjlamarche at gmail.com
Wed May 27 09:12:41 PDT 2026
Hi,
A kind ping here. I’m not sure why this functionality is missing in the first place, but it is needed for loading caldata from the device tree.
Cheers,
Andrew
> On Jan 30, 2026, at 7:32 PM, Andrew LaMarche <andrewjlamarche at gmail.com> wrote:
>
> ath10k and ath11k support reading calibration variants from the device
> tree to locate the correct Board Description File (BDF). The ath12k-wsi
> binding already describes using qcom,calibration-variant and
> qcom,ath12k-calibration-variant, but it is not implemented in the code.
>
> Many ath12k designs expose all the radios under a single phy, each of
> which typically require a separate BDF. Without this, the radios may not
> come up or will not be calibrated correctly.
>
> Fix this by parsing the device tree for the generation-agnostic
> qcom,calibration-variant node or ath12k-specific
> qcom,ath12k-calibration-variant node. This allows the driver to properly
> select, read and apply the correct BDF.
>
> Signed-off-by: Andrew LaMarche <andrewjlamarche at gmail.com>
> ---
> drivers/net/wireless/ath/ath12k/core.c | 25 +++++++++++++++++++++++++
> drivers/net/wireless/ath/ath12k/core.h | 2 +-
> drivers/net/wireless/ath/ath12k/qmi.c | 4 ++++
> 3 files changed, 30 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c
> index cc352eef1939..e45f76d81337 100644
> --- a/drivers/net/wireless/ath/ath12k/core.c
> +++ b/drivers/net/wireless/ath/ath12k/core.c
> @@ -806,6 +806,31 @@ int ath12k_core_check_smbios(struct ath12k_base *ab)
> return 0;
> }
>
> +int ath12k_core_check_dt(struct ath12k_base *ab)
> +{
> + size_t max_len = sizeof(ab->qmi.target.bdf_ext);
> + const char *variant = NULL;
> + struct device_node *node;
> +
> + node = ab->dev->of_node;
> + if (!node)
> + return -ENOENT;
> +
> + of_property_read_string(node, "qcom,calibration-variant",
> + &variant);
> + if (!variant)
> + of_property_read_string(node, "qcom,ath12k-calibration-variant",
> + &variant);
> + if (!variant)
> + return -ENODATA;
> +
> + if (strscpy(ab->qmi.target.bdf_ext, variant, max_len) < 0)
> + ath12k_dbg(ab, ATH12K_DBG_BOOT,
> + "bdf variant string is longer than the buffer can accommodate (variant: %s)\n", variant);
> +
> + return 0;
> +}
> +
> static int ath12k_core_soc_create(struct ath12k_base *ab)
> {
> int ret;
> diff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h
> index 3c1e0069be1e..39700a780ee2 100644
> --- a/drivers/net/wireless/ath/ath12k/core.h
> +++ b/drivers/net/wireless/ath/ath12k/core.h
> @@ -1352,7 +1352,7 @@ int ath12k_core_fetch_bdf(struct ath12k_base *ath12k,
> struct ath12k_board_data *bd);
> void ath12k_core_free_bdf(struct ath12k_base *ab, struct ath12k_board_data *bd);
> int ath12k_core_fetch_regdb(struct ath12k_base *ab, struct ath12k_board_data *bd);
> -int ath12k_core_check_dt(struct ath12k_base *ath12k);
> +int ath12k_core_check_dt(struct ath12k_base *ab);
> int ath12k_core_check_smbios(struct ath12k_base *ab);
> void ath12k_core_halt(struct ath12k *ar);
> int ath12k_core_resume_early(struct ath12k_base *ab);
> diff --git a/drivers/net/wireless/ath/ath12k/qmi.c b/drivers/net/wireless/ath/ath12k/qmi.c
> index b7c48b6706df..22ef5aab871f 100644
> --- a/drivers/net/wireless/ath/ath12k/qmi.c
> +++ b/drivers/net/wireless/ath/ath12k/qmi.c
> @@ -2903,6 +2903,10 @@ int ath12k_qmi_request_target_cap(struct ath12k_base *ab)
> if (r)
> ath12k_dbg(ab, ATH12K_DBG_QMI, "SMBIOS bdf variant name not set.\n");
>
> + r = ath12k_core_check_dt(ab);
> + if (r)
> + ath12k_dbg(ab, ATH12K_DBG_QMI, "DT bdf variant name not set.\n");
> +
> r = ath12k_acpi_start(ab);
> if (r)
> /* ACPI is optional so continue in case of an error */
> --
> 2.43.0
>
More information about the ath12k
mailing list