summaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mediatek
diff options
context:
space:
mode:
authorShayne Chen <shayne.chen@mediatek.com>2021-04-13 11:08:37 +0200
committerFelix Fietkau <nbd@nbd.name>2021-04-21 11:42:21 +0200
commita9627d992b5e3aa18315094b501eba0f4d883419 (patch)
treeb1d74da19137822eb5276a37dec2e3406f3db3a9 /drivers/net/wireless/mediatek
parent22b980badc0fc746431b81b9d402cf0612f59a7a (diff)
downloadlinux-stable-a9627d992b5e3aa18315094b501eba0f4d883419.tar.gz
linux-stable-a9627d992b5e3aa18315094b501eba0f4d883419.tar.bz2
linux-stable-a9627d992b5e3aa18315094b501eba0f4d883419.zip
mt76: extend DT rate power limits to support 11ax devices
Enable parsing per-rate txpower limits from DT for 11ax chipsets. Co-developed-by: Felix Fietkau <nbd@nbd.name> Signed-off-by: Felix Fietkau <nbd@nbd.name> Tested-by: Evelyn Tsai <evelyn.tsai@mediatek.com> Signed-off-by: Shayne Chen <shayne.chen@mediatek.com> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'drivers/net/wireless/mediatek')
-rw-r--r--drivers/net/wireless/mediatek/mt76/eeprom.c62
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt76.h1
2 files changed, 40 insertions, 23 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c
index 2dbc371654cd..6f75e949e4fd 100644
--- a/drivers/net/wireless/mediatek/mt76/eeprom.c
+++ b/drivers/net/wireless/mediatek/mt76/eeprom.c
@@ -221,6 +221,36 @@ mt76_apply_array_limit(s8 *pwr, size_t pwr_len, const __be32 *data,
}
}
+static void
+mt76_apply_multi_array_limit(s8 *pwr, size_t pwr_len, s8 pwr_num,
+ const __be32 *data, size_t len, s8 target_power,
+ s8 nss_delta, s8 *max_power)
+{
+ int i, cur;
+
+ if (!data)
+ return;
+
+ len /= 4;
+ cur = be32_to_cpu(data[0]);
+ for (i = 0; i < pwr_num; i++) {
+ if (len < pwr_len + 1)
+ break;
+
+ mt76_apply_array_limit(pwr + pwr_len * i, pwr_len, data + 1,
+ target_power, nss_delta, max_power);
+ if (--cur > 0)
+ continue;
+
+ data += pwr_len + 1;
+ len -= pwr_len + 1;
+ if (!len)
+ break;
+
+ cur = be32_to_cpu(data[0]);
+ }
+}
+
s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
struct ieee80211_channel *chan,
struct mt76_power_limits *dest,
@@ -231,9 +261,9 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
const __be32 *val;
char name[16];
u32 mcs_rates = dev->drv->mcs_rates;
+ u32 ru_rates = ARRAY_SIZE(dest->ru[0]);
char band;
size_t len;
- int i, cur;
s8 max_power = 0;
s8 txs_delta;
@@ -281,28 +311,14 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
target_power, txs_delta, &max_power);
val = mt76_get_of_array(np, "rates-mcs", &len, mcs_rates + 1);
- if (!val)
- return max_power;
-
- len /= 4;
- cur = be32_to_cpu(val[0]);
- for (i = 0; i < ARRAY_SIZE(dest->mcs); i++) {
- if (len < mcs_rates + 1)
- break;
-
- mt76_apply_array_limit(dest->mcs[i], ARRAY_SIZE(dest->mcs[i]),
- val + 1, target_power, txs_delta,
- &max_power);
- if (--cur > 0)
- continue;
-
- val += mcs_rates + 1;
- len -= mcs_rates + 1;
- if (!len)
- break;
-
- cur = be32_to_cpu(val[0]);
- }
+ mt76_apply_multi_array_limit(dest->mcs[0], ARRAY_SIZE(dest->mcs[0]),
+ ARRAY_SIZE(dest->mcs), val, len,
+ target_power, txs_delta, &max_power);
+
+ val = mt76_get_of_array(np, "rates-ru", &len, ru_rates + 1);
+ mt76_apply_multi_array_limit(dest->ru[0], ARRAY_SIZE(dest->ru[0]),
+ ARRAY_SIZE(dest->ru), val, len,
+ target_power, txs_delta, &max_power);
return max_power;
}
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 122a58c87f46..bf049fb4c412 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -716,6 +716,7 @@ struct mt76_power_limits {
s8 cck[4];
s8 ofdm[8];
s8 mcs[4][10];
+ s8 ru[7][12];
};
enum mt76_phy_type {