* [PATCH 1/4] wifi: mt76: add mt76_get_power_bound helper function
2025-02-09 1:18 [PATCH 0/4] wifi: mt76: fix returned txpower for mt7921 and mt7925 Razvan Grigore
@ 2025-02-09 1:18 ` Razvan Grigore
2025-02-09 1:18 ` [PATCH 2/4] wifi: mt76: mt7921: fix returned txpower Razvan Grigore
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Razvan Grigore @ 2025-02-09 1:18 UTC (permalink / raw)
To: linux-wireless, Felix Fietkau, Lorenzo Bianconi, Ryder Lee
Cc: Shayne Chen, Sean Wang, Razvan Grigore
This will replace mt7915_get_power_bound function from b/mt7915/mcu.h, since we will need it also for mt7921 and mt7925
Signed-off-by: Razvan Grigore <razvan.grigore@vampirebyte.ro>
---
drivers/net/wireless/mediatek/mt76/mac80211.c | 11 +++++++++++
drivers/net/wireless/mediatek/mt76/mt76.h | 2 ++
2 files changed, 13 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mac80211.c b/drivers/net/wireless/mediatek/mt76/mac80211.c
index 508b472408c2..2c98cc42cd7e 100644
--- a/drivers/net/wireless/mediatek/mt76/mac80211.c
+++ b/drivers/net/wireless/mediatek/mt76/mac80211.c
@@ -1697,6 +1697,17 @@ void mt76_wcid_add_poll(struct mt76_dev *dev, struct mt76_wcid *wcid)
}
EXPORT_SYMBOL_GPL(mt76_wcid_add_poll);
+s8 mt76_get_power_bound(struct mt76_phy *phy, s8 txpower)
+{
+ int n_chains = hweight16(phy->chainmask);
+
+ txpower = mt76_get_sar_power(phy, phy->chandef.chan, txpower * 2);
+ txpower -= mt76_tx_power_nss_delta(n_chains);
+
+ return txpower;
+}
+EXPORT_SYMBOL_GPL(mt76_get_power_bound);
+
int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
unsigned int link_id, int *dbm)
{
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 132148f7b107..96f98a0d55a8 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -1482,6 +1482,8 @@ void mt76_sta_pre_rcu_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
int mt76_get_min_avg_rssi(struct mt76_dev *dev, u8 phy_idx);
+s8 mt76_get_power_bound(struct mt76_phy *phy, s8 txpower);
+
int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
unsigned int link_id, int *dbm);
int mt76_init_sar_power(struct ieee80211_hw *hw,
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 2/4] wifi: mt76: mt7921: fix returned txpower
2025-02-09 1:18 [PATCH 0/4] wifi: mt76: fix returned txpower for mt7921 and mt7925 Razvan Grigore
2025-02-09 1:18 ` [PATCH 1/4] wifi: mt76: add mt76_get_power_bound helper function Razvan Grigore
@ 2025-02-09 1:18 ` Razvan Grigore
2025-02-09 1:18 ` [PATCH 3/4] wifi: mt76: mt7925: " Razvan Grigore
2025-02-09 1:18 ` [PATCH 4/4] wifi: mt76: mt7915: cleanup mt7915_get_power_bound Razvan Grigore
3 siblings, 0 replies; 6+ messages in thread
From: Razvan Grigore @ 2025-02-09 1:18 UTC (permalink / raw)
To: linux-wireless, Felix Fietkau, Lorenzo Bianconi, Ryder Lee
Cc: Shayne Chen, Sean Wang, Razvan Grigore
This bug was noticed by me and confirmed by many more people using this chipset with openwrt: https://github.com/openwrt/mt76/issues/783
It seems that for this particular chipset the mt76_phy->txpower_cur is never set, like in the case of other chipsets like mt7603, mt7615, etc. The driver is correctly calculating the TX power adjustment based on the number of antennas. However, the base TX power (phy->txpower_cur) is not being properly initialized or set to a meaningful value. It's starting at 0, so the final result is just the antenna gain compensation divided by 2.
Signed-off-by: Razvan Grigore <razvan.grigore@vampirebyte.ro>
---
drivers/net/wireless/mediatek/mt76/mt7921/main.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
index 13e58c328aff..9e8961533fd1 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
@@ -1251,6 +1251,8 @@ int mt7921_set_tx_sar_pwr(struct ieee80211_hw *hw,
const struct cfg80211_sar_specs *sar)
{
struct mt76_phy *mphy = hw->priv;
+ int tx_power;
+ struct mt76_power_limits limits_array;
if (sar) {
int err = mt76_init_sar_power(hw, sar);
@@ -1260,6 +1262,11 @@ int mt7921_set_tx_sar_pwr(struct ieee80211_hw *hw,
}
mt792x_init_acpi_sar_power(mt792x_hw_phy(hw), !sar);
+ tx_power = mt76_get_power_bound(mphy, hw->conf.power_level);
+ tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
+ &limits_array, tx_power);
+ mphy->txpower_cur = tx_power;
+
return mt76_connac_mcu_set_rate_txpower(mphy);
}
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 3/4] wifi: mt76: mt7925: fix returned txpower
2025-02-09 1:18 [PATCH 0/4] wifi: mt76: fix returned txpower for mt7921 and mt7925 Razvan Grigore
2025-02-09 1:18 ` [PATCH 1/4] wifi: mt76: add mt76_get_power_bound helper function Razvan Grigore
2025-02-09 1:18 ` [PATCH 2/4] wifi: mt76: mt7921: fix returned txpower Razvan Grigore
@ 2025-02-09 1:18 ` Razvan Grigore
2025-02-09 1:18 ` [PATCH 4/4] wifi: mt76: mt7915: cleanup mt7915_get_power_bound Razvan Grigore
3 siblings, 0 replies; 6+ messages in thread
From: Razvan Grigore @ 2025-02-09 1:18 UTC (permalink / raw)
To: linux-wireless, Felix Fietkau, Lorenzo Bianconi, Ryder Lee
Cc: Shayne Chen, Sean Wang, Razvan Grigore
Similar to the mt7921, seems the code was copy-paste from there. This bug was noticed by me and confirmed by many more people using this chipset with openwrt: https://github.com/openwrt/mt76/issues/783
It seems that for this particular chipset the mt76_phy->txpower_cur is never set, like in the case of other chipsets like mt7603, mt7615, etc. The driver is correctly calculating the TX power adjustment based on the number of antennas. However, the base TX power (phy->txpower_cur) is not being properly initialized or set to a meaningful value. It's starting at 0, so the final result is just the antenna gain compensation divided by 2.
Signed-off-by: Razvan Grigore <razvan.grigore@vampirebyte.ro>
---
drivers/net/wireless/mediatek/mt76/mt7925/main.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/main.c b/drivers/net/wireless/mediatek/mt76/mt7925/main.c
index 98daf80ac131..9da7897c0267 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/main.c
@@ -1656,6 +1656,8 @@ int mt7925_set_tx_sar_pwr(struct ieee80211_hw *hw,
const struct cfg80211_sar_specs *sar)
{
struct mt76_phy *mphy = hw->priv;
+ int tx_power;
+ struct mt76_power_limits limits_array;
if (sar) {
int err = mt76_init_sar_power(hw, sar);
@@ -1665,6 +1667,11 @@ int mt7925_set_tx_sar_pwr(struct ieee80211_hw *hw,
}
mt792x_init_acpi_sar_power(mt792x_hw_phy(hw), !sar);
+ tx_power = mt76_get_power_bound(mphy, hw->conf.power_level);
+ tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
+ &limits_array, tx_power);
+ mphy->txpower_cur = tx_power;
+
return mt7925_mcu_set_rate_txpower(mphy);
}
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 4/4] wifi: mt76: mt7915: cleanup mt7915_get_power_bound
2025-02-09 1:18 [PATCH 0/4] wifi: mt76: fix returned txpower for mt7921 and mt7925 Razvan Grigore
` (2 preceding siblings ...)
2025-02-09 1:18 ` [PATCH 3/4] wifi: mt76: mt7925: " Razvan Grigore
@ 2025-02-09 1:18 ` Razvan Grigore
2025-02-09 8:02 ` Shengyu Qu
3 siblings, 1 reply; 6+ messages in thread
From: Razvan Grigore @ 2025-02-09 1:18 UTC (permalink / raw)
To: linux-wireless, Felix Fietkau, Lorenzo Bianconi, Ryder Lee
Cc: Shayne Chen, Sean Wang, Razvan Grigore
Refactor for making use of mt76_get_power_bound instead of the specific mt7915_get_power_bound, since we need this for other chipsets as well when calculating txpower
Signed-off-by: Razvan Grigore <razvan.grigore@vampirebyte.ro>
---
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c | 8 ++++----
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 4 ++--
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h | 12 ------------
3 files changed, 6 insertions(+), 18 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
index 578013884e43..db8560f7e657 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
@@ -1084,13 +1084,13 @@ mt7915_rate_txpower_set(struct file *file, const char __user *user_buf,
return -EINVAL;
if (pwr160)
- pwr160 = mt7915_get_power_bound(phy, pwr160);
+ pwr160 = mt76_get_power_bound(mphy, pwr160);
if (pwr80)
- pwr80 = mt7915_get_power_bound(phy, pwr80);
+ pwr80 = mt76_get_power_bound(mphy, pwr80);
if (pwr40)
- pwr40 = mt7915_get_power_bound(phy, pwr40);
+ pwr40 = mt76_get_power_bound(mphy, pwr40);
if (pwr20)
- pwr20 = mt7915_get_power_bound(phy, pwr20);
+ pwr20 = mt76_get_power_bound(mphy, pwr20);
if (pwr160 < 0 || pwr80 < 0 || pwr40 < 0 || pwr20 < 0)
return -EINVAL;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
index 9d790f234e82..3643c72bb68d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
@@ -3323,7 +3323,7 @@ int mt7915_mcu_set_txpower_frame(struct mt7915_phy *phy,
if (ret)
return ret;
- txpower = mt7915_get_power_bound(phy, txpower);
+ txpower = mt76_get_power_bound(mphy, txpower);
if (txpower > mphy->txpower_cur || txpower < 0)
return -EINVAL;
@@ -3373,7 +3373,7 @@ int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
int i, idx;
int tx_power;
- tx_power = mt7915_get_power_bound(phy, hw->conf.power_level);
+ tx_power = mt76_get_power_bound(mphy, hw->conf.power_level);
tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
&limits_array, tx_power);
mphy->txpower_cur = tx_power;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
index 49476a4182fd..092ed504a8f2 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
@@ -515,16 +515,4 @@ enum {
sizeof(struct bss_info_bmc_rate) +\
sizeof(struct bss_info_ext_bss))
-static inline s8
-mt7915_get_power_bound(struct mt7915_phy *phy, s8 txpower)
-{
- struct mt76_phy *mphy = phy->mt76;
- int n_chains = hweight16(mphy->chainmask);
-
- txpower = mt76_get_sar_power(mphy, mphy->chandef.chan, txpower * 2);
- txpower -= mt76_tx_power_nss_delta(n_chains);
-
- return txpower;
-}
-
#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH 4/4] wifi: mt76: mt7915: cleanup mt7915_get_power_bound
2025-02-09 1:18 ` [PATCH 4/4] wifi: mt76: mt7915: cleanup mt7915_get_power_bound Razvan Grigore
@ 2025-02-09 8:02 ` Shengyu Qu
0 siblings, 0 replies; 6+ messages in thread
From: Shengyu Qu @ 2025-02-09 8:02 UTC (permalink / raw)
To: Razvan Grigore, linux-wireless, Felix Fietkau, Lorenzo Bianconi,
Ryder Lee
Cc: wiagn233, Shayne Chen, Sean Wang
[-- Attachment #1.1.1: Type: text/plain, Size: 3357 bytes --]
Hi,
I think we should do the same for MT7996?
Best regards,
Shengyu
在 2025/2/9 9:18, Razvan Grigore 写道:
> Refactor for making use of mt76_get_power_bound instead of the specific mt7915_get_power_bound, since we need this for other chipsets as well when calculating txpower
>
> Signed-off-by: Razvan Grigore <razvan.grigore@vampirebyte.ro>
> ---
> drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c | 8 ++++----
> drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 4 ++--
> drivers/net/wireless/mediatek/mt76/mt7915/mcu.h | 12 ------------
> 3 files changed, 6 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
> index 578013884e43..db8560f7e657 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
> @@ -1084,13 +1084,13 @@ mt7915_rate_txpower_set(struct file *file, const char __user *user_buf,
> return -EINVAL;
>
> if (pwr160)
> - pwr160 = mt7915_get_power_bound(phy, pwr160);
> + pwr160 = mt76_get_power_bound(mphy, pwr160);
> if (pwr80)
> - pwr80 = mt7915_get_power_bound(phy, pwr80);
> + pwr80 = mt76_get_power_bound(mphy, pwr80);
> if (pwr40)
> - pwr40 = mt7915_get_power_bound(phy, pwr40);
> + pwr40 = mt76_get_power_bound(mphy, pwr40);
> if (pwr20)
> - pwr20 = mt7915_get_power_bound(phy, pwr20);
> + pwr20 = mt76_get_power_bound(mphy, pwr20);
>
> if (pwr160 < 0 || pwr80 < 0 || pwr40 < 0 || pwr20 < 0)
> return -EINVAL;
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
> index 9d790f234e82..3643c72bb68d 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
> @@ -3323,7 +3323,7 @@ int mt7915_mcu_set_txpower_frame(struct mt7915_phy *phy,
> if (ret)
> return ret;
>
> - txpower = mt7915_get_power_bound(phy, txpower);
> + txpower = mt76_get_power_bound(mphy, txpower);
> if (txpower > mphy->txpower_cur || txpower < 0)
> return -EINVAL;
>
> @@ -3373,7 +3373,7 @@ int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
> int i, idx;
> int tx_power;
>
> - tx_power = mt7915_get_power_bound(phy, hw->conf.power_level);
> + tx_power = mt76_get_power_bound(mphy, hw->conf.power_level);
> tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
> &limits_array, tx_power);
> mphy->txpower_cur = tx_power;
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
> index 49476a4182fd..092ed504a8f2 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
> @@ -515,16 +515,4 @@ enum {
> sizeof(struct bss_info_bmc_rate) +\
> sizeof(struct bss_info_ext_bss))
>
> -static inline s8
> -mt7915_get_power_bound(struct mt7915_phy *phy, s8 txpower)
> -{
> - struct mt76_phy *mphy = phy->mt76;
> - int n_chains = hweight16(mphy->chainmask);
> -
> - txpower = mt76_get_sar_power(mphy, mphy->chandef.chan, txpower * 2);
> - txpower -= mt76_tx_power_nss_delta(n_chains);
> -
> - return txpower;
> -}
> -
> #endif
[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 6977 bytes --]
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread