Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

wifi: mt76: support power delta calculation for 5 TX paths

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>

authored by

Shayne Chen and committed by
Felix Fietkau
56e38675 249173e9

+16 -16
+2 -2
drivers/net/wireless/mediatek/mt76/mac80211.c
··· 1705 1705 int n_chains = hweight16(phy->chainmask); 1706 1706 1707 1707 txpower = mt76_get_sar_power(phy, phy->chandef.chan, txpower * 2); 1708 - txpower -= mt76_tx_power_nss_delta(n_chains); 1708 + txpower -= mt76_tx_power_path_delta(n_chains); 1709 1709 1710 1710 return txpower; 1711 1711 } ··· 1721 1721 return -EINVAL; 1722 1722 1723 1723 n_chains = hweight16(phy->chainmask); 1724 - delta = mt76_tx_power_nss_delta(n_chains); 1724 + delta = mt76_tx_power_path_delta(n_chains); 1725 1725 *dbm = DIV_ROUND_UP(phy->txpower_cur + delta, 2); 1726 1726 1727 1727 return 0;
+4 -4
drivers/net/wireless/mediatek/mt76/mt76.h
··· 1398 1398 return pktid >= MT_PACKET_ID_FIRST; 1399 1399 } 1400 1400 1401 - static inline u8 mt76_tx_power_nss_delta(u8 nss) 1401 + static inline u8 mt76_tx_power_path_delta(u8 path) 1402 1402 { 1403 - static const u8 nss_delta[4] = { 0, 6, 9, 12 }; 1404 - u8 idx = nss - 1; 1403 + static const u8 path_delta[5] = { 0, 6, 9, 12, 14 }; 1404 + u8 idx = path - 1; 1405 1405 1406 - return (idx < ARRAY_SIZE(nss_delta)) ? nss_delta[idx] : 0; 1406 + return (idx < ARRAY_SIZE(path_delta)) ? path_delta[idx] : 0; 1407 1407 } 1408 1408 1409 1409 static inline bool mt76_testmode_enabled(struct mt76_phy *phy)
+1 -1
drivers/net/wireless/mediatek/mt76/mt7615/init.c
··· 273 273 struct ieee80211_supported_band *sband) 274 274 { 275 275 int i, n_chains = hweight8(dev->mphy.antenna_mask), target_chains; 276 - int delta_idx, delta = mt76_tx_power_nss_delta(n_chains); 276 + int delta_idx, delta = mt76_tx_power_path_delta(n_chains); 277 277 u8 *eep = (u8 *)dev->mt76.eeprom.data; 278 278 enum nl80211_band band = sband->band; 279 279 struct mt76_power_limits limits;
+3 -3
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
··· 2067 2067 }; 2068 2068 2069 2069 tx_power = mt76_get_sar_power(mphy, mphy->chandef.chan, tx_power); 2070 - tx_power -= mt76_tx_power_nss_delta(n_chains); 2070 + tx_power -= mt76_tx_power_path_delta(n_chains); 2071 2071 tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan, 2072 2072 &limits, tx_power); 2073 2073 mphy->txpower_cur = tx_power; ··· 2084 2084 int delta = 0; 2085 2085 2086 2086 if (i < n_chains - 1) 2087 - delta = mt76_tx_power_nss_delta(n_chains) - 2088 - mt76_tx_power_nss_delta(i + 1); 2087 + delta = mt76_tx_power_path_delta(n_chains) - 2088 + mt76_tx_power_path_delta(i + 1); 2089 2089 sku[MT_SKU_1SS_DELTA + i] = delta; 2090 2090 } 2091 2091 }
+2 -2
drivers/net/wireless/mediatek/mt76/mt7915/init.c
··· 285 285 { 286 286 struct mt7915_dev *dev = phy->dev; 287 287 int i, n_chains = hweight16(phy->mt76->chainmask); 288 - int nss_delta = mt76_tx_power_nss_delta(n_chains); 288 + int path_delta = mt76_tx_power_path_delta(n_chains); 289 289 int pwr_delta = mt7915_eeprom_get_power_delta(dev, sband->band); 290 290 struct mt76_power_limits limits; 291 291 ··· 305 305 target_power = mt76_get_rate_power_limits(phy->mt76, chan, 306 306 &limits, 307 307 target_power); 308 - target_power += nss_delta; 308 + target_power += path_delta; 309 309 target_power = DIV_ROUND_UP(target_power, 2); 310 310 chan->max_power = min_t(int, chan->max_reg_power, 311 311 target_power);
+3 -3
drivers/net/wireless/mediatek/mt76/mt7996/init.c
··· 317 317 struct ieee80211_supported_band *sband) 318 318 { 319 319 struct mt7996_dev *dev = phy->dev; 320 - int i, nss = hweight16(phy->mt76->chainmask); 321 - int nss_delta = mt76_tx_power_nss_delta(nss); 320 + int i, n_chains = hweight16(phy->mt76->chainmask); 321 + int path_delta = mt76_tx_power_path_delta(n_chains); 322 322 int pwr_delta = mt7996_eeprom_get_power_delta(dev, sband->band); 323 323 struct mt76_power_limits limits; 324 324 ··· 330 330 target_power = mt76_get_rate_power_limits(phy->mt76, chan, 331 331 &limits, 332 332 target_power); 333 - target_power += nss_delta; 333 + target_power += path_delta; 334 334 target_power = DIV_ROUND_UP(target_power, 2); 335 335 chan->max_power = min_t(int, chan->max_reg_power, 336 336 target_power);
+1 -1
drivers/net/wireless/mediatek/mt76/mt7996/main.c
··· 688 688 } 689 689 690 690 n_chains = hweight16(phy->mt76->chainmask); 691 - delta = mt76_tx_power_nss_delta(n_chains); 691 + delta = mt76_tx_power_path_delta(n_chains); 692 692 *dbm = DIV_ROUND_UP(phy->mt76->txpower_cur + delta, 2); 693 693 694 694 return 0;