]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: Add Support for enabling or disabling specific features based on ACPI...
authorLingbo Kong <quic_lingbok@quicinc.com>
Mon, 13 Jan 2025 07:48:08 +0000 (15:48 +0800)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Mon, 3 Feb 2025 22:43:29 +0000 (14:43 -0800)
Currently, ath12k does not support enable or disable specific features by
ACPI bitflag.

To address this issue, obtain the ACPI bitflag value and use it to
selectively enable or disable specific features.

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-3-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/mac.c

index b6935ab1655e4dfe7d9681dd5f0b09f8ec5172aa..186ef5d62813c84cef129c16335f233f07e13a36 100644 (file)
@@ -29,7 +29,14 @@ static int ath12k_acpi_dsm_get_data(struct ath12k_base *ab, int func)
        }
 
        if (obj->type == ACPI_TYPE_INTEGER) {
-               ab->acpi.func_bit = obj->integer.value;
+               switch (func) {
+               case ATH12K_ACPI_DSM_FUNC_SUPPORT_FUNCS:
+                       ab->acpi.func_bit = obj->integer.value;
+                       break;
+               case ATH12K_ACPI_DSM_FUNC_DISABLE_FLAG:
+                       ab->acpi.bit_flag = obj->integer.value;
+                       break;
+               }
        } else if (obj->type == ACPI_TYPE_BUFFER) {
                switch (func) {
                case ATH12K_ACPI_DSM_FUNC_SUPPORT_FUNCS:
@@ -261,24 +268,52 @@ static int ath12k_acpi_set_tas_params(struct ath12k_base *ab)
        return 0;
 }
 
+bool ath12k_acpi_get_disable_rfkill(struct ath12k_base *ab)
+{
+       return ab->acpi.acpi_disable_rfkill;
+}
+
+bool ath12k_acpi_get_disable_11be(struct ath12k_base *ab)
+{
+       return ab->acpi.acpi_disable_11be;
+}
+
 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;
+
        if (!ab->hw_params->acpi_guid)
                /* not supported with this hardware */
                return 0;
 
-       ab->acpi.acpi_tas_enable = false;
-
        ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_SUPPORT_FUNCS);
        if (ret) {
                ath12k_dbg(ab, ATH12K_DBG_BOOT, "failed to get ACPI DSM data: %d\n", ret);
                return ret;
        }
 
+       if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_DISABLE_FLAG)) {
+               ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_DISABLE_FLAG);
+               if (ret) {
+                       ath12k_warn(ab, "failed to get ACPI DISABLE FLAG: %d\n", ret);
+                       return ret;
+               }
+
+               if (ATH12K_ACPI_CHEK_BIT_VALID(ab->acpi,
+                                              ATH12K_ACPI_DSM_DISABLE_11BE_BIT))
+                       ab->acpi.acpi_disable_11be = true;
+
+               if (!ATH12K_ACPI_CHEK_BIT_VALID(ab->acpi,
+                                               ATH12K_ACPI_DSM_DISABLE_RFKILL_BIT))
+                       ab->acpi.acpi_disable_rfkill = true;
+       }
+
        if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_TAS_CFG)) {
                ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_TAS_CFG);
                if (ret) {
index 6ccc26250aafb7ed19300f12353d439d4be98137..242ea88fb6c205e3364489f67ab30ac845b6175a 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/acpi.h>
 
 #define ATH12K_ACPI_DSM_FUNC_SUPPORT_FUNCS     0
+#define ATH12K_ACPI_DSM_FUNC_DISABLE_FLAG      2
 #define ATH12K_ACPI_DSM_FUNC_BIOS_SAR          4
 #define ATH12K_ACPI_DSM_FUNC_GEO_OFFSET                5
 #define ATH12K_ACPI_DSM_FUNC_INDEX_CCA         6
@@ -16,6 +17,7 @@
 #define ATH12K_ACPI_DSM_FUNC_TAS_DATA          9
 #define ATH12K_ACPI_DSM_FUNC_INDEX_BAND_EDGE           10
 
+#define ATH12K_ACPI_FUNC_BIT_DISABLE_FLAG              BIT(1)
 #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)
@@ -25,6 +27,7 @@
 
 #define ATH12K_ACPI_NOTIFY_EVENT                       0x86
 #define ATH12K_ACPI_FUNC_BIT_VALID(_acdata, _func)     (((_acdata).func_bit) & (_func))
+#define ATH12K_ACPI_CHEK_BIT_VALID(_acdata, _func)     (((_acdata).bit_flag) & (_func))
 
 #define ATH12K_ACPI_TAS_DATA_VERSION           0x1
 #define ATH12K_ACPI_TAS_DATA_ENABLE            0x1
@@ -51,6 +54,9 @@
 #define ATH12K_ACPI_DSM_FUNC_MIN_BITMAP_SIZE   1
 #define ATH12K_ACPI_DSM_FUNC_MAX_BITMAP_SIZE   4
 
+#define ATH12K_ACPI_DSM_DISABLE_11BE_BIT       BIT(0)
+#define ATH12K_ACPI_DSM_DISABLE_RFKILL_BIT     BIT(2)
+
 #define ATH12K_ACPI_DSM_GEO_OFFSET_DATA_SIZE (ATH12K_ACPI_GEO_OFFSET_DATA_OFFSET + \
                                              ATH12K_ACPI_BIOS_SAR_GEO_OFFSET_LEN)
 #define ATH12K_ACPI_DSM_BIOS_SAR_DATA_SIZE (ATH12K_ACPI_POWER_LIMIT_DATA_OFFSET + \
@@ -62,6 +68,8 @@
 
 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);
 
 #else
 
@@ -74,6 +82,16 @@ static inline void ath12k_acpi_stop(struct ath12k_base *ab)
 {
 }
 
+static inline bool ath12k_acpi_get_disable_rfkill(struct ath12k_base *ab)
+{
+       return false;
+}
+
+static inline bool ath12k_acpi_get_disable_11be(struct ath12k_base *ab)
+{
+       return false;
+}
+
 #endif /* CONFIG_ACPI */
 
 #endif /* ATH12K_ACPI_H */
index 60c077b016b4009d5b7cf28c1858d743d00ea02d..6d09a51a1571ea731d296e575df031d002da1842 100644 (file)
@@ -40,6 +40,9 @@ static int ath12k_core_rfkill_config(struct ath12k_base *ab)
        if (!(ab->target_caps.sys_cap_info & WMI_SYS_CAP_INFO_RFKILL))
                return 0;
 
+       if (ath12k_acpi_get_disable_rfkill(ab))
+               return 0;
+
        for (i = 0; i < ab->num_radios; i++) {
                ar = ab->pdevs[i].ar;
 
index 983a5d735cebc4e07f22c5c5842dac1147d9355f..fd13c4e53ef2085a01092f378ebf25a530f77faf 100644 (file)
@@ -1058,6 +1058,9 @@ struct ath12k_base {
                u32 func_bit;
                bool acpi_tas_enable;
                bool acpi_bios_sar_enable;
+               bool acpi_disable_11be;
+               bool acpi_disable_rfkill;
+               u32 bit_flag;
                u8 tas_cfg[ATH12K_ACPI_DSM_TAS_CFG_SIZE];
                u8 tas_sar_power_table[ATH12K_ACPI_DSM_TAS_DATA_SIZE];
                u8 bios_sar_data[ATH12K_ACPI_DSM_BIOS_SAR_DATA_SIZE];
index aadace85dc117344cc561e1a13af07bccf60cad1..16e6f2fae943d3fa6a46ab1ba6780c9070418279 100644 (file)
@@ -6751,7 +6751,8 @@ static void ath12k_mac_copy_eht_cap(struct ath12k *ar,
 
        memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap));
 
-       if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)))
+       if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) ||
+           ath12k_acpi_get_disable_11be(ar->ab))
                return;
 
        eht_cap->has_eht = true;