wifi: ath12k: ACPI CCA threshold support
authorLingbo Kong <quic_lingbok@quicinc.com>
Mon, 22 Apr 2024 13:18:45 +0000 (16:18 +0300)
committerKalle Valo <quic_kvalo@quicinc.com>
Tue, 23 Apr 2024 09:29:14 +0000 (12:29 +0300)
Currently, ath12k does not have the ability to adjust Clear Channel Assessment
(CCA) threshold values to meet the regulatory requirements. Get the values from
ACPI and send them to the firmware using ath12k_wmi_set_bios_cmd() function.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4

Signed-off-by: Lingbo Kong <quic_lingbok@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20240422033054.979-4-quic_lingbok@quicinc.com
drivers/net/wireless/ath/ath12k/acpi.c
drivers/net/wireless/ath/ath12k/acpi.h
drivers/net/wireless/ath/ath12k/core.h
drivers/net/wireless/ath/ath12k/wmi.h

index 177babc50f25311242410495a863c133ee7a5777..4af80dd13535253aa8e192721bdbf10ebf161098 100644 (file)
@@ -79,6 +79,18 @@ static int ath12k_acpi_dsm_get_data(struct ath12k_base *ab, int func)
                        memcpy(&ab->acpi.geo_offset_data, obj->buffer.pointer,
                               obj->buffer.length);
 
+                       break;
+               case ATH12K_ACPI_DSM_FUNC_INDEX_CCA:
+                       if (obj->buffer.length != ATH12K_ACPI_DSM_CCA_DATA_SIZE) {
+                               ath12k_warn(ab, "invalid ACPI DSM CCA data size: %d\n",
+                                           obj->buffer.length);
+                               ret = -EINVAL;
+                               goto out;
+                       }
+
+                       memcpy(&ab->acpi.cca_data, obj->buffer.pointer,
+                              obj->buffer.length);
+
                        break;
                }
        } else {
@@ -226,6 +238,7 @@ static int ath12k_acpi_set_tas_params(struct ath12k_base *ab)
 int ath12k_acpi_start(struct ath12k_base *ab)
 {
        acpi_status status;
+       u8 *buf;
        int ret;
 
        if (!ab->hw_params->acpi_guid)
@@ -297,6 +310,30 @@ int ath12k_acpi_start(struct ath12k_base *ab)
                        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) {
+                       ath12k_warn(ab, "failed to get ACPI DSM CCA threshold configuration: %d\n",
+                                   ret);
+                       return ret;
+               }
+
+               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;
+                       }
+               }
+       }
+
        status = acpi_install_notify_handler(ACPI_HANDLE(ab->dev),
                                             ACPI_DEVICE_NOTIFY,
                                             ath12k_acpi_dsm_notify, ab);
index 7ade8b3f640d3bd05c4dbe394cc5f24152edaf7d..0879865fd861bae38c662b985fc49ead337584f9 100644 (file)
 #define ATH12K_ACPI_DSM_FUNC_SUPPORT_FUNCS     0
 #define ATH12K_ACPI_DSM_FUNC_BIOS_SAR          4
 #define ATH12K_ACPI_DSM_FUNC_GEO_OFFSET                5
+#define ATH12K_ACPI_DSM_FUNC_INDEX_CCA         6
 #define ATH12K_ACPI_DSM_FUNC_TAS_CFG           8
 #define ATH12K_ACPI_DSM_FUNC_TAS_DATA          9
 
 #define ATH12K_ACPI_FUNC_BIT_BIOS_SAR                  BIT(3)
 #define ATH12K_ACPI_FUNC_BIT_GEO_OFFSET                        BIT(4)
+#define ATH12K_ACPI_FUNC_BIT_CCA                       BIT(5)
 #define ATH12K_ACPI_FUNC_BIT_TAS_CFG                   BIT(7)
 #define ATH12K_ACPI_FUNC_BIT_TAS_DATA                  BIT(8)
 
 #define ATH12K_ACPI_TAS_DATA_ENABLE            0x1
 #define ATH12K_ACPI_POWER_LIMIT_VERSION                0x1
 #define ATH12K_ACPI_POWER_LIMIT_ENABLE_FLAG    0x1
+#define ATH12K_ACPI_CCA_THR_VERSION            0x1
+#define ATH12K_ACPI_CCA_THR_ENABLE_FLAG                0x1
 
 #define ATH12K_ACPI_GEO_OFFSET_DATA_OFFSET     1
 #define ATH12K_ACPI_DBS_BACKOFF_DATA_OFFSET    2
+#define ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET 5
 #define ATH12K_ACPI_BIOS_SAR_DBS_BACKOFF_LEN   10
 #define ATH12K_ACPI_POWER_LIMIT_DATA_OFFSET    12
 #define ATH12K_ACPI_BIOS_SAR_GEO_OFFSET_LEN    18
 #define ATH12K_ACPI_BIOS_SAR_TABLE_LEN         22
+#define ATH12K_ACPI_CCA_THR_OFFSET_LEN         36
 
 #define ATH12K_ACPI_DSM_TAS_DATA_SIZE                  69
 #define ATH12K_ACPI_DSM_TAS_CFG_SIZE                   108
@@ -41,6 +47,8 @@
                                              ATH12K_ACPI_BIOS_SAR_GEO_OFFSET_LEN)
 #define ATH12K_ACPI_DSM_BIOS_SAR_DATA_SIZE (ATH12K_ACPI_POWER_LIMIT_DATA_OFFSET + \
                                            ATH12K_ACPI_BIOS_SAR_TABLE_LEN)
+#define ATH12K_ACPI_DSM_CCA_DATA_SIZE (ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET + \
+                                      ATH12K_ACPI_CCA_THR_OFFSET_LEN)
 
 #ifdef CONFIG_ACPI
 
index 40ace809554a6e8363751791a4e1194d1e2d7d15..93df8bf3ee48bc23805b77056608389ffe17ab19 100644 (file)
@@ -915,6 +915,7 @@ struct ath12k_base {
                u8 tas_sar_power_table[ATH12K_ACPI_DSM_TAS_DATA_SIZE];
                u8 bios_sar_data[ATH12K_ACPI_DSM_BIOS_SAR_DATA_SIZE];
                u8 geo_offset_data[ATH12K_ACPI_DSM_GEO_OFFSET_DATA_SIZE];
+               u8 cca_data[ATH12K_ACPI_DSM_CCA_DATA_SIZE];
        } acpi;
 
 #endif /* CONFIG_ACPI */
index 8ace566f7eb573c0a9ac9da0fd1afe123a52f4db..6db15a0a4735cc37cbbcee9688ad9e1b2009f74d 100644 (file)
@@ -4805,6 +4805,7 @@ struct wmi_pdev_set_bios_interface_cmd {
 } __packed;
 
 enum wmi_bios_param_type {
+       WMI_BIOS_PARAM_CCA_THRESHOLD_TYPE       = 0,
        WMI_BIOS_PARAM_TAS_CONFIG_TYPE          = 1,
        WMI_BIOS_PARAM_TAS_DATA_TYPE            = 2,
        WMI_BIOS_PARAM_TYPE_MAX,