Commit a9627d99 authored by Shayne Chen's avatar Shayne Chen Committed by Felix Fietkau

mt76: extend DT rate power limits to support 11ax devices

Enable parsing per-rate txpower limits from DT for 11ax chipsets.
Co-developed-by: default avatarFelix Fietkau <nbd@nbd.name>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
Tested-by: default avatarEvelyn Tsai <evelyn.tsai@mediatek.com>
Signed-off-by: default avatarShayne Chen <shayne.chen@mediatek.com>
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 22b980ba
...@@ -221,6 +221,36 @@ mt76_apply_array_limit(s8 *pwr, size_t pwr_len, const __be32 *data, ...@@ -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, s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
struct ieee80211_channel *chan, struct ieee80211_channel *chan,
struct mt76_power_limits *dest, struct mt76_power_limits *dest,
...@@ -231,9 +261,9 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy, ...@@ -231,9 +261,9 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
const __be32 *val; const __be32 *val;
char name[16]; char name[16];
u32 mcs_rates = dev->drv->mcs_rates; u32 mcs_rates = dev->drv->mcs_rates;
u32 ru_rates = ARRAY_SIZE(dest->ru[0]);
char band; char band;
size_t len; size_t len;
int i, cur;
s8 max_power = 0; s8 max_power = 0;
s8 txs_delta; s8 txs_delta;
...@@ -281,28 +311,14 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy, ...@@ -281,28 +311,14 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
target_power, txs_delta, &max_power); target_power, txs_delta, &max_power);
val = mt76_get_of_array(np, "rates-mcs", &len, mcs_rates + 1); val = mt76_get_of_array(np, "rates-mcs", &len, mcs_rates + 1);
if (!val) mt76_apply_multi_array_limit(dest->mcs[0], ARRAY_SIZE(dest->mcs[0]),
return max_power; ARRAY_SIZE(dest->mcs), val, len,
target_power, txs_delta, &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]); 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; return max_power;
} }
......
...@@ -716,6 +716,7 @@ struct mt76_power_limits { ...@@ -716,6 +716,7 @@ struct mt76_power_limits {
s8 cck[4]; s8 cck[4];
s8 ofdm[8]; s8 ofdm[8];
s8 mcs[4][10]; s8 mcs[4][10];
s8 ru[7][12];
}; };
enum mt76_phy_type { enum mt76_phy_type {
......
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