Commit 89f8bc6a authored by Felix Fietkau's avatar Felix Fietkau

mt76: mt7615: fix getting maximum tx power from eeprom

On top of the EEPROM target power, each rate can also has a power offset.
On many devices, this power offset is used to boost the tx power of lower
rates. Take this into account when parsing rate power.
The assumption here is, that the first rate (OFDM 6M or CCK 1M) has the
highest tx power
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 801f809a
...@@ -32,6 +32,8 @@ enum mt7615_eeprom_field { ...@@ -32,6 +32,8 @@ enum mt7615_eeprom_field {
MT_EE_TX0_2G_TARGET_POWER = 0x058, MT_EE_TX0_2G_TARGET_POWER = 0x058,
MT_EE_TX0_5G_G0_TARGET_POWER = 0x070, MT_EE_TX0_5G_G0_TARGET_POWER = 0x070,
MT_EE_TX1_5G_G0_TARGET_POWER = 0x098, MT_EE_TX1_5G_G0_TARGET_POWER = 0x098,
MT_EE_2G_RATE_POWER = 0x0be,
MT_EE_5G_RATE_POWER = 0x0d5,
MT_EE_EXT_PA_2G_TARGET_POWER = 0x0f2, MT_EE_EXT_PA_2G_TARGET_POWER = 0x0f2,
MT_EE_EXT_PA_5G_TARGET_POWER = 0x0f3, MT_EE_EXT_PA_5G_TARGET_POWER = 0x0f3,
MT7663_EE_TX0_2G_TARGET_POWER = 0x123, MT7663_EE_TX0_2G_TARGET_POWER = 0x123,
...@@ -43,6 +45,10 @@ enum mt7615_eeprom_field { ...@@ -43,6 +45,10 @@ enum mt7615_eeprom_field {
MT7663_EE_MAX = 0x400, MT7663_EE_MAX = 0x400,
}; };
#define MT_EE_RATE_POWER_MASK GENMASK(5, 0)
#define MT_EE_RATE_POWER_SIGN BIT(6)
#define MT_EE_RATE_POWER_EN BIT(7)
#define MT_EE_CALDATA_FLASH_TX_DPD BIT(0) #define MT_EE_CALDATA_FLASH_TX_DPD BIT(0)
#define MT_EE_CALDATA_FLASH_RX_CAL BIT(1) #define MT_EE_CALDATA_FLASH_RX_CAL BIT(1)
......
...@@ -198,6 +198,17 @@ void mt7615_init_txpower(struct mt7615_dev *dev, ...@@ -198,6 +198,17 @@ void mt7615_init_txpower(struct mt7615_dev *dev,
u8 *eep = (u8 *)dev->mt76.eeprom.data; u8 *eep = (u8 *)dev->mt76.eeprom.data;
enum nl80211_band band = sband->band; enum nl80211_band band = sband->band;
int delta = mt76_tx_power_nss_delta(n_chains); int delta = mt76_tx_power_nss_delta(n_chains);
u8 rate_val;
/* assume the first rate has the highest power offset */
if (band == NL80211_BAND_2GHZ)
rate_val = eep[MT_EE_2G_RATE_POWER];
else
rate_val = eep[MT_EE_5G_RATE_POWER];
if ((rate_val & ~MT_EE_RATE_POWER_MASK) ==
(MT_EE_RATE_POWER_EN | MT_EE_RATE_POWER_SIGN))
delta += rate_val & MT_EE_RATE_POWER_MASK;
target_chains = mt7615_ext_pa_enabled(dev, band) ? 1 : n_chains; target_chains = mt7615_ext_pa_enabled(dev, band) ? 1 : n_chains;
for (i = 0; i < sband->n_channels; i++) { for (i = 0; i < sband->n_channels; i++) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment