Commit 81870d13 authored by Luca Coelho's avatar Luca Coelho
Browse files

iwlwifi: convert flat SAR profile table to a struct version



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: default avatarLuca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210805130823.01530088097f.I903c236a574c7e4c0fc4db101fc39c0f5415ca43@changeid


Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent 248e7e2a
Loading
Loading
Loading
Loading
+19 −11
Original line number Diff line number Diff line
@@ -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)
	/*
	 * 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->table[i] = table[i].integer.value;
			profile->chains[i].subbands[j] =
				table[idx].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:
+9 −4
Original line number Diff line number Diff line
@@ -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
@@ -37,9 +36,11 @@
#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
@@ -64,9 +65,13 @@
#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 {