Skip to content

Commit cee646d

Browse files
committed
mt76: fix tx power issues
- tx power is stored in the channels after ieee80211_register_hw, so chan->orig_mpwr needs to be updated as well - for non-TSSI devices, mt76x2e needs to use a different target power value from the EEPROM - fix a rounding error in a few places (need to round up, not down) Signed-off-by: Felix Fietkau <[email protected]>
1 parent def34a2 commit cee646d

File tree

5 files changed

+9
-13
lines changed

5 files changed

+9
-13
lines changed

drivers/net/wireless/mediatek/mt76/mac80211.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,7 @@ int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
745745
struct mt76_dev *dev = hw->priv;
746746
int n_chains = hweight8(dev->antenna_mask);
747747

748-
*dbm = dev->txpower_cur / 2;
748+
*dbm = DIV_ROUND_UP(dev->txpower_cur, 2);
749749

750750
/* convert from per-chain power to combined
751751
* output on 2x2 devices

drivers/net/wireless/mediatek/mt76/mt7603/init.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ mt7603_init_txpower(struct mt7603_dev *dev,
488488
for (i = 0; i < sband->n_channels; i++) {
489489
chan = &sband->channels[i];
490490
chan->max_power = target_power;
491+
chan->orig_mpwr = target_power;
491492
}
492493
}
493494

drivers/net/wireless/mediatek/mt76/mt76x0/init.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ mt76x0_init_txpower(struct mt76x02_dev *dev,
280280
mt76x0_get_power_info(dev, chan, &tp);
281281

282282
chan->max_power = (mt76x02_get_max_rate_power(&t) + tp) / 2;
283+
chan->orig_mpwr = chan->max_power;
283284
}
284285
}
285286

drivers/net/wireless/mediatek/mt76/mt76x2/init.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -165,27 +165,21 @@ void mt76x2_init_txpower(struct mt76x02_dev *dev,
165165
struct ieee80211_channel *chan;
166166
struct mt76x2_tx_power_info txp;
167167
struct mt76_rate_power t = {};
168-
int target_power;
169168
int i;
170169

171170
for (i = 0; i < sband->n_channels; i++) {
172171
chan = &sband->channels[i];
173172

174173
mt76x2_get_power_info(dev, &txp, chan);
175-
176-
target_power = max_t(int, (txp.chain[0].target_power +
177-
txp.chain[0].delta),
178-
(txp.chain[1].target_power +
179-
txp.chain[1].delta));
180-
181174
mt76x2_get_rate_power(dev, &t, chan);
182175

183176
chan->max_power = mt76x02_get_max_rate_power(&t) +
184-
target_power;
185-
chan->max_power /= 2;
177+
txp.target_power;
178+
chan->max_power = DIV_ROUND_UP(chan->max_power, 2);
186179

187180
/* convert to combined output power on 2x2 devices */
188181
chan->max_power += 3;
182+
chan->orig_mpwr = chan->max_power;
189183
}
190184
}
191185
EXPORT_SYMBOL_GPL(mt76x2_init_txpower);

drivers/net/wireless/mediatek/mt76/mt76x2/phy.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,12 @@ void mt76x2_phy_set_txpower(struct mt76x02_dev *dev)
161161
delta = txp.delta_bw80;
162162

163163
mt76x2_get_rate_power(dev, &t, chan);
164-
mt76x02_add_rate_power_offset(&t, txp.chain[0].target_power);
164+
mt76x02_add_rate_power_offset(&t, txp.target_power + delta);
165165
mt76x02_limit_rate_power(&t, dev->mt76.txpower_conf);
166166
dev->mt76.txpower_cur = mt76x02_get_max_rate_power(&t);
167167

168168
base_power = mt76x2_get_min_rate_power(&t);
169-
delta += base_power - txp.chain[0].target_power;
169+
delta = base_power - txp.target_power;
170170
txp_0 = txp.chain[0].target_power + txp.chain[0].delta + delta;
171171
txp_1 = txp.chain[1].target_power + txp.chain[1].delta + delta;
172172

@@ -182,7 +182,7 @@ void mt76x2_phy_set_txpower(struct mt76x02_dev *dev)
182182
}
183183

184184
mt76x02_add_rate_power_offset(&t, -base_power);
185-
dev->target_power = txp.chain[0].target_power;
185+
dev->target_power = txp.target_power;
186186
dev->target_power_delta[0] = txp_0 - txp.chain[0].target_power;
187187
dev->target_power_delta[1] = txp_1 - txp.chain[0].target_power;
188188
dev->mt76.rate_power = t;

0 commit comments

Comments
 (0)