wifi: ath12k: ACPI band edge channel power 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:15 +0000 (12:29 +0300)
Currently, ath12k does not have the ability to set band edge channel power
for WCN7850. In order to support this, ath12k gets band edge channel power
table in ath12k_acpi_dsm_get_data() function and sets pdev_id and
param_type_id, then finally sends these data and
WMI_PDEV_SET_BIOS_INTERFACE_CMDID to firmware to set band edge channel
power.

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-5-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 4af80dd13535253aa8e192721bdbf10ebf161098..443ba12e01f375e77b0088f9b02e778b5eaf9f82 100644 (file)
@@ -91,6 +91,18 @@ static int ath12k_acpi_dsm_get_data(struct ath12k_base *ab, int func)
                        memcpy(&ab->acpi.cca_data, obj->buffer.pointer,
                               obj->buffer.length);
 
+                       break;
+               case ATH12K_ACPI_DSM_FUNC_INDEX_BAND_EDGE:
+                       if (obj->buffer.length != ATH12K_ACPI_DSM_BAND_EDGE_DATA_SIZE) {
+                               ath12k_warn(ab, "invalid ACPI DSM band edge data size: %d\n",
+                                           obj->buffer.length);
+                               ret = -EINVAL;
+                               goto out;
+                       }
+
+                       memcpy(&ab->acpi.band_edge_power, obj->buffer.pointer,
+                              obj->buffer.length);
+
                        break;
                }
        } else {
@@ -334,6 +346,30 @@ int ath12k_acpi_start(struct ath12k_base *ab)
                }
        }
 
+       if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi,
+                                      ATH12K_ACPI_FUNC_BIT_BAND_EDGE_CHAN_POWER)) {
+               ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_INDEX_BAND_EDGE);
+               if (ret) {
+                       ath12k_warn(ab, "failed to get ACPI DSM band edge channel power: %d\n",
+                                   ret);
+                       return ret;
+               }
+
+               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;
+                       }
+               }
+       }
+
        status = acpi_install_notify_handler(ACPI_HANDLE(ab->dev),
                                             ACPI_DEVICE_NOTIFY,
                                             ath12k_acpi_dsm_notify, ab);
index 0879865fd861bae38c662b985fc49ead337584f9..39e003d86a48badf482f41e743e0a5dec43e46e5 100644 (file)
 #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_DSM_FUNC_INDEX_BAND_EDGE           10
 
 #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_FUNC_BIT_BAND_EDGE_CHAN_POWER      BIT(9)
 
 #define ATH12K_ACPI_NOTIFY_EVENT                       0x86
 #define ATH12K_ACPI_FUNC_BIT_VALID(_acdata, _func)     (((_acdata).func_bit) & (_func))
@@ -30,6 +32,8 @@
 #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_BAND_EDGE_VERSION          0x1
+#define ATH12K_ACPI_BAND_EDGE_ENABLE_FLAG      0x1
 
 #define ATH12K_ACPI_GEO_OFFSET_DATA_OFFSET     1
 #define ATH12K_ACPI_DBS_BACKOFF_DATA_OFFSET    2
@@ -41,6 +45,7 @@
 #define ATH12K_ACPI_CCA_THR_OFFSET_LEN         36
 
 #define ATH12K_ACPI_DSM_TAS_DATA_SIZE                  69
+#define ATH12K_ACPI_DSM_BAND_EDGE_DATA_SIZE            100
 #define ATH12K_ACPI_DSM_TAS_CFG_SIZE                   108
 
 #define ATH12K_ACPI_DSM_GEO_OFFSET_DATA_SIZE (ATH12K_ACPI_GEO_OFFSET_DATA_OFFSET + \
index 93df8bf3ee48bc23805b77056608389ffe17ab19..eb6dd5551f209e44f55844f97e618b82cc86cad8 100644 (file)
@@ -916,6 +916,7 @@ struct ath12k_base {
                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];
+               u8 band_edge_power[ATH12K_ACPI_DSM_BAND_EDGE_DATA_SIZE];
        } acpi;
 
 #endif /* CONFIG_ACPI */
index 6db15a0a4735cc37cbbcee9688ad9e1b2009f74d..b5285ed78534a390251c216936730f53c8549b5d 100644 (file)
@@ -4808,6 +4808,10 @@ 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,
+
+       /* bandedge control power */
+       WMI_BIOS_PARAM_TYPE_BANDEDGE            = 3,
+
        WMI_BIOS_PARAM_TYPE_MAX,
 };