Blob Blame History Raw
From 89f8bc6a344b2b786210a4045256346b3f8f6c4c Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@nbd.name>
Date: Wed, 29 Apr 2020 14:34:23 +0200
Subject: [PATCH] mt76: mt7615: fix getting maximum tx power from eeprom
Git-commit: 89f8bc6a344b2b786210a4045256346b3f8f6c4c
Patch-mainline: v5.8-rc1
References: jsc#SLE-13430

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>
Acked-by: Takashi Iwai <tiwai@suse.de>

---
 drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h |  6 ++++++
 drivers/net/wireless/mediatek/mt76/mt7615/init.c   | 11 +++++++++++
 2 files changed, 17 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h b/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h
index bd2ac1e0e01a..3dd7009e5836 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h
@@ -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)
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
index 9880643888ba..7e201525305b 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
@@ -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++) {
-- 
2.16.4