wifi: mt76: support power delta calculation for 5 TX paths
authorShayne Chen <shayne.chen@mediatek.com>
Thu, 15 May 2025 03:29:52 +0000 (11:29 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 22 May 2025 10:57:37 +0000 (12:57 +0200)
One variant of MT7992 has 5 TX paths, so extend the power delta function
to support it. Also, rename nss_delta to path_delta since the value is
based on the number of TX paths rather tha the number of spatial streams.
(path delta [0.5 dBm] = 10 * log(path number) [dBm] * 2)

Co-developed-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Link: https://patch.msgid.link/20250515032952.1653494-9-shayne.chen@mediatek.com
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt7615/init.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt7915/init.c
drivers/net/wireless/mediatek/mt76/mt7996/init.c
drivers/net/wireless/mediatek/mt76/mt7996/main.c

index e9605dc222910f9c2bdaa0e9112fbb7b538e902e..45c8db939d554671d68f1914f5febb5f5a2af752 100644 (file)
@@ -1705,7 +1705,7 @@ 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);
+       txpower -= mt76_tx_power_path_delta(n_chains);
 
        return txpower;
 }
@@ -1721,7 +1721,7 @@ int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                return -EINVAL;
 
        n_chains = hweight16(phy->chainmask);
-       delta = mt76_tx_power_nss_delta(n_chains);
+       delta = mt76_tx_power_path_delta(n_chains);
        *dbm = DIV_ROUND_UP(phy->txpower_cur + delta, 2);
 
        return 0;
index ee6ed89fe4967406bbaa4f78c171072915180ffa..5f8d81cda6cdb7cbb3fe45535148758d5773affc 100644 (file)
@@ -1398,12 +1398,12 @@ static inline bool mt76_is_skb_pktid(u8 pktid)
        return pktid >= MT_PACKET_ID_FIRST;
 }
 
-static inline u8 mt76_tx_power_nss_delta(u8 nss)
+static inline u8 mt76_tx_power_path_delta(u8 path)
 {
-       static const u8 nss_delta[4] = { 0, 6, 9, 12 };
-       u8 idx = nss - 1;
+       static const u8 path_delta[5] = { 0, 6, 9, 12, 14 };
+       u8 idx = path - 1;
 
-       return (idx < ARRAY_SIZE(nss_delta)) ? nss_delta[idx] : 0;
+       return (idx < ARRAY_SIZE(path_delta)) ? path_delta[idx] : 0;
 }
 
 static inline bool mt76_testmode_enabled(struct mt76_phy *phy)
index 66ba3be2734344a41b6fc697dc79422673e3e8c2..aae80005a3c175b3cc92f02d9b8673b836df9075 100644 (file)
@@ -273,7 +273,7 @@ void mt7615_init_txpower(struct mt7615_dev *dev,
                         struct ieee80211_supported_band *sband)
 {
        int i, n_chains = hweight8(dev->mphy.antenna_mask), target_chains;
-       int delta_idx, delta = mt76_tx_power_nss_delta(n_chains);
+       int delta_idx, delta = mt76_tx_power_path_delta(n_chains);
        u8 *eep = (u8 *)dev->mt76.eeprom.data;
        enum nl80211_band band = sband->band;
        struct mt76_power_limits limits;
index b8fcd4eb3fbb29aab24150a2f406fac42b5a3135..4064e193d4dec60c3a18fce34990388b64439d42 100644 (file)
@@ -2067,7 +2067,7 @@ static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
        };
 
        tx_power = mt76_get_sar_power(mphy, mphy->chandef.chan, tx_power);
-       tx_power -= mt76_tx_power_nss_delta(n_chains);
+       tx_power -= mt76_tx_power_path_delta(n_chains);
        tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
                                              &limits, tx_power);
        mphy->txpower_cur = tx_power;
@@ -2084,8 +2084,8 @@ static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
                int delta = 0;
 
                if (i < n_chains - 1)
-                       delta = mt76_tx_power_nss_delta(n_chains) -
-                               mt76_tx_power_nss_delta(i + 1);
+                       delta = mt76_tx_power_path_delta(n_chains) -
+                               mt76_tx_power_path_delta(i + 1);
                sku[MT_SKU_1SS_DELTA + i] = delta;
        }
 }
index be9527dd0269be9fe9daa5bf9648dc48ca75af56..3e30ca5155d203b22441d7d601af58c4c9ba1b13 100644 (file)
@@ -285,7 +285,7 @@ static void __mt7915_init_txpower(struct mt7915_phy *phy,
 {
        struct mt7915_dev *dev = phy->dev;
        int i, n_chains = hweight16(phy->mt76->chainmask);
-       int nss_delta = mt76_tx_power_nss_delta(n_chains);
+       int path_delta = mt76_tx_power_path_delta(n_chains);
        int pwr_delta = mt7915_eeprom_get_power_delta(dev, sband->band);
        struct mt76_power_limits limits;
 
@@ -305,7 +305,7 @@ static void __mt7915_init_txpower(struct mt7915_phy *phy,
                target_power = mt76_get_rate_power_limits(phy->mt76, chan,
                                                          &limits,
                                                          target_power);
-               target_power += nss_delta;
+               target_power += path_delta;
                target_power = DIV_ROUND_UP(target_power, 2);
                chan->max_power = min_t(int, chan->max_reg_power,
                                        target_power);
index 213c7bcd4ade4c498ee4c57cfab11fda71bafa26..a9599c286328eb2b1ff24504109d25a9d916e044 100644 (file)
@@ -317,8 +317,8 @@ static void __mt7996_init_txpower(struct mt7996_phy *phy,
                                  struct ieee80211_supported_band *sband)
 {
        struct mt7996_dev *dev = phy->dev;
-       int i, nss = hweight16(phy->mt76->chainmask);
-       int nss_delta = mt76_tx_power_nss_delta(nss);
+       int i, n_chains = hweight16(phy->mt76->chainmask);
+       int path_delta = mt76_tx_power_path_delta(n_chains);
        int pwr_delta = mt7996_eeprom_get_power_delta(dev, sband->band);
        struct mt76_power_limits limits;
 
@@ -330,7 +330,7 @@ static void __mt7996_init_txpower(struct mt7996_phy *phy,
                target_power = mt76_get_rate_power_limits(phy->mt76, chan,
                                                          &limits,
                                                          target_power);
-               target_power += nss_delta;
+               target_power += path_delta;
                target_power = DIV_ROUND_UP(target_power, 2);
                chan->max_power = min_t(int, chan->max_reg_power,
                                        target_power);
index b11dd3dd5c46f0474d40ad37dafa98ba27149c89..78ae9f5cb1760ababc088fc21bfc3957cfe02506 100644 (file)
@@ -688,7 +688,7 @@ mt7996_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        }
 
        n_chains = hweight16(phy->mt76->chainmask);
-       delta = mt76_tx_power_nss_delta(n_chains);
+       delta = mt76_tx_power_path_delta(n_chains);
        *dbm = DIV_ROUND_UP(phy->mt76->txpower_cur + delta, 2);
 
        return 0;