Message ID | 20231120032750.19747-2-mingyen.hsieh@mediatek.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Felix Fietkau |
Headers | show |
Series | wifi: mt76: mt7921: series with CLC patches | expand |
> 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> > --- > drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > 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; > + __le16 buf_len = 0; I think here should be: u16 buf_len; Regards, Lorenzo > + 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; > -- > 2.18.0 >
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; + __le16 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;