]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: ath12k: Adjust the timing to access ACPI table
authorLingbo Kong <quic_lingbok@quicinc.com>
Mon, 13 Jan 2025 07:48:09 +0000 (15:48 +0800)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Mon, 3 Feb 2025 22:43:29 +0000 (14:43 -0800)
Currently, the timing for accessing the ACPI table is inappropriate.

Due to special ACPI requirements, the ACPI table must be obtained before
downloading the board data file. Therefore, adjust the timing for accessing
the ACPI table accordingly.

This patch will not affect QCN9274, because only WCN7850 supports ACPI.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: Lingbo Kong <quic_lingbok@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Link: https://patch.msgid.link/20250113074810.29729-4-quic_lingbok@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/acpi.c
drivers/net/wireless/ath/ath12k/acpi.h
drivers/net/wireless/ath/ath12k/core.c
drivers/net/wireless/ath/ath12k/core.h
drivers/net/wireless/ath/ath12k/qmi.c

index 186ef5d62813c84cef129c16335f233f07e13a36..231b4eb92a5df683061814f67c20941d5c43dbe8 100644 (file)
@@ -278,15 +278,69 @@ bool ath12k_acpi_get_disable_11be(struct ath12k_base *ab)
        return ab->acpi.acpi_disable_11be;
 }
 
+void ath12k_acpi_set_dsm_func(struct ath12k_base *ab)
+{
+       int ret;
+       u8 *buf;
+
+       if (!ab->hw_params->acpi_guid)
+               /* not supported with this hardware */
+               return;
+
+       if (ab->acpi.acpi_tas_enable) {
+               ret = ath12k_acpi_set_tas_params(ab);
+               if (ret) {
+                       ath12k_warn(ab, "failed to send ACPI TAS parameters: %d\n", ret);
+                       return;
+               }
+       }
+
+       if (ab->acpi.acpi_bios_sar_enable) {
+               ret = ath12k_acpi_set_bios_sar_params(ab);
+               if (ret) {
+                       ath12k_warn(ab, "failed to send ACPI BIOS SAR: %d\n", ret);
+                       return;
+               }
+       }
+
+       if (ab->acpi.acpi_cca_enable) {
+               buf = ab->acpi.cca_data + ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET;
+               ret = ath12k_wmi_set_bios_cmd(ab,
+                                             WMI_BIOS_PARAM_CCA_THRESHOLD_TYPE,
+                                             buf,
+                                             ATH12K_ACPI_CCA_THR_OFFSET_LEN);
+               if (ret) {
+                       ath12k_warn(ab, "failed to set ACPI DSM CCA threshold: %d\n",
+                                   ret);
+                       return;
+               }
+       }
+
+       if (ab->acpi.acpi_band_edge_enable) {
+               ret = ath12k_wmi_set_bios_cmd(ab,
+                                             WMI_BIOS_PARAM_TYPE_BANDEDGE,
+                                             ab->acpi.band_edge_power,
+                                             sizeof(ab->acpi.band_edge_power));
+               if (ret) {
+                       ath12k_warn(ab,
+                                   "failed to set ACPI DSM band edge channel power: %d\n",
+                                   ret);
+                       return;
+               }
+       }
+}
+
 int ath12k_acpi_start(struct ath12k_base *ab)
 {
        acpi_status status;
-       u8 *buf;
        int ret;
 
        ab->acpi.acpi_tas_enable = false;
        ab->acpi.acpi_disable_11be = false;
        ab->acpi.acpi_disable_rfkill = false;
+       ab->acpi.acpi_bios_sar_enable = false;
+       ab->acpi.acpi_cca_enable = false;
+       ab->acpi.acpi_band_edge_enable = false;
 
        if (!ab->hw_params->acpi_guid)
                /* not supported with this hardware */
@@ -357,20 +411,6 @@ int ath12k_acpi_start(struct ath12k_base *ab)
                        ab->acpi.acpi_bios_sar_enable = true;
        }
 
-       if (ab->acpi.acpi_tas_enable) {
-               ret = ath12k_acpi_set_tas_params(ab);
-               if (ret) {
-                       ath12k_warn(ab, "failed to send ACPI parameters: %d\n", ret);
-                       return ret;
-               }
-       }
-
-       if (ab->acpi.acpi_bios_sar_enable) {
-               ret = ath12k_acpi_set_bios_sar_params(ab);
-               if (ret)
-                       return ret;
-       }
-
        if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_CCA)) {
                ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_INDEX_CCA);
                if (ret) {
@@ -381,18 +421,8 @@ int ath12k_acpi_start(struct ath12k_base *ab)
 
                if (ab->acpi.cca_data[0] == ATH12K_ACPI_CCA_THR_VERSION &&
                    ab->acpi.cca_data[ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET] ==
-                   ATH12K_ACPI_CCA_THR_ENABLE_FLAG) {
-                       buf = ab->acpi.cca_data + ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET;
-                       ret = ath12k_wmi_set_bios_cmd(ab,
-                                                     WMI_BIOS_PARAM_CCA_THRESHOLD_TYPE,
-                                                     buf,
-                                                     ATH12K_ACPI_CCA_THR_OFFSET_LEN);
-                       if (ret) {
-                               ath12k_warn(ab, "failed to set ACPI DSM CCA threshold: %d\n",
-                                           ret);
-                               return ret;
-                       }
-               }
+                   ATH12K_ACPI_CCA_THR_ENABLE_FLAG)
+                       ab->acpi.acpi_cca_enable = true;
        }
 
        if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi,
@@ -405,18 +435,8 @@ int ath12k_acpi_start(struct ath12k_base *ab)
                }
 
                if (ab->acpi.band_edge_power[0] == ATH12K_ACPI_BAND_EDGE_VERSION &&
-                   ab->acpi.band_edge_power[1] == ATH12K_ACPI_BAND_EDGE_ENABLE_FLAG) {
-                       ret = ath12k_wmi_set_bios_cmd(ab,
-                                                     WMI_BIOS_PARAM_TYPE_BANDEDGE,
-                                                     ab->acpi.band_edge_power,
-                                                     sizeof(ab->acpi.band_edge_power));
-                       if (ret) {
-                               ath12k_warn(ab,
-                                           "failed to set ACPI DSM band edge channel power: %d\n",
-                                           ret);
-                               return ret;
-                       }
-               }
+                   ab->acpi.band_edge_power[1] == ATH12K_ACPI_BAND_EDGE_ENABLE_FLAG)
+                       ab->acpi.acpi_band_edge_enable = true;
        }
 
        status = acpi_install_notify_handler(ACPI_HANDLE(ab->dev),
index 242ea88fb6c205e3364489f67ab30ac845b6175a..19a1a1118e82bd733262c4718ac868dd55204a19 100644 (file)
@@ -70,6 +70,7 @@ int ath12k_acpi_start(struct ath12k_base *ab);
 void ath12k_acpi_stop(struct ath12k_base *ab);
 bool ath12k_acpi_get_disable_rfkill(struct ath12k_base *ab);
 bool ath12k_acpi_get_disable_11be(struct ath12k_base *ab);
+void ath12k_acpi_set_dsm_func(struct ath12k_base *ab);
 
 #else
 
@@ -92,6 +93,10 @@ static inline bool ath12k_acpi_get_disable_11be(struct ath12k_base *ab)
        return false;
 }
 
+static inline void ath12k_acpi_set_dsm_func(struct ath12k_base *ab)
+{
+}
+
 #endif /* CONFIG_ACPI */
 
 #endif /* ATH12K_ACPI_H */
index 6d09a51a1571ea731d296e575df031d002da1842..323bd5082a7ddedb3c1c7416dd5e87dfd8aa11a9 100644 (file)
@@ -849,10 +849,7 @@ static int ath12k_core_start(struct ath12k_base *ab)
                goto err_reo_cleanup;
        }
 
-       ret = ath12k_acpi_start(ab);
-       if (ret)
-               /* ACPI is optional so continue in case of an error */
-               ath12k_dbg(ab, ATH12K_DBG_BOOT, "acpi failed: %d\n", ret);
+       ath12k_acpi_set_dsm_func(ab);
 
        if (!test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags))
                /* Indicate the core start in the appropriate group */
index fd13c4e53ef2085a01092f378ebf25a530f77faf..79ffaa62bd2fd2b1736b081b460dbe0b53bbb0b2 100644 (file)
@@ -1060,6 +1060,8 @@ struct ath12k_base {
                bool acpi_bios_sar_enable;
                bool acpi_disable_11be;
                bool acpi_disable_rfkill;
+               bool acpi_cca_enable;
+               bool acpi_band_edge_enable;
                u32 bit_flag;
                u8 tas_cfg[ATH12K_ACPI_DSM_TAS_CFG_SIZE];
                u8 tas_sar_power_table[ATH12K_ACPI_DSM_TAS_DATA_SIZE];
index 5c3563383fabba779b0afd885802637fd5c53656..c43f773c66ba465b0f1d4e880f83d539facf2529 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/elf.h>
@@ -2740,6 +2740,11 @@ 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_acpi_start(ab);
+       if (r)
+               /* ACPI is optional so continue in case of an error */
+               ath12k_dbg(ab, ATH12K_DBG_BOOT, "acpi failed: %d\n", r);
+
 out:
        return ret;
 }