wifi: mt76: mt792x: fix a potential loading failure of the 6Ghz channel config from...
authorMing Yen Hsieh <mingyen.hsieh@mediatek.com>
Tue, 16 Jan 2024 02:48:55 +0000 (10:48 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 22 Feb 2024 08:55:19 +0000 (09:55 +0100)
In some case, the MTCL table will exist, but MTDS table will not.
So the SAR will init fail. This patch make MTCL and MTDS can exist
with no dependence.

Fixes: f965333e491e ("mt76: mt7921: introduce ACPI SAR support")
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Signed-off-by: Leon Yen <leon.yen@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt792x_acpi_sar.c

index c64562216caa20f86ebcf83f3a62cf22f618a34e..e1d946fb239934b84ba7b3117275073484360793 100644 (file)
@@ -66,13 +66,15 @@ free:
 }
 
 /* MTCL : Country List Table for 6G band */
-static void
+static int
 mt792x_asar_acpi_read_mtcl(struct mt792x_dev *dev, u8 **table, u8 *version)
 {
-       if (mt792x_acpi_read(dev, MT792x_ACPI_MTCL, table, NULL) < 0)
-               *version = 1;
-       else
-               *version = 2;
+       int ret;
+
+       *version = ((ret = mt792x_acpi_read(dev, MT792x_ACPI_MTCL, table, NULL)) < 0)
+                  ? 1 : 2;
+
+       return ret;
 }
 
 /* MTDS : Dynamic SAR Power Table */
@@ -166,16 +168,16 @@ int mt792x_init_acpi_sar(struct mt792x_dev *dev)
        if (!asar)
                return -ENOMEM;
 
-       mt792x_asar_acpi_read_mtcl(dev, (u8 **)&asar->countrylist, &asar->ver);
+       ret = mt792x_asar_acpi_read_mtcl(dev, (u8 **)&asar->countrylist, &asar->ver);
+       if (ret) {
+               devm_kfree(dev->mt76.dev, asar->countrylist);
+               asar->countrylist = NULL;
+       }
 
-       /* MTDS is mandatory. Return error if table is invalid */
        ret = mt792x_asar_acpi_read_mtds(dev, (u8 **)&asar->dyn, asar->ver);
        if (ret) {
                devm_kfree(dev->mt76.dev, asar->dyn);
-               devm_kfree(dev->mt76.dev, asar->countrylist);
-               devm_kfree(dev->mt76.dev, asar);
-
-               return ret;
+               asar->dyn = NULL;
        }
 
        /* MTGS is optional */
@@ -290,7 +292,7 @@ int mt792x_init_acpi_sar_power(struct mt792x_phy *phy, bool set_default)
        const struct cfg80211_sar_capa *capa = phy->mt76->hw->wiphy->sar_capa;
        int i;
 
-       if (!phy->acpisar)
+       if (!phy->acpisar || !((struct mt792x_acpi_sar *)phy->acpisar)->dyn)
                return 0;
 
        /* When ACPI SAR enabled in HW, we should apply rules for .frp