Skip to content

Commit 2a80841

Browse files
committed
iwlwifi: acpi: support reading and storing WRDS revision 1 and 2
Change the SAR profile tables storage to revision 2 regardless of the revision we read from ACPI. Revision 2 is a superset of revision 1, which is in turn a superset of revision 0, so they can all be stored inside revision 2. Add support for reading and storing also revisions 1 and 2, whose only difference is the number of chains and number of sub-bands. So most of the code revolves around passing different chain and sub-band sizes. With this patch we still pass only revision 0 to the firmware, but that will be changed in a separate patch. Signed-off-by: Luca Coelho <[email protected]> Link: https://lore.kernel.org/r/iwlwifi.20210805141826.2edad09415c8.I36297aef90a9ec6a3ea1bf1a151a62f272826d59@changeid Signed-off-by: Luca Coelho <[email protected]>
1 parent 8ecf047 commit 2a80841

File tree

2 files changed

+80
-25
lines changed

2 files changed

+80
-25
lines changed

drivers/net/wireless/intel/iwlwifi/fw/acpi.c

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -442,10 +442,10 @@ static int iwl_sar_fill_table(struct iwl_fw_runtime *fwrt,
442442
__le16 *per_chain, u32 n_subbands,
443443
int prof_a, int prof_b)
444444
{
445-
int profs[ACPI_SAR_NUM_CHAINS] = { prof_a, prof_b };
445+
int profs[ACPI_SAR_NUM_CHAINS_REV0] = { prof_a, prof_b };
446446
int i, j;
447447

448-
for (i = 0; i < ACPI_SAR_NUM_CHAINS; i++) {
448+
for (i = 0; i < ACPI_SAR_NUM_CHAINS_REV0; i++) {
449449
struct iwl_sar_profile *prof;
450450

451451
/* don't allow SAR to be disabled (profile 0 means disable) */
@@ -494,7 +494,7 @@ int iwl_sar_select_profile(struct iwl_fw_runtime *fwrt,
494494

495495
for (i = 0; i < n_tables; i++) {
496496
ret = iwl_sar_fill_table(fwrt,
497-
&per_chain[i * n_subbands * ACPI_SAR_NUM_CHAINS],
497+
&per_chain[i * n_subbands * ACPI_SAR_NUM_CHAINS_REV0],
498498
n_subbands, prof_a, prof_b);
499499
if (ret)
500500
break;
@@ -509,28 +509,71 @@ int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt)
509509
union acpi_object *wifi_pkg, *table, *data;
510510
bool enabled;
511511
int ret, tbl_rev;
512+
u8 num_chains, num_sub_bands;
512513

513514
data = iwl_acpi_get_object(fwrt->dev, ACPI_WRDS_METHOD);
514515
if (IS_ERR(data))
515516
return PTR_ERR(data);
516517

518+
/* start by trying to read revision 2 */
517519
wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
518-
ACPI_WRDS_WIFI_DATA_SIZE, &tbl_rev);
519-
if (IS_ERR(wifi_pkg)) {
520-
ret = PTR_ERR(wifi_pkg);
521-
goto out_free;
520+
ACPI_WRDS_WIFI_DATA_SIZE_REV2,
521+
&tbl_rev);
522+
if (!IS_ERR(wifi_pkg)) {
523+
if (tbl_rev != 2) {
524+
ret = PTR_ERR(wifi_pkg);
525+
goto out_free;
526+
}
527+
528+
num_chains = ACPI_SAR_NUM_CHAINS_REV2;
529+
num_sub_bands = ACPI_SAR_NUM_SUB_BANDS_REV2;
530+
531+
goto read_table;
522532
}
523533

524-
if (tbl_rev != 0) {
525-
ret = -EINVAL;
526-
goto out_free;
534+
/* then try revision 1 */
535+
wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
536+
ACPI_WRDS_WIFI_DATA_SIZE_REV1,
537+
&tbl_rev);
538+
if (!IS_ERR(wifi_pkg)) {
539+
if (tbl_rev != 1) {
540+
ret = PTR_ERR(wifi_pkg);
541+
goto out_free;
542+
}
543+
544+
num_chains = ACPI_SAR_NUM_CHAINS_REV1;
545+
num_sub_bands = ACPI_SAR_NUM_SUB_BANDS_REV1;
546+
547+
goto read_table;
527548
}
528549

550+
/* then finally revision 0 */
551+
wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
552+
ACPI_WRDS_WIFI_DATA_SIZE_REV0,
553+
&tbl_rev);
554+
if (!IS_ERR(wifi_pkg)) {
555+
if (tbl_rev != 0) {
556+
ret = PTR_ERR(wifi_pkg);
557+
goto out_free;
558+
}
559+
560+
num_chains = ACPI_SAR_NUM_CHAINS_REV0;
561+
num_sub_bands = ACPI_SAR_NUM_SUB_BANDS_REV0;
562+
563+
goto read_table;
564+
}
565+
566+
ret = PTR_ERR(wifi_pkg);
567+
goto out_free;
568+
569+
read_table:
529570
if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) {
530571
ret = -EINVAL;
531572
goto out_free;
532573
}
533574

575+
IWL_DEBUG_RADIO(fwrt, "Reading WRDS tbl_rev=%d\n", tbl_rev);
576+
534577
enabled = !!(wifi_pkg->package.elements[1].integer.value);
535578

536579
/* position of the actual table */
@@ -540,7 +583,7 @@ int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt)
540583
* into sar_profiles[0] (because we don't have a profile 0).
541584
*/
542585
ret = iwl_sar_set_profile(table, &fwrt->sar_profiles[0], enabled,
543-
ACPI_SAR_NUM_CHAINS, ACPI_SAR_NUM_SUB_BANDS);
586+
num_chains, num_sub_bands);
544587
out_free:
545588
kfree(data);
546589
return ret;
@@ -598,15 +641,14 @@ int iwl_sar_get_ewrd_table(struct iwl_fw_runtime *fwrt)
598641
* have profile 0). So in the array we start from 1.
599642
*/
600643
ret = iwl_sar_set_profile(&wifi_pkg->package.elements[pos],
601-
&fwrt->sar_profiles[i + 1],
602-
enabled,
603-
ACPI_SAR_NUM_CHAINS,
604-
ACPI_SAR_NUM_SUB_BANDS);
644+
&fwrt->sar_profiles[i + 1], enabled,
645+
ACPI_SAR_NUM_CHAINS_REV0,
646+
ACPI_SAR_NUM_SUB_BANDS_REV0);
605647
if (ret < 0)
606648
break;
607649

608650
/* go to the next table */
609-
pos += ACPI_SAR_NUM_CHAINS * ACPI_SAR_NUM_SUB_BANDS;
651+
pos += ACPI_SAR_NUM_CHAINS_REV0 * ACPI_SAR_NUM_SUB_BANDS_REV0;
610652
}
611653

612654
out_free:

drivers/net/wireless/intel/iwlwifi/fw/acpi.h

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,22 @@
3232
#define ACPI_NUM_GEO_PROFILES 3
3333
#define ACPI_GEO_PER_CHAIN_SIZE 3
3434

35-
#define ACPI_SAR_NUM_CHAINS 2
36-
#define ACPI_SAR_NUM_SUB_BANDS 5
37-
38-
#define ACPI_WRDS_WIFI_DATA_SIZE (ACPI_SAR_NUM_CHAINS * \
39-
ACPI_SAR_NUM_SUB_BANDS + 2)
35+
#define ACPI_SAR_NUM_CHAINS_REV0 2
36+
#define ACPI_SAR_NUM_CHAINS_REV1 2
37+
#define ACPI_SAR_NUM_CHAINS_REV2 4
38+
#define ACPI_SAR_NUM_SUB_BANDS_REV0 5
39+
#define ACPI_SAR_NUM_SUB_BANDS_REV1 11
40+
#define ACPI_SAR_NUM_SUB_BANDS_REV2 11
41+
42+
#define ACPI_WRDS_WIFI_DATA_SIZE_REV0 (ACPI_SAR_NUM_CHAINS_REV0 * \
43+
ACPI_SAR_NUM_SUB_BANDS_REV0 + 2)
44+
#define ACPI_WRDS_WIFI_DATA_SIZE_REV1 (ACPI_SAR_NUM_CHAINS_REV1 * \
45+
ACPI_SAR_NUM_SUB_BANDS_REV1 + 2)
46+
#define ACPI_WRDS_WIFI_DATA_SIZE_REV2 (ACPI_SAR_NUM_CHAINS_REV2 * \
47+
ACPI_SAR_NUM_SUB_BANDS_REV2 + 2)
4048
#define ACPI_EWRD_WIFI_DATA_SIZE ((ACPI_SAR_PROFILE_NUM - 1) * \
41-
ACPI_SAR_NUM_CHAINS * \
42-
ACPI_SAR_NUM_SUB_BANDS + 3)
49+
ACPI_SAR_NUM_CHAINS_REV0 * \
50+
ACPI_SAR_NUM_SUB_BANDS_REV0 + 3)
4351
#define ACPI_WGDS_WIFI_DATA_SIZE 19
4452
#define ACPI_WRDD_WIFI_DATA_SIZE 2
4553
#define ACPI_SPLC_WIFI_DATA_SIZE 2
@@ -64,13 +72,18 @@
6472
#define ACPI_PPAG_MIN_HB -16
6573
#define ACPI_PPAG_MAX_HB 40
6674

75+
/*
76+
* The profile for revision 2 is a superset of revision 1, which is in
77+
* turn a superset of revision 0. So we can store all revisions
78+
* inside revision 2, which is what we represent here.
79+
*/
6780
struct iwl_sar_profile_chain {
68-
u8 subbands[ACPI_SAR_NUM_SUB_BANDS];
81+
u8 subbands[ACPI_SAR_NUM_SUB_BANDS_REV2];
6982
};
7083

7184
struct iwl_sar_profile {
7285
bool enabled;
73-
struct iwl_sar_profile_chain chains[ACPI_SAR_NUM_CHAINS];
86+
struct iwl_sar_profile_chain chains[ACPI_SAR_NUM_CHAINS_REV2];
7487
};
7588

7689
struct iwl_geo_profile {

0 commit comments

Comments
 (0)