Message ID | e05024275119c517a4eb7e39bf249640db68d07d.1628115504.git.objelf@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v2] mt76: connac: add support maximum regulatory Tx power | expand |
> From: YN Chen <YN.Chen@mediatek.com> > > Consider .max_reg_power in struct ieee80211_channel to limit the > maximum power the wireless device allowed to transmit on the > corresponding channel according to the regulatory domain. > > Co-developed-by: Sean Wang <sean.wang@mediatek.com> > Signed-off-by: Sean Wang <sean.wang@mediatek.com> > Signed-off-by: YN Chen <YN.Chen@mediatek.com> > --- > v2: consider the power limit that can be allowed on mt7663 > --- > .../wireless/mediatek/mt76/mt76_connac_mcu.c | 43 ++++++++++++++++++- > 1 file changed, 41 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c > index d71393b1c5e6..80987af03efe 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c > @@ -1773,6 +1773,43 @@ static s8 mt76_connac_get_sar_power(struct mt76_phy *phy, > return target_power; > } > > +static s8 mt76_connac_get_ch_power(struct mt76_phy *phy, > + struct ieee80211_channel *chan, > + s8 target_power) > +{ > + struct mt76_dev *dev = phy->dev; > + struct ieee80211_supported_band *sband; > + int i; > + > + switch (chan->band) { > + case NL80211_BAND_2GHZ: > + sband = &phy->sband_2g.sband; > + break; > + case NL80211_BAND_5GHZ: > + sband = &phy->sband_5g.sband; > + break; > + default: > + return target_power; > + } > + > + for (i = 0; i < sband->n_channels; i++) { > + struct ieee80211_channel *ch = &sband->channels[i]; > + > + if (ch->hw_value == chan->hw_value) { > + if (!(ch->flags & IEEE80211_CHAN_DISABLED)) { > + int power = 2 * ch->max_reg_power; > + > + if (is_mt7663(dev) && (power > 63 || power < -64)) > + power = 63; I guess now you are missing the value for mt7921. What I mean is something similar to mt76_connac_mcu_build_sku() int max_power = is_mt7921(dev) ? 127 : 63; Regards, Lorenzo > + target_power = min_t(s8, power, target_power); > + } > + break; > + } > + } > + > + return target_power; > +} > + > static int > mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy, > enum nl80211_band band) > @@ -1840,10 +1877,12 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy, > .hw_value = ch_list[idx], > .band = band, > }; > - s8 sar_power; > + s8 reg_power, sar_power; > > + reg_power = mt76_connac_get_ch_power(phy, &chan, > + tx_power); > sar_power = mt76_connac_get_sar_power(phy, &chan, > - tx_power); > + reg_power); > > mt76_get_rate_power_limits(phy, &chan, &limits, > sar_power); > -- > 2.25.1 >
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c index d71393b1c5e6..80987af03efe 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c @@ -1773,6 +1773,43 @@ static s8 mt76_connac_get_sar_power(struct mt76_phy *phy, return target_power; } +static s8 mt76_connac_get_ch_power(struct mt76_phy *phy, + struct ieee80211_channel *chan, + s8 target_power) +{ + struct mt76_dev *dev = phy->dev; + struct ieee80211_supported_band *sband; + int i; + + switch (chan->band) { + case NL80211_BAND_2GHZ: + sband = &phy->sband_2g.sband; + break; + case NL80211_BAND_5GHZ: + sband = &phy->sband_5g.sband; + break; + default: + return target_power; + } + + for (i = 0; i < sband->n_channels; i++) { + struct ieee80211_channel *ch = &sband->channels[i]; + + if (ch->hw_value == chan->hw_value) { + if (!(ch->flags & IEEE80211_CHAN_DISABLED)) { + int power = 2 * ch->max_reg_power; + + if (is_mt7663(dev) && (power > 63 || power < -64)) + power = 63; + target_power = min_t(s8, power, target_power); + } + break; + } + } + + return target_power; +} + static int mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy, enum nl80211_band band) @@ -1840,10 +1877,12 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy, .hw_value = ch_list[idx], .band = band, }; - s8 sar_power; + s8 reg_power, sar_power; + reg_power = mt76_connac_get_ch_power(phy, &chan, + tx_power); sar_power = mt76_connac_get_sar_power(phy, &chan, - tx_power); + reg_power); mt76_get_rate_power_limits(phy, &chan, &limits, sar_power);