]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
iwlwifi: acpi: fill in WGDS table with defaults
authorLuca Coelho <luciano.coelho@intel.com>
Thu, 19 Aug 2021 15:40:26 +0000 (18:40 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Thu, 26 Aug 2021 20:37:05 +0000 (23:37 +0300)
The tables we store are the larger of all the revisions, so we need to
fill in the values that we don't get from ACPI when using older
revisions.

Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210819183728.01b12461a30b.I08d1f9154f26eca25c44616efdb5223bcc1935f3@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/acpi.c

index de1e9271dcd27037ef7b7a748c4dfcea1bd7f334..37da836a8c0821691cd5b71a60152bf324afa718 100644 (file)
@@ -745,20 +745,18 @@ int iwl_sar_get_wgds_table(struct iwl_fw_runtime *fwrt)
 read_table:
        fwrt->geo_rev = tbl_rev;
        for (i = 0; i < ACPI_NUM_GEO_PROFILES; i++) {
-               for (j = 0; j < num_bands; j++) {
+               for (j = 0; j < ACPI_GEO_NUM_BANDS_REV2; j++) {
                        union acpi_object *entry;
 
-                       entry = &wifi_pkg->package.elements[idx++];
-                       if (entry->type != ACPI_TYPE_INTEGER ||
-                           entry->integer.value > U8_MAX) {
-                               ret = -EINVAL;
-                               goto out_free;
-                       }
-
-                       fwrt->geo_profiles[i].bands[j].max =
-                               entry->integer.value;
-
-                       for (k = 0; k < ACPI_GEO_NUM_CHAINS; k++) {
+                       /*
+                        * num_bands is either 2 or 3, if it's only 2 then
+                        * fill the third band (6 GHz) with the values from
+                        * 5 GHz (second band)
+                        */
+                       if (j >= num_bands) {
+                               fwrt->geo_profiles[i].bands[j].max =
+                                       fwrt->geo_profiles[i].bands[1].max;
+                       } else {
                                entry = &wifi_pkg->package.elements[idx++];
                                if (entry->type != ACPI_TYPE_INTEGER ||
                                    entry->integer.value > U8_MAX) {
@@ -766,9 +764,27 @@ read_table:
                                        goto out_free;
                                }
 
-                               fwrt->geo_profiles[i].bands[j].chains[k] =
+                               fwrt->geo_profiles[i].bands[j].max =
                                        entry->integer.value;
                        }
+
+                       for (k = 0; k < ACPI_GEO_NUM_CHAINS; k++) {
+                               /* same here as above */
+                               if (j >= num_bands) {
+                                       fwrt->geo_profiles[i].bands[j].chains[k] =
+                                               fwrt->geo_profiles[i].bands[1].chains[k];
+                               } else {
+                                       entry = &wifi_pkg->package.elements[idx++];
+                                       if (entry->type != ACPI_TYPE_INTEGER ||
+                                           entry->integer.value > U8_MAX) {
+                                               ret = -EINVAL;
+                                               goto out_free;
+                                       }
+
+                                       fwrt->geo_profiles[i].bands[j].chains[k] =
+                                               entry->integer.value;
+                               }
+                       }
                }
        }