iwlwifi: convert flat SAR profile table to a struct version
authorLuca Coelho <luciano.coelho@intel.com>
Thu, 5 Aug 2021 10:19:33 +0000 (13:19 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Thu, 26 Aug 2021 20:35:18 +0000 (23:35 +0300)
The SAR profiles have been stored in single-dimension arrays and the
access has been done via a single index.  We will soon need to support
different revisions of this table, which will make the flat array even
harder to handle.  To prepare for that, convert the single-dimension
array to a struct with substructures.

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

index dff7926..f20f015 100644 (file)
@@ -414,16 +414,25 @@ static int iwl_sar_set_profile(union acpi_object *table,
                               struct iwl_sar_profile *profile,
                               bool enabled)
 {
-       int i;
+       int i, j, idx = 0;
 
        profile->enabled = enabled;
 
-       for (i = 0; i < ACPI_SAR_TABLE_SIZE; i++) {
-               if (table[i].type != ACPI_TYPE_INTEGER ||
-                   table[i].integer.value > U8_MAX)
-                       return -EINVAL;
+       /*
+        * The table from ACPI is flat, but we store it in a
+        * structured array.
+        */
+       for (i = 0; i < ACPI_SAR_NUM_CHAINS; i++) {
+               for (j = 0; j < ACPI_SAR_NUM_SUB_BANDS; j++) {
+                       if (table[idx].type != ACPI_TYPE_INTEGER ||
+                           table[idx].integer.value > U8_MAX)
+                               return -EINVAL;
+
+                       profile->chains[i].subbands[j] =
+                               table[idx].integer.value;
 
-               profile->table[i] = table[i].integer.value;
+                       idx++;
+               }
        }
 
        return 0;
@@ -434,7 +443,7 @@ static int iwl_sar_fill_table(struct iwl_fw_runtime *fwrt,
                              int prof_a, int prof_b)
 {
        int profs[ACPI_SAR_NUM_CHAINS] = { prof_a, prof_b };
-       int i, j, idx;
+       int i, j;
 
        for (i = 0; i < ACPI_SAR_NUM_CHAINS; i++) {
                struct iwl_sar_profile *prof;
@@ -467,11 +476,10 @@ static int iwl_sar_fill_table(struct iwl_fw_runtime *fwrt,
                               i, profs[i]);
                IWL_DEBUG_RADIO(fwrt, "  Chain[%d]:\n", i);
                for (j = 0; j < n_subbands; j++) {
-                       idx = i * ACPI_SAR_NUM_SUB_BANDS + j;
                        per_chain[i * n_subbands + j] =
-                               cpu_to_le16(prof->table[idx]);
+                               cpu_to_le16(prof->chains[i].subbands[j]);
                        IWL_DEBUG_RADIO(fwrt, "    Band[%d] = %d * .125dBm\n",
-                                       j, prof->table[idx]);
+                                       j, prof->chains[i].subbands[j]);
                }
        }
 
@@ -595,7 +603,7 @@ int iwl_sar_get_ewrd_table(struct iwl_fw_runtime *fwrt)
                        break;
 
                /* go to the next table */
-               pos += ACPI_SAR_TABLE_SIZE;
+               pos += ACPI_SAR_NUM_CHAINS * ACPI_SAR_NUM_SUB_BANDS;
        }
 
 out_free:
index 24e9443..cd26a15 100644 (file)
@@ -26,7 +26,6 @@
 
 #define ACPI_WIFI_DOMAIN       (0x07)
 
-#define ACPI_SAR_TABLE_SIZE            10
 #define ACPI_SAR_PROFILE_NUM           4
 
 #define ACPI_GEO_TABLE_SIZE            6
 #define ACPI_SAR_NUM_SUB_BANDS         5
 #define ACPI_SAR_NUM_TABLES            1
 
-#define ACPI_WRDS_WIFI_DATA_SIZE       (ACPI_SAR_TABLE_SIZE + 2)
+#define ACPI_WRDS_WIFI_DATA_SIZE       (ACPI_SAR_NUM_CHAINS * \
+                                        ACPI_SAR_NUM_SUB_BANDS + 2)
 #define ACPI_EWRD_WIFI_DATA_SIZE       ((ACPI_SAR_PROFILE_NUM - 1) * \
-                                        ACPI_SAR_TABLE_SIZE + 3)
+                                        ACPI_SAR_NUM_CHAINS * \
+                                        ACPI_SAR_NUM_SUB_BANDS + 3)
 #define ACPI_WGDS_WIFI_DATA_SIZE       19
 #define ACPI_WRDD_WIFI_DATA_SIZE       2
 #define ACPI_SPLC_WIFI_DATA_SIZE       2
 #define ACPI_PPAG_MIN_HB -16
 #define ACPI_PPAG_MAX_HB 40
 
+struct iwl_sar_profile_chain {
+       u8 subbands[ACPI_SAR_NUM_SUB_BANDS];
+};
+
 struct iwl_sar_profile {
        bool enabled;
-       u8 table[ACPI_SAR_TABLE_SIZE];
+       struct iwl_sar_profile_chain chains[ACPI_SAR_NUM_CHAINS];
 };
 
 struct iwl_geo_profile {