Message ID | ade300b855949dcbe0a278e363415bd56b2e1299.1560234877.git.lorenzo@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Felix Fietkau |
Headers | show |
Series | take into account external PA when configuring tx power | expand |
On Tuesday, 11 June 2019 08:38:52 CEST Lorenzo Bianconi wrote: > + switch (n_chains) { > + case 4: > + target_power += 6; > + break; > + case 3: > + target_power += 4; > + break; > + case 2: > + target_power += 3; > + break; > + default: > + break; > + } Any reason why you use different value for 3 chains than ath9k? Following values are used in ath9k: * 1 chain: 0 dB * 2 chains: 3 dB (max combined gain ~3.010299956639812 dB) * 3 chains: 5 dB (max combined gain ~4.771212547196624 dB) * 4 chains: not supported (max combined gain 6.020599913279624 dB) Here are the definitions from ath9k (values are saved in .5 dB steps) drivers/net/wireless/ath/ath9k/eeprom.h:#define POWER_CORRECTION_FOR_TWO_CHAIN 6 /* 10*log10(2)*2 */ drivers/net/wireless/ath/ath9k/eeprom.h:#define POWER_CORRECTION_FOR_THREE_CHAIN 10 /* 10*log10(3)*2 */ Kind regards, Sven
> On Tuesday, 11 June 2019 08:38:52 CEST Lorenzo Bianconi wrote: > > + switch (n_chains) { > > + case 4: > > + target_power += 6; > > + break; > > + case 3: > > + target_power += 4; > > + break; > > + case 2: > > + target_power += 3; > > + break; > > + default: > > + break; > > + } > > Any reason why you use different value for 3 chains than ath9k? Following > values are used in ath9k: > > * 1 chain: 0 dB > * 2 chains: 3 dB (max combined gain ~3.010299956639812 dB) > * 3 chains: 5 dB (max combined gain ~4.771212547196624 dB) Hi Sven, I just rounded down the values, but we can use 5db (in this case we need to fix it even in mt76_get_power(), so I will do it in a different patch) Regards, Lorenzo > * 4 chains: not supported (max combined gain 6.020599913279624 dB) > > Here are the definitions from ath9k (values are saved in .5 dB steps) > > drivers/net/wireless/ath/ath9k/eeprom.h:#define POWER_CORRECTION_FOR_TWO_CHAIN 6 /* 10*log10(2)*2 */ > drivers/net/wireless/ath/ath9k/eeprom.h:#define POWER_CORRECTION_FOR_THREE_CHAIN 10 /* 10*log10(3)*2 */ > > Kind regards, > Sven
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c index 693e597a3230..3f826e4f1cd6 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c @@ -165,6 +165,46 @@ static int mt7615_init_debugfs(struct mt7615_dev *dev) return 0; } +static void +mt7615_init_txpower(struct mt7615_dev *dev, + struct ieee80211_supported_band *sband) +{ + int i, n_chains = hweight8(dev->mt76.antenna_mask); + u8 *eep = (u8 *)dev->mt76.eeprom.data; + + for (i = 0; i < sband->n_channels; i++) { + struct ieee80211_channel *chan = &sband->channels[i]; + u8 target_power = 0; + int j; + + for (j = 0; j < n_chains; j++) { + int index; + + index = mt7615_eeprom_get_power_index(chan, j); + target_power = max(target_power, eep[index]); + } + + target_power = DIV_ROUND_UP(target_power, 2); + switch (n_chains) { + case 4: + target_power += 6; + break; + case 3: + target_power += 4; + break; + case 2: + target_power += 3; + break; + default: + break; + } + + chan->max_power = min_t(int, chan->max_reg_power, + target_power); + chan->orig_mpwr = target_power; + } +} + int mt7615_register_device(struct mt7615_dev *dev) { struct ieee80211_hw *hw = mt76_hw(dev); @@ -212,6 +252,9 @@ int mt7615_register_device(struct mt7615_dev *dev) if (ret) return ret; + mt7615_init_txpower(dev, &dev->mt76.sband_2g.sband); + mt7615_init_txpower(dev, &dev->mt76.sband_5g.sband); + hw->max_tx_fragments = MT_TXP_MAX_BUF_NUM; return mt7615_init_debugfs(dev);
Set per-channel target power as the minimum between the regulatory tx power and the value configured in the eeprom Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> --- .../net/wireless/mediatek/mt76/mt7615/init.c | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+)