mt76: mt7615: fix getting maximum tx power from eeprom
authorFelix Fietkau <nbd@nbd.name>
Wed, 29 Apr 2020 12:34:23 +0000 (14:34 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 12 May 2020 17:52:33 +0000 (19:52 +0200)
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: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h
drivers/net/wireless/mediatek/mt76/mt7615/init.c

index bd2ac1e0e01ad4b9ee8e25da2fa202d597be9c9f..3dd7009e5836c77707309e983a14851d9af3ee9e 100644 (file)
@@ -32,6 +32,8 @@ enum mt7615_eeprom_field {
        MT_EE_TX0_2G_TARGET_POWER =             0x058,
        MT_EE_TX0_5G_G0_TARGET_POWER =          0x070,
        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_5G_TARGET_POWER =          0x0f3,
        MT7663_EE_TX0_2G_TARGET_POWER =         0x123,
@@ -43,6 +45,10 @@ enum mt7615_eeprom_field {
        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_RX_CAL             BIT(1)
 
index 9880643888ba21b7e54da7fc02394ce0b868331a..7e201525305b08207aaa441a3e4be1d87b129517 100644 (file)
@@ -198,6 +198,17 @@ void mt7615_init_txpower(struct mt7615_dev *dev,
        u8 *eep = (u8 *)dev->mt76.eeprom.data;
        enum nl80211_band band = sband->band;
        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;
        for (i = 0; i < sband->n_channels; i++) {