Message ID | 20231120111212.4478-2-mingyen.hsieh@mediatek.com |
---|---|
State | New |
Headers | show |
Series | wifi: mt76: mt7921: series with CLC patches | expand |
Mingyen Hsieh <mingyen.hsieh@mediatek.com> writes: > From: Ming Yen Hsieh <mingyen.hsieh@mediatek.com> > > Due to the increase in the number of power tables 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> > > v2: > - Convert type of buf_len from "__le16" to "u16" > > --- > drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) The changelog ('v2:....') should be after '---' line.
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c index 753a4fc45c70..e4edea1ab3dd 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c @@ -1264,6 +1264,7 @@ int __mt7921_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2, u8 mtcl_conf; u8 rsvd[62]; } __packed req = { + .ver = 1, .idx = idx, .env = env_cap, .env_6g = dev->phy.power_type, @@ -1271,7 +1272,8 @@ int __mt7921_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2, .mtcl_conf = mt792x_acpi_get_mtcl_conf(&dev->phy, alpha2), }; int ret, valid_cnt = 0; - u8 i, *pos; + u16 buf_len = 0; + u8 *pos; if (!clc) return 0; @@ -1281,12 +1283,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;