linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/4] dt-bindings: net: wireless: mt76: add ru property in power-limits node
@ 2020-06-16 12:46 Shayne Chen
  2020-06-16 12:46 ` [PATCH 2/4] mt76: extend DT rate power limits to support 11ax devices Shayne Chen
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Shayne Chen @ 2020-06-16 12:46 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai,
	linux-mediatek, Shayne Chen, devicetree

This new property of power-limits node can be used to set per-rate
tx power limits for 802.11ax rates.

Cc: devicetree@vger.kernel.org
Tested-by: Evelyn Tsai <evelyn.tsai@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
The series is based on Felix's https://patchwork.kernel.org/project/linux-wireless/list/?series=295809
---
 .../devicetree/bindings/net/wireless/mediatek,mt76.txt | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt
index 9d9ace0cfbf9..aefe880d36ff 100644
--- a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt
+++ b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt
@@ -101,6 +101,13 @@ Properties:
 	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.
 
 
 power-limit example:
@@ -114,11 +121,14 @@ power-limits {
 				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>;
+				ru = <7 14 14 14 14 14 14 14 14 14 14 14 14>;
 			};
 		};
 	};
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/4] mt76: extend DT rate power limits to support 11ax devices
  2020-06-16 12:46 [PATCH 1/4] dt-bindings: net: wireless: mt76: add ru property in power-limits node Shayne Chen
@ 2020-06-16 12:46 ` Shayne Chen
  2020-06-16 12:46 ` [PATCH 3/4] mt76: mt7915: add support for DT rate power limits Shayne Chen
  2020-06-16 12:46 ` [PATCH 4/4] mt76: mt7915: add support to read per-rate tx power from HW in debugfs Shayne Chen
  2 siblings, 0 replies; 5+ messages in thread
From: Shayne Chen @ 2020-06-16 12:46 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai,
	linux-mediatek, Shayne Chen

Enable parsing per-rate txpower limits from DT for 11ax chipsets.

Tested-by: Evelyn Tsai <evelyn.tsai@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/eeprom.c | 63 ++++++++++++++-------
 drivers/net/wireless/mediatek/mt76/mt76.h   |  1 +
 2 files changed, 44 insertions(+), 20 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c
index 334606b07693..87a5d2db05e1 100644
--- a/drivers/net/wireless/mediatek/mt76/eeprom.c
+++ b/drivers/net/wireless/mediatek/mt76/eeprom.c
@@ -221,6 +221,41 @@ mt76_apply_array_limit(s8 *pwr, size_t pwr_len, const __be32 *data,
 	}
 }
 
+static void
+mt76_apply_mcs_limit(struct mt76_power_limits *dest, u32 mcs_rates,
+		     const __be32 *data, size_t len, s8 target_power,
+		     s8 nss_delta, s8 *max_power)
+{
+	s8 *pwr = (s8 *)dest->mcs;
+	u8 pwr_num = ARRAY_SIZE(dest->mcs), pwr_len = ARRAY_SIZE(dest->mcs[0]);
+	int i, cur;
+
+	if (mcs_rates == ARRAY_SIZE(dest->ru[0])) {
+		pwr = (s8 *)dest->ru;
+		pwr_num = ARRAY_SIZE(dest->ru);
+		pwr_len = ARRAY_SIZE(dest->ru[0]);
+	}
+
+	len /= 4;
+	cur = be32_to_cpu(data[0]);
+	for (i = 0; i < pwr_num; i++) {
+		if (len < mcs_rates + 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 += mcs_rates + 1;
+		len -= mcs_rates + 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 +266,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;
 
@@ -282,26 +317,14 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
 	val = mt76_get_of_array(np, "mcs", &len, mcs_rates + 1);
 	if (!val)
 		return max_power;
+	mt76_apply_mcs_limit(dest, mcs_rates, 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);
+	if (!val)
+		return max_power;
+	mt76_apply_mcs_limit(dest, ru_rates, 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.18.0

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/4] mt76: mt7915: add support for DT rate power limits
  2020-06-16 12:46 [PATCH 1/4] dt-bindings: net: wireless: mt76: add ru property in power-limits node Shayne Chen
  2020-06-16 12:46 ` [PATCH 2/4] mt76: extend DT rate power limits to support 11ax devices Shayne Chen
@ 2020-06-16 12:46 ` Shayne Chen
  2020-06-16 18:28   ` Felix Fietkau
  2020-06-16 12:46 ` [PATCH 4/4] mt76: mt7915: add support to read per-rate tx power from HW in debugfs Shayne Chen
  2 siblings, 1 reply; 5+ messages in thread
From: Shayne Chen @ 2020-06-16 12:46 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai,
	linux-mediatek, Shayne Chen

Add support to limit per-rate max txpower from DT.

Tested-by: Evelyn Tsai <evelyn.tsai@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
 .../wireless/mediatek/mt76/mt7915/eeprom.h    |  2 +-
 .../net/wireless/mediatek/mt76/mt7915/mcu.c   | 38 +++++++++++++++++--
 2 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h b/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h
index 4e31d6ab4fa6..284de8b4e0a4 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h
@@ -120,6 +120,6 @@ mt7915_tssi_enabled(struct mt7915_dev *dev, enum nl80211_band band)
 		return eep[MT_EE_WIFI_CONF + 7] & MT_EE_WIFI_CONF_TSSI0_2G;
 }
 
-extern const struct sku_group mt7915_sku_groups[];
+extern const struct sku_group mt7915_sku_groups[MAX_SKU_RATE_GROUP_NUM];
 
 #endif
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
index 349163d0b7f2..c5e9893cbd87 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
@@ -3171,15 +3171,45 @@ int mt7915_mcu_set_sku(struct mt7915_phy *phy)
 		.format_id = 4,
 		.dbdc_idx = phy != &dev->phy,
 	};
-	int i;
-	s8 *delta;
+	struct mt76_power_limits limits_array;
+	s8 *delta, *la = (s8 *)&limits_array;
+	int i, idx;
 
 	delta = dev->rate_power[mphy->chandef.chan->band];
 	mphy->txpower_cur = hw->conf.power_level * 2 +
 			    delta[MT7915_SKU_MAX_DELTA_IDX];
 
-	for (i = 0; i < MT7915_SKU_RATE_NUM; i++)
-		req.val[i] = hw->conf.power_level * 2 + delta[i];
+	mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
+				   &limits_array, mphy->txpower_cur);
+
+	for (i = 0, idx = 0; i < ARRAY_SIZE(mt7915_sku_groups); i++) {
+		const struct sku_group *sku = &mt7915_sku_groups[i];
+		u32 offset = sku->offset[mphy->chandef.chan->band];
+		u8 mcs_num = sku->len;
+		int j;
+
+		if (i >= SKU_HT_BW20 && i <= SKU_VHT_BW160) {
+			mcs_num = 10;
+
+			if (i == SKU_HT_BW20 || i == SKU_VHT_BW20)
+				la = (s8 *)&limits_array + 12;
+		}
+
+		if (!offset) {
+			idx += sku->len;
+			la += mcs_num;
+			continue;
+		}
+
+		for (j = 0; j < min_t(u8, mcs_num, sku->len); j++) {
+			s8 rate_power;
+
+			rate_power = hw->conf.power_level * 2 + delta[idx + j];
+			req.val[idx + j] = min_t(s8, la[j], rate_power);
+		}
+		la += mcs_num;
+		idx += sku->len;
+	}
 
 	return __mt76_mcu_send_msg(&dev->mt76,
 				   MCU_EXT_CMD_TX_POWER_FEATURE_CTRL,
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 4/4] mt76: mt7915: add support to read per-rate tx power from HW in debugfs
  2020-06-16 12:46 [PATCH 1/4] dt-bindings: net: wireless: mt76: add ru property in power-limits node Shayne Chen
  2020-06-16 12:46 ` [PATCH 2/4] mt76: extend DT rate power limits to support 11ax devices Shayne Chen
  2020-06-16 12:46 ` [PATCH 3/4] mt76: mt7915: add support for DT rate power limits Shayne Chen
@ 2020-06-16 12:46 ` Shayne Chen
  2 siblings, 0 replies; 5+ messages in thread
From: Shayne Chen @ 2020-06-16 12:46 UTC (permalink / raw)
  To: Felix Fietkau
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai,
	linux-mediatek, Shayne Chen

In the previous version, the values of per-rate tx power are calculated
from SW side, but it may be inaccurate if additional limits are applied.
This patch adds support for getting per-rate tx power directly from
registers.

Tested-by: Evelyn Tsai <evelyn.tsai@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
 .../wireless/mediatek/mt76/mt7915/debugfs.c   | 60 +++++++++++++------
 .../net/wireless/mediatek/mt76/mt7915/regs.h  |  5 ++
 2 files changed, 46 insertions(+), 19 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
index 38f473d587c9..67bc05600190 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
@@ -307,8 +307,8 @@ mt7915_queues_read(struct seq_file *s, void *data)
 }
 
 static void
-mt7915_puts_rate_txpower(struct seq_file *s, s8 *delta,
-			 s8 txpower_cur, int band)
+mt7915_puts_rate_txpower(struct seq_file *s, struct mt7915_dev *dev,
+			 int band, bool ext_phy)
 {
 	static const char * const sku_group_name[] = {
 		"CCK", "OFDM", "HT20", "HT40",
@@ -316,24 +316,51 @@ mt7915_puts_rate_txpower(struct seq_file *s, s8 *delta,
 		"RU26", "RU52", "RU106", "RU242/SU20",
 		"RU484/SU40", "RU996/SU80", "RU2x996/SU160"
 	};
-	s8 txpower[MT7915_SKU_RATE_NUM];
+	u32 reg_base = MT_TMAC_FP0R0(ext_phy);
 	int i, idx = 0;
 
-	for (i = 0; i < MT7915_SKU_RATE_NUM; i++)
-		txpower[i] = DIV_ROUND_UP(txpower_cur + delta[i], 2);
-
 	for (i = 0; i < MAX_SKU_RATE_GROUP_NUM; i++) {
 		const struct sku_group *sku = &mt7915_sku_groups[i];
 		u32 offset = sku->offset[band];
+		u8 cnt, mcs_num = sku->len;
+		s8 txpower[12];
+		int j;
+
+		if (i == SKU_HT_BW20 || i == SKU_HT_BW40) {
+			mcs_num = 8;
+		} else if (i >= SKU_VHT_BW20 && i <= SKU_VHT_BW160) {
+			mcs_num = 10;
+
+			if (idx == 60) {
+				reg_base = MT_TMAC_FP0R15(ext_phy);
+				idx = 0;
+			}
+		} else if (i == SKU_HE_RU26) {
+			reg_base = MT_TMAC_FP0R18(ext_phy);
+			idx = 0;
+		}
 
 		if (!offset) {
-			idx += sku->len;
+			idx += mcs_num;
 			continue;
 		}
 
-		mt76_seq_puts_array(s, sku_group_name[i],
-				    txpower + idx, sku->len);
-		idx += sku->len;
+		for (j = 0, cnt = 0; j < DIV_ROUND_UP(mcs_num, 4); j++) {
+			u32 val = mt76_rr(dev, reg_base + (idx / 4) * 4);
+
+			if (idx && idx % 4)
+				val >>= (idx % 4) * 8;
+
+			while (val > 0 && cnt < mcs_num) {
+				s8 pwr = FIELD_GET(MT_TMAC_FP_MASK, val);
+
+				txpower[cnt++] = pwr;
+				val >>= 8;
+				idx++;
+			}
+		}
+
+		mt76_seq_puts_array(s, sku_group_name[i], txpower, mcs_num);
 	}
 }
 
@@ -343,21 +370,16 @@ mt7915_read_rate_txpower(struct seq_file *s, void *data)
 	struct mt7915_dev *dev = dev_get_drvdata(s->private);
 	struct mt76_phy *mphy = &dev->mphy;
 	enum nl80211_band band = mphy->chandef.chan->band;
-	s8 *delta = dev->rate_power[band];
-	s8 txpower_base = mphy->txpower_cur - delta[MT7915_SKU_MAX_DELTA_IDX];
 
-	seq_puts(s, "Band 0:\n");
-	mt7915_puts_rate_txpower(s, delta, txpower_base, band);
+	seq_puts(s, "Band 0: (unit: 0.5 dBm)\n");
+	mt7915_puts_rate_txpower(s, dev, band, false);
 
 	if (dev->mt76.phy2) {
 		mphy = dev->mt76.phy2;
 		band = mphy->chandef.chan->band;
-		delta = dev->rate_power[band];
-		txpower_base = mphy->txpower_cur -
-			       delta[MT7915_SKU_MAX_DELTA_IDX];
 
-		seq_puts(s, "Band 1:\n");
-		mt7915_puts_rate_txpower(s, delta, txpower_base, band);
+		seq_puts(s, "Band 1: (unit: 0.5 dBm)\n");
+		mt7915_puts_rate_txpower(s, dev, band, true);
 	}
 
 	return 0;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
index e0989141d9da..afd582fd20a1 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
@@ -67,6 +67,11 @@
 #define MT_TMAC_CTCR0_INS_DDLMT_EN		BIT(17)
 #define MT_TMAC_CTCR0_INS_DDLMT_VHT_SMPDU_EN	BIT(18)
 
+#define MT_TMAC_FP0R0(_band)		MT_WF_TMAC(_band, 0x020)
+#define MT_TMAC_FP0R15(_band)		MT_WF_TMAC(_band, 0x080)
+#define MT_TMAC_FP0R18(_band)		MT_WF_TMAC(_band, 0x270)
+#define MT_TMAC_FP_MASK			GENMASK(7, 0)
+
 /* DMA Band 0 */
 #define MT_WF_DMA_BASE			0x21e00
 #define MT_WF_DMA(ofs)			(MT_WF_DMA_BASE + (ofs))
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 3/4] mt76: mt7915: add support for DT rate power limits
  2020-06-16 12:46 ` [PATCH 3/4] mt76: mt7915: add support for DT rate power limits Shayne Chen
@ 2020-06-16 18:28   ` Felix Fietkau
  0 siblings, 0 replies; 5+ messages in thread
From: Felix Fietkau @ 2020-06-16 18:28 UTC (permalink / raw)
  To: Shayne Chen
  Cc: linux-wireless, Lorenzo Bianconi, Ryder Lee, Evelyn Tsai, linux-mediatek

On 2020-06-16 14:46, Shayne Chen wrote:
> Add support to limit per-rate max txpower from DT.
> 
> Tested-by: Evelyn Tsai <evelyn.tsai@mediatek.com>
> Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
> ---
>  .../wireless/mediatek/mt76/mt7915/eeprom.h    |  2 +-
>  .../net/wireless/mediatek/mt76/mt7915/mcu.c   | 38 +++++++++++++++++--
>  2 files changed, 35 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h b/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h
> index 4e31d6ab4fa6..284de8b4e0a4 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h
> @@ -120,6 +120,6 @@ mt7915_tssi_enabled(struct mt7915_dev *dev, enum nl80211_band band)
>  		return eep[MT_EE_WIFI_CONF + 7] & MT_EE_WIFI_CONF_TSSI0_2G;
>  }
>  
> -extern const struct sku_group mt7915_sku_groups[];
> +extern const struct sku_group mt7915_sku_groups[MAX_SKU_RATE_GROUP_NUM];
>  
>  #endif
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
> index 349163d0b7f2..c5e9893cbd87 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
> @@ -3171,15 +3171,45 @@ int mt7915_mcu_set_sku(struct mt7915_phy *phy)
>  		.format_id = 4,
>  		.dbdc_idx = phy != &dev->phy,
>  	};
> -	int i;
> -	s8 *delta;
> +	struct mt76_power_limits limits_array;
> +	s8 *delta, *la = (s8 *)&limits_array;
> +	int i, idx;
>  
>  	delta = dev->rate_power[mphy->chandef.chan->band];
>  	mphy->txpower_cur = hw->conf.power_level * 2 +
>  			    delta[MT7915_SKU_MAX_DELTA_IDX];
I think the delta needs to be subtracted instead of added here.

> -	for (i = 0; i < MT7915_SKU_RATE_NUM; i++)
> -		req.val[i] = hw->conf.power_level * 2 + delta[i];
> +	mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
> +				   &limits_array, mphy->txpower_cur);
This should set mphy->txpower_cur to the return code of
mt76_get_rate_power_limits. The nss delta is added in the core mt76 code
before reporting to user space.

- Felix


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-06-16 18:28 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-16 12:46 [PATCH 1/4] dt-bindings: net: wireless: mt76: add ru property in power-limits node Shayne Chen
2020-06-16 12:46 ` [PATCH 2/4] mt76: extend DT rate power limits to support 11ax devices Shayne Chen
2020-06-16 12:46 ` [PATCH 3/4] mt76: mt7915: add support for DT rate power limits Shayne Chen
2020-06-16 18:28   ` Felix Fietkau
2020-06-16 12:46 ` [PATCH 4/4] mt76: mt7915: add support to read per-rate tx power from HW in debugfs Shayne Chen

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).