* [PATCH v2 1/4] dt-bindings: net: wireless: mt76: add power-limits node
@ 2020-06-16 19:25 Felix Fietkau
2020-06-16 19:25 ` [PATCH v2 2/4] mt76: add functions for parsing rate power limits from DT Felix Fietkau
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Felix Fietkau @ 2020-06-16 19:25 UTC (permalink / raw)
To: linux-wireless; +Cc: shayne.chen, evelyn.tsai, devicetree
This subnode can be used to set per-rate tx power limits either per
country code / regdomain or globally.
These limits are typically provided by the device manufacturers and are
used to limit sideband emissions and stay within regulatory limits
Co-developed-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
v2:
- merge 802.11ax rate changes from Shayne's patch
- document txs-delta property
.../bindings/net/wireless/mediatek,mt76.txt | 59 +++++++++++++++++++
1 file changed, 59 insertions(+)
diff --git a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt
index ab7e7a00e534..e4859c974ef4 100644
--- a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt
+++ b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt
@@ -36,6 +36,7 @@ Optional nodes:
- led: Properties for a connected LED
Optional properties:
- led-sources: See Documentation/devicetree/bindings/leds/common.txt
+- power-limits: contains per-regdomain/channel rate power limit subnodes
&pcie {
pcie0 {
@@ -76,3 +77,61 @@ wmac: wmac@18000000 {
power-domains = <&scpsys MT7622_POWER_DOMAIN_WB>;
};
+
+
+Subnodes of power-limits:
+
+Properties:
+- country: One or more country codes, as used by the cfg80211 regdomain code
+- regdomain: "FCC", "ETSI" or "JP"
+
+If neither country, nor regdomain is specified, the power limits node is used
+as a fallback when no other subnode matches.
+
+Subnodes txpower-2g, txpower-5g:
+
+Properties:
+- channels: pairs of first and last channel number
+- cck: 4 half-dBm per-rate power limit values
+- ofdm: 8 half-dBm per-rate power limit values
+- mcs:
+ sets of per-rate power limit values for 802.11n/802.11ac rates for
+ multiple channel bandwidth settings.
+ Each set starts with the number of channel bandwidth settings for
+ which the rate set applies, followed by either 8 (MT7603/MT7628) or
+ 10 (all other chips) power limit values.
+ The order of the channel bandwidth settings is: 20, 40, 80, 160 MHz.
+- ru:
+ sets of per-rate power limit values for 802.11ax rates for multiple
+ channel bandwidth or resource unit settings.
+ Each set starts with the number of channel bandwidth or resource unit
+ settings for which the rate set applies, followed by 12 power limit
+ values. The order of the channel resource unit settings is:
+ RU26, RU52, RU106, RU242/SU20, RU484/SU40, RU996/SU80, RU2x996/SU160.
+- txs-delta: half-dBm power delta for different numbers of antennas (1, 2, ...)
+
+
+power-limit example:
+
+power-limits {
+ r0 {
+ regdomain = "FCC";
+ txpower-5g {
+ r1 {
+ channels = <36 48>;
+ ofdm = <23 23 23 23 23 23 23 23>;
+ mcs = <1 23 23 23 23 23 23 23 23 23 23>,
+ <3 22 22 22 22 22 22 22 22 22 22>;
+ ru = <3 22 22 22 22 22 22 22 22 22 22 22 22>,
+ <4 20 20 20 20 20 20 20 20 20 20 20 20>;
+ };
+ r2 {
+ channels = <100 181>;
+ ofdm = <14 14 14 14 14 14 14 14>;
+ mcs = <4 14 14 14 14 14 14 14 14 14 14>;
+ txs-delta = <12 9 6>;
+ ru = <7 14 14 14 14 14 14 14 14 14 14 14 14>;
+ };
+ };
+ };
+};
--
2.24.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/4] mt76: add functions for parsing rate power limits from DT
2020-06-16 19:25 [PATCH v2 1/4] dt-bindings: net: wireless: mt76: add power-limits node Felix Fietkau
@ 2020-06-16 19:25 ` Felix Fietkau
2020-06-16 19:25 ` [PATCH v2 3/4] mt76: extend DT rate power limits to support 11ax devices Felix Fietkau
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Felix Fietkau @ 2020-06-16 19:25 UTC (permalink / raw)
To: linux-wireless; +Cc: shayne.chen, evelyn.tsai
This subnode can be used to set per-rate tx power limits either per
country code / regdomain or globally.
These limits are typically provided by the device manufacturers and are
used to limit sideband emissions and stay within regulatory limits
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
v2: fix txs-delta and make it more generic
drivers/net/wireless/mediatek/mt76/eeprom.c | 203 ++++++++++++++++++++
drivers/net/wireless/mediatek/mt76/mt76.h | 13 ++
2 files changed, 216 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c
index c236e303ccfd..7deb3c90c113 100644
--- a/drivers/net/wireless/mediatek/mt76/eeprom.c
+++ b/drivers/net/wireless/mediatek/mt76/eeprom.c
@@ -104,6 +104,209 @@ mt76_eeprom_override(struct mt76_dev *dev)
}
EXPORT_SYMBOL_GPL(mt76_eeprom_override);
+static bool mt76_string_prop_find(struct property *prop, const char *str)
+{
+ const char *cp = NULL;
+
+ if (!prop || !str || !str[0])
+ return false;
+
+ while ((cp = of_prop_next_string(prop, cp)) != NULL)
+ if (!strcasecmp(cp, str))
+ return true;
+
+ return false;
+}
+
+static struct device_node *
+mt76_find_power_limits_node(struct mt76_dev *dev)
+{
+ struct device_node *np = dev->dev->of_node;
+ const char *const region_names[] = {
+ [NL80211_DFS_ETSI] = "etsi",
+ [NL80211_DFS_FCC] = "fcc",
+ [NL80211_DFS_JP] = "jp",
+ };
+ struct device_node *cur, *fallback = NULL;
+ const char *region_name = NULL;
+
+ if (dev->region < ARRAY_SIZE(region_names))
+ region_name = region_names[dev->region];
+
+ np = of_get_child_by_name(np, "power-limits");
+ if (!np)
+ return NULL;
+
+ for_each_child_of_node(np, cur) {
+ struct property *country = of_find_property(cur, "country", NULL);
+ struct property *regd = of_find_property(cur, "regdomain", NULL);
+
+ if (!country && !regd) {
+ fallback = cur;
+ continue;
+ }
+
+ if (mt76_string_prop_find(country, dev->alpha2) ||
+ mt76_string_prop_find(regd, region_name))
+ return cur;
+ }
+
+ return fallback;
+}
+
+static const __be32 *
+mt76_get_of_array(struct device_node *np, char *name, size_t *len, int min)
+{
+ struct property *prop = of_find_property(np, name, NULL);
+
+ if (!prop || !prop->value || prop->length < min * 4)
+ return NULL;
+
+ *len = prop->length;
+
+ return prop->value;
+}
+
+static struct device_node *
+mt76_find_channel_node(struct device_node *np, struct ieee80211_channel *chan)
+{
+ struct device_node *cur;
+ const __be32 *val;
+ size_t len;
+
+ for_each_child_of_node(np, cur) {
+ val = mt76_get_of_array(cur, "channels", &len, 2);
+ if (!val)
+ continue;
+
+ while (len >= 2 * sizeof(*val)) {
+ if (chan->hw_value >= be32_to_cpu(val[0]) &&
+ chan->hw_value <= be32_to_cpu(val[1]))
+ return cur;
+
+ val += 2;
+ len -= 2 * sizeof(*val);
+ }
+ }
+
+ return NULL;
+}
+
+static s8
+mt76_get_txs_delta(struct device_node *np, u8 nss)
+{
+ const __be32 *val;
+ size_t len;
+
+ val = mt76_get_of_array(np, "txs-delta", &len, nss);
+ if (!val)
+ return 0;
+
+ return be32_to_cpu(val[nss - 1]);
+}
+
+static void
+mt76_apply_array_limit(s8 *pwr, size_t pwr_len, const __be32 *data,
+ s8 target_power, s8 nss_delta, s8 *max_power)
+{
+ int i;
+
+ if (!data)
+ return;
+
+ for (i = 0; i < pwr_len; i++) {
+ pwr[i] = min_t(s8, target_power,
+ be32_to_cpu(data[i]) + nss_delta);
+ *max_power = max(*max_power, pwr[i]);
+ }
+}
+
+s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
+ struct ieee80211_channel *chan,
+ struct mt76_power_limits *dest,
+ s8 target_power)
+{
+ struct mt76_dev *dev = phy->dev;
+ struct device_node *np;
+ const __be32 *val;
+ char name[16];
+ u32 mcs_rates = dev->drv->mcs_rates;
+ char band;
+ size_t len;
+ int i, cur;
+ s8 max_power = 0;
+ s8 txs_delta;
+
+ if (!mcs_rates)
+ mcs_rates = 10;
+
+ memset(dest, target_power, sizeof(*dest));
+
+ if (!IS_ENABLED(CONFIG_OF))
+ return target_power;
+
+ np = mt76_find_power_limits_node(dev);
+ if (!np)
+ return target_power;
+
+ switch (chan->band) {
+ case NL80211_BAND_2GHZ:
+ band = '2';
+ break;
+ case NL80211_BAND_5GHZ:
+ band = '5';
+ break;
+ default:
+ return target_power;
+ }
+
+ snprintf(name, sizeof(name), "txpower-%cg", band);
+ np = of_get_child_by_name(np, name);
+ if (!np)
+ return target_power;
+
+ np = mt76_find_channel_node(np, chan);
+ if (!np)
+ return target_power;
+
+ txs_delta = mt76_get_txs_delta(np, hweight8(phy->antenna_mask));
+
+ val = mt76_get_of_array(np, "cck", &len, ARRAY_SIZE(dest->cck));
+ mt76_apply_array_limit(dest->cck, ARRAY_SIZE(dest->cck), val,
+ target_power, txs_delta, &max_power);
+
+ val = mt76_get_of_array(np, "ofdm", &len, ARRAY_SIZE(dest->ofdm));
+ mt76_apply_array_limit(dest->ofdm, ARRAY_SIZE(dest->ofdm), val,
+ target_power, txs_delta, &max_power);
+
+ val = mt76_get_of_array(np, "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]);
+ }
+
+ return max_power;
+}
+EXPORT_SYMBOL_GPL(mt76_get_rate_power_limits);
+
int
mt76_eeprom_init(struct mt76_dev *dev, int len)
{
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 3d7db6ffb599..9c5488ffbe5e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -307,6 +307,7 @@ struct mt76_driver_ops {
u32 drv_flags;
u32 survey_flags;
u16 txwi_size;
+ u8 mcs_rates;
void (*update_survey)(struct mt76_dev *dev);
@@ -559,6 +560,7 @@ struct mt76_dev {
struct mt76_rate_power rate_power;
+ char alpha2[3];
enum nl80211_dfs_regions region;
u32 debugfs_reg;
@@ -578,6 +580,12 @@ struct mt76_dev {
};
};
+struct mt76_power_limits {
+ s8 cck[4];
+ s8 ofdm[8];
+ s8 mcs[4][10];
+};
+
enum mt76_phy_type {
MT_PHY_TYPE_CCK,
MT_PHY_TYPE_OFDM,
@@ -960,4 +968,9 @@ struct sk_buff *mt76_mcu_get_response(struct mt76_dev *dev,
void mt76_set_irq_mask(struct mt76_dev *dev, u32 addr, u32 clear, u32 set);
+s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
+ struct ieee80211_channel *chan,
+ struct mt76_power_limits *dest,
+ s8 target_power);
+
#endif
--
2.24.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 3/4] mt76: extend DT rate power limits to support 11ax devices
2020-06-16 19:25 [PATCH v2 1/4] dt-bindings: net: wireless: mt76: add power-limits node Felix Fietkau
2020-06-16 19:25 ` [PATCH v2 2/4] mt76: add functions for parsing rate power limits from DT Felix Fietkau
@ 2020-06-16 19:25 ` Felix Fietkau
2020-06-16 19:25 ` [PATCH v2 4/4] mt76: mt7615: implement support for using DT rate power limits Felix Fietkau
2020-06-23 9:11 ` [PATCH v2 1/4] dt-bindings: net: wireless: mt76: add power-limits node Kalle Valo
3 siblings, 0 replies; 5+ messages in thread
From: Felix Fietkau @ 2020-06-16 19:25 UTC (permalink / raw)
To: linux-wireless; +Cc: shayne.chen, evelyn.tsai
From: Shayne Chen <shayne.chen@mediatek.com>
Enable parsing per-rate txpower limits from DT for 11ax chipsets.
Co-developed-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: Felix Fietkau <nbd@nbd.name>
---
v2: clean up rate array handling, simplify
drivers/net/wireless/mediatek/mt76/eeprom.c | 62 +++++++++++++--------
drivers/net/wireless/mediatek/mt76/mt76.h | 1 +
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 7deb3c90c113..17a1a3ccc9dd 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;
@@ -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;
-
- 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, "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 9c5488ffbe5e..d50871653de1 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -584,6 +584,7 @@ struct mt76_power_limits {
s8 cck[4];
s8 ofdm[8];
s8 mcs[4][10];
+ s8 ru[7][12];
};
enum mt76_phy_type {
--
2.24.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 4/4] mt76: mt7615: implement support for using DT rate power limits
2020-06-16 19:25 [PATCH v2 1/4] dt-bindings: net: wireless: mt76: add power-limits node Felix Fietkau
2020-06-16 19:25 ` [PATCH v2 2/4] mt76: add functions for parsing rate power limits from DT Felix Fietkau
2020-06-16 19:25 ` [PATCH v2 3/4] mt76: extend DT rate power limits to support 11ax devices Felix Fietkau
@ 2020-06-16 19:25 ` Felix Fietkau
2020-06-23 9:11 ` [PATCH v2 1/4] dt-bindings: net: wireless: mt76: add power-limits node Kalle Valo
3 siblings, 0 replies; 5+ messages in thread
From: Felix Fietkau @ 2020-06-16 19:25 UTC (permalink / raw)
To: linux-wireless; +Cc: shayne.chen, evelyn.tsai
Limits are used to update the channel max_power settings and also passed
to the firmware on channel changes
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
v2: fix nss delta calculation for channel max_power
.../net/wireless/mediatek/mt76/mt7615/init.c | 11 +++-
.../net/wireless/mediatek/mt76/mt7615/mcu.c | 61 ++++++++++++++++++-
2 files changed, 70 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
index e2d80518e5af..b04fe7301d4a 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
@@ -234,6 +234,7 @@ void mt7615_init_txpower(struct mt7615_dev *dev,
int delta_idx, delta = mt76_tx_power_nss_delta(n_chains);
u8 *eep = (u8 *)dev->mt76.eeprom.data;
enum nl80211_band band = sband->band;
+ struct mt76_power_limits limits;
u8 rate_val;
delta_idx = mt7615_eeprom_get_power_delta_index(dev, band);
@@ -262,7 +263,11 @@ void mt7615_init_txpower(struct mt7615_dev *dev,
target_power = max(target_power, eep[index]);
}
- target_power = DIV_ROUND_UP(target_power + delta, 2);
+ target_power = mt76_get_rate_power_limits(&dev->mphy, chan,
+ &limits,
+ target_power);
+ target_power += delta;
+ target_power = DIV_ROUND_UP(target_power, 2);
chan->max_power = min_t(int, chan->max_reg_power,
target_power);
chan->orig_mpwr = target_power;
@@ -280,8 +285,12 @@ mt7615_regd_notifier(struct wiphy *wiphy,
struct mt7615_phy *phy = mphy->priv;
struct cfg80211_chan_def *chandef = &mphy->chandef;
+ memcpy(dev->mt76.alpha2, request->alpha2, sizeof(dev->mt76.alpha2));
dev->mt76.region = request->dfs_region;
+ mt7615_init_txpower(dev, &mphy->sband_2g.sband);
+ mt7615_init_txpower(dev, &mphy->sband_5g.sband);
+
if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR))
return;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
index d3a8ada3b779..ed79ca911927 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
@@ -2696,16 +2696,75 @@ static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
{
struct mt76_phy *mphy = phy->mt76;
struct ieee80211_hw *hw = mphy->hw;
+ struct mt76_power_limits limits;
+ s8 *limits_array = (s8 *)&limits;
int n_chains = hweight8(mphy->antenna_mask);
int tx_power;
int i;
+ static const u8 sku_mapping[] = {
+#define SKU_FIELD(_type, _field) \
+ [MT_SKU_##_type] = offsetof(struct mt76_power_limits, _field)
+ SKU_FIELD(CCK_1_2, cck[0]),
+ SKU_FIELD(CCK_55_11, cck[2]),
+ SKU_FIELD(OFDM_6_9, ofdm[0]),
+ SKU_FIELD(OFDM_12_18, ofdm[2]),
+ SKU_FIELD(OFDM_24_36, ofdm[4]),
+ SKU_FIELD(OFDM_48, ofdm[6]),
+ SKU_FIELD(OFDM_54, ofdm[7]),
+ SKU_FIELD(HT20_0_8, mcs[0][0]),
+ SKU_FIELD(HT20_32, ofdm[0]),
+ SKU_FIELD(HT20_1_2_9_10, mcs[0][1]),
+ SKU_FIELD(HT20_3_4_11_12, mcs[0][3]),
+ SKU_FIELD(HT20_5_13, mcs[0][5]),
+ SKU_FIELD(HT20_6_14, mcs[0][6]),
+ SKU_FIELD(HT20_7_15, mcs[0][7]),
+ SKU_FIELD(HT40_0_8, mcs[1][0]),
+ SKU_FIELD(HT40_32, ofdm[0]),
+ SKU_FIELD(HT40_1_2_9_10, mcs[1][1]),
+ SKU_FIELD(HT40_3_4_11_12, mcs[1][3]),
+ SKU_FIELD(HT40_5_13, mcs[1][5]),
+ SKU_FIELD(HT40_6_14, mcs[1][6]),
+ SKU_FIELD(HT40_7_15, mcs[1][7]),
+ SKU_FIELD(VHT20_0, mcs[0][0]),
+ SKU_FIELD(VHT20_1_2, mcs[0][1]),
+ SKU_FIELD(VHT20_3_4, mcs[0][3]),
+ SKU_FIELD(VHT20_5_6, mcs[0][5]),
+ SKU_FIELD(VHT20_7, mcs[0][7]),
+ SKU_FIELD(VHT20_8, mcs[0][8]),
+ SKU_FIELD(VHT20_9, mcs[0][9]),
+ SKU_FIELD(VHT40_0, mcs[1][0]),
+ SKU_FIELD(VHT40_1_2, mcs[1][1]),
+ SKU_FIELD(VHT40_3_4, mcs[1][3]),
+ SKU_FIELD(VHT40_5_6, mcs[1][5]),
+ SKU_FIELD(VHT40_7, mcs[1][7]),
+ SKU_FIELD(VHT40_8, mcs[1][8]),
+ SKU_FIELD(VHT40_9, mcs[1][9]),
+ SKU_FIELD(VHT80_0, mcs[2][0]),
+ SKU_FIELD(VHT80_1_2, mcs[2][1]),
+ SKU_FIELD(VHT80_3_4, mcs[2][3]),
+ SKU_FIELD(VHT80_5_6, mcs[2][5]),
+ SKU_FIELD(VHT80_7, mcs[2][7]),
+ SKU_FIELD(VHT80_8, mcs[2][8]),
+ SKU_FIELD(VHT80_9, mcs[2][9]),
+ SKU_FIELD(VHT160_0, mcs[3][0]),
+ SKU_FIELD(VHT160_1_2, mcs[3][1]),
+ SKU_FIELD(VHT160_3_4, mcs[3][3]),
+ SKU_FIELD(VHT160_5_6, mcs[3][5]),
+ SKU_FIELD(VHT160_7, mcs[3][7]),
+ SKU_FIELD(VHT160_8, mcs[3][8]),
+ SKU_FIELD(VHT160_9, mcs[3][9]),
+#undef SKU_FIELD
+ };
tx_power = hw->conf.power_level * 2 -
mt76_tx_power_nss_delta(n_chains);
+
+ tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
+ &limits, tx_power);
mphy->txpower_cur = tx_power;
for (i = 0; i < MT_SKU_1SS_DELTA; i++)
- sku[i] = tx_power;
+ sku[i] = limits_array[sku_mapping[i]];
for (i = 0; i < 4; i++) {
int delta = 0;
--
2.24.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/4] dt-bindings: net: wireless: mt76: add power-limits node
2020-06-16 19:25 [PATCH v2 1/4] dt-bindings: net: wireless: mt76: add power-limits node Felix Fietkau
` (2 preceding siblings ...)
2020-06-16 19:25 ` [PATCH v2 4/4] mt76: mt7615: implement support for using DT rate power limits Felix Fietkau
@ 2020-06-23 9:11 ` Kalle Valo
3 siblings, 0 replies; 5+ messages in thread
From: Kalle Valo @ 2020-06-23 9:11 UTC (permalink / raw)
To: Felix Fietkau; +Cc: linux-wireless, shayne.chen, evelyn.tsai, devicetree
Felix Fietkau <nbd@nbd.name> writes:
> This subnode can be used to set per-rate tx power limits either per
> country code / regdomain or globally.
> These limits are typically provided by the device manufacturers and are
> used to limit sideband emissions and stay within regulatory limits
>
> Co-developed-by: Shayne Chen <shayne.chen@mediatek.com>
> Signed-off-by: Felix Fietkau <nbd@nbd.name>
> Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
I think Shayne's s-o-b should follow the Co-developed-by line.
--
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-06-23 9:11 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-16 19:25 [PATCH v2 1/4] dt-bindings: net: wireless: mt76: add power-limits node Felix Fietkau
2020-06-16 19:25 ` [PATCH v2 2/4] mt76: add functions for parsing rate power limits from DT Felix Fietkau
2020-06-16 19:25 ` [PATCH v2 3/4] mt76: extend DT rate power limits to support 11ax devices Felix Fietkau
2020-06-16 19:25 ` [PATCH v2 4/4] mt76: mt7615: implement support for using DT rate power limits Felix Fietkau
2020-06-23 9:11 ` [PATCH v2 1/4] dt-bindings: net: wireless: mt76: add power-limits node Kalle Valo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).