]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: mt76: mt7921: fix country count limitation for CLC
authorMing Yen Hsieh <mingyen.hsieh@mediatek.com>
Wed, 22 Nov 2023 03:06:44 +0000 (11:06 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Jan 2024 23:44:51 +0000 (15:44 -0800)
[ Upstream commit fa6ad88e023ddfa6c5dcdb466d159e89f451e305 ]

Due to the increase in the number of power tables for 6Ghz on CLC,
the variable nr_country is no longer sufficient to represent the
total quantity. Therefore, we have switched to calculating the
length of clc buf to obtain the correct power table. Additionally,
the version number has been incremented to 1.

Fixes: 23bdc5d8cadf ("wifi: mt76: mt7921: introduce Country Location Control support")
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c

index 2cc2d2788f831257980e08cc475cdec0f6b3b4c6..399d7ca6bebcb6dea59bb02417eb5bb7d98e4b30 100644 (file)
@@ -1263,13 +1263,15 @@ int __mt7921_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2,
                u8 env_6g;
                u8 rsvd[63];
        } __packed req = {
+               .ver = 1,
                .idx = idx,
                .env = env_cap,
                .env_6g = dev->phy.power_type,
                .acpi_conf = mt792x_acpi_get_flags(&dev->phy),
        };
        int ret, valid_cnt = 0;
-       u8 i, *pos;
+       u16 buf_len = 0;
+       u8 *pos;
 
        if (!clc)
                return 0;
@@ -1279,12 +1281,15 @@ int __mt7921_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2,
        if (mt76_find_power_limits_node(&dev->mt76))
                req.cap |= CLC_CAP_DTS_EN;
 
+       buf_len = le16_to_cpu(clc->len) - sizeof(*clc);
        pos = clc->data;
-       for (i = 0; i < clc->nr_country; i++) {
+       while (buf_len > 16) {
                struct mt7921_clc_rule *rule = (struct mt7921_clc_rule *)pos;
                u16 len = le16_to_cpu(rule->len);
+               u16 offset = len + sizeof(*rule);
 
-               pos += len + sizeof(*rule);
+               pos += offset;
+               buf_len -= offset;
                if (rule->alpha2[0] != alpha2[0] ||
                    rule->alpha2[1] != alpha2[1])
                        continue;