]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: iwlwifi: acpi: add support for EWRD rev 3 table
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Thu, 19 Mar 2026 18:48:46 +0000 (20:48 +0200)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 25 Mar 2026 09:31:56 +0000 (11:31 +0200)
This table includes another sub-band for UNII-9.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20260319204647.9182284f007e.Ibbe7c1f8442933d29695b9bf56b8e775394c71f8@changeid
drivers/net/wireless/intel/iwlwifi/fw/acpi.c
drivers/net/wireless/intel/iwlwifi/fw/acpi.h

index debbba22a90939f110f883fc8c943a61ed300b37..721bd014bbaa6c4dd2e857b00f4101860fcd2105 100644 (file)
@@ -648,7 +648,22 @@ int iwl_acpi_get_ewrd_table(struct iwl_fw_runtime *fwrt)
        if (IS_ERR(data))
                return PTR_ERR(data);
 
-       /* start by trying to read revision 2 */
+       /* start by trying to read revision 3 */
+       wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
+                                        ACPI_EWRD_WIFI_DATA_SIZE_REV3,
+                                        &tbl_rev);
+       if (!IS_ERR(wifi_pkg)) {
+               if (tbl_rev != 3) {
+                       ret = -EINVAL;
+                       goto out_free;
+               }
+
+               num_sub_bands = ACPI_SAR_NUM_SUB_BANDS_REV3;
+
+               goto read_table;
+       }
+
+       /* then try revision 2 */
        wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
                                         ACPI_EWRD_WIFI_DATA_SIZE_REV2,
                                         &tbl_rev);
@@ -703,6 +718,13 @@ read_table:
                goto out_free;
        }
 
+       if (WARN_ON(ACPI_SAR_NUM_CHAINS_REV0 * num_sub_bands >
+                   ARRAY_SIZE(fwrt->sar_profiles[0].chains) *
+                   ARRAY_SIZE(fwrt->sar_profiles[0].chains[0].subbands))) {
+               ret = -EINVAL;
+               goto out_free;
+       }
+
        enabled = !!(wifi_pkg->package.elements[1].integer.value);
        n_profiles = wifi_pkg->package.elements[2].integer.value;
 
@@ -745,6 +767,13 @@ read_table:
        if (tbl_rev < 2)
                goto set_enabled;
 
+       if (WARN_ON(ACPI_SAR_NUM_CHAINS_REV0 * 2 * num_sub_bands >
+                   ARRAY_SIZE(fwrt->sar_profiles[0].chains) *
+                   ARRAY_SIZE(fwrt->sar_profiles[0].chains[0].subbands))) {
+               ret = -EINVAL;
+               goto out_free;
+       }
+
        /* parse cdb chains for all profiles */
        for (i = 0; i < n_profiles; i++) {
                struct iwl_sar_profile_chain *chains;
index ec6af1b58098b7ab3bb8cea7adbf5d063fb4d4c0..8e5ed72d4d8d271e27e43d4e4aeed2c7d0a5b42c 100644 (file)
@@ -58,6 +58,9 @@
 #define ACPI_EWRD_WIFI_DATA_SIZE_REV2  ((ACPI_SAR_PROFILE_NUM - 1) * \
                                         ACPI_SAR_NUM_CHAINS_REV2 * \
                                         ACPI_SAR_NUM_SUB_BANDS_REV2 + 3)
+#define ACPI_EWRD_WIFI_DATA_SIZE_REV3  ((ACPI_SAR_PROFILE_NUM - 1) * \
+                                        ACPI_SAR_NUM_CHAINS_REV2 * \
+                                        ACPI_SAR_NUM_SUB_BANDS_REV3 + 3)
 #define ACPI_WPFC_WIFI_DATA_SIZE       5 /* domain and 4 filter config words */
 
 /* revision 0 and 1 are identical, except for the semantics in the FW */