mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
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 <[email protected]> Tested-by: Evelyn Tsai <[email protected]> Signed-off-by: Shayne Chen <[email protected]> Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
committed by
Felix Fietkau
parent
769b030de6
commit
1d2aedb248
@@ -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;
|
||||
|
||||
@@ -280,28 +310,14 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
|
||||
target_power, txs_delta, &max_power);
|
||||
|
||||
val = mt76_get_of_array(np, "mcs", &len, mcs_rates + 1);
|
||||
if (!val)
|
||||
return max_power;
|
||||
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);
|
||||
|
||||
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, "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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user