Commit cee646d6 authored by Felix Fietkau's avatar Felix Fietkau

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: default avatarFelix Fietkau <nbd@nbd.name>
parent def34a2f
...@@ -745,7 +745,7 @@ int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -745,7 +745,7 @@ int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct mt76_dev *dev = hw->priv; struct mt76_dev *dev = hw->priv;
int n_chains = hweight8(dev->antenna_mask); int n_chains = hweight8(dev->antenna_mask);
*dbm = dev->txpower_cur / 2; *dbm = DIV_ROUND_UP(dev->txpower_cur, 2);
/* convert from per-chain power to combined /* convert from per-chain power to combined
* output on 2x2 devices * output on 2x2 devices
......
...@@ -488,6 +488,7 @@ mt7603_init_txpower(struct mt7603_dev *dev, ...@@ -488,6 +488,7 @@ mt7603_init_txpower(struct mt7603_dev *dev,
for (i = 0; i < sband->n_channels; i++) { for (i = 0; i < sband->n_channels; i++) {
chan = &sband->channels[i]; chan = &sband->channels[i];
chan->max_power = target_power; chan->max_power = target_power;
chan->orig_mpwr = target_power;
} }
} }
......
...@@ -280,6 +280,7 @@ mt76x0_init_txpower(struct mt76x02_dev *dev, ...@@ -280,6 +280,7 @@ mt76x0_init_txpower(struct mt76x02_dev *dev,
mt76x0_get_power_info(dev, chan, &tp); mt76x0_get_power_info(dev, chan, &tp);
chan->max_power = (mt76x02_get_max_rate_power(&t) + tp) / 2; chan->max_power = (mt76x02_get_max_rate_power(&t) + tp) / 2;
chan->orig_mpwr = chan->max_power;
} }
} }
......
...@@ -165,27 +165,21 @@ void mt76x2_init_txpower(struct mt76x02_dev *dev, ...@@ -165,27 +165,21 @@ void mt76x2_init_txpower(struct mt76x02_dev *dev,
struct ieee80211_channel *chan; struct ieee80211_channel *chan;
struct mt76x2_tx_power_info txp; struct mt76x2_tx_power_info txp;
struct mt76_rate_power t = {}; struct mt76_rate_power t = {};
int target_power;
int i; int i;
for (i = 0; i < sband->n_channels; i++) { for (i = 0; i < sband->n_channels; i++) {
chan = &sband->channels[i]; chan = &sband->channels[i];
mt76x2_get_power_info(dev, &txp, chan); mt76x2_get_power_info(dev, &txp, chan);
target_power = max_t(int, (txp.chain[0].target_power +
txp.chain[0].delta),
(txp.chain[1].target_power +
txp.chain[1].delta));
mt76x2_get_rate_power(dev, &t, chan); mt76x2_get_rate_power(dev, &t, chan);
chan->max_power = mt76x02_get_max_rate_power(&t) + chan->max_power = mt76x02_get_max_rate_power(&t) +
target_power; txp.target_power;
chan->max_power /= 2; chan->max_power = DIV_ROUND_UP(chan->max_power, 2);
/* convert to combined output power on 2x2 devices */ /* convert to combined output power on 2x2 devices */
chan->max_power += 3; chan->max_power += 3;
chan->orig_mpwr = chan->max_power;
} }
} }
EXPORT_SYMBOL_GPL(mt76x2_init_txpower); EXPORT_SYMBOL_GPL(mt76x2_init_txpower);
...@@ -161,12 +161,12 @@ void mt76x2_phy_set_txpower(struct mt76x02_dev *dev) ...@@ -161,12 +161,12 @@ void mt76x2_phy_set_txpower(struct mt76x02_dev *dev)
delta = txp.delta_bw80; delta = txp.delta_bw80;
mt76x2_get_rate_power(dev, &t, chan); mt76x2_get_rate_power(dev, &t, chan);
mt76x02_add_rate_power_offset(&t, txp.chain[0].target_power); mt76x02_add_rate_power_offset(&t, txp.target_power + delta);
mt76x02_limit_rate_power(&t, dev->mt76.txpower_conf); mt76x02_limit_rate_power(&t, dev->mt76.txpower_conf);
dev->mt76.txpower_cur = mt76x02_get_max_rate_power(&t); dev->mt76.txpower_cur = mt76x02_get_max_rate_power(&t);
base_power = mt76x2_get_min_rate_power(&t); base_power = mt76x2_get_min_rate_power(&t);
delta += base_power - txp.chain[0].target_power; delta = base_power - txp.target_power;
txp_0 = txp.chain[0].target_power + txp.chain[0].delta + delta; txp_0 = txp.chain[0].target_power + txp.chain[0].delta + delta;
txp_1 = txp.chain[1].target_power + txp.chain[1].delta + delta; txp_1 = txp.chain[1].target_power + txp.chain[1].delta + delta;
...@@ -182,7 +182,7 @@ void mt76x2_phy_set_txpower(struct mt76x02_dev *dev) ...@@ -182,7 +182,7 @@ void mt76x2_phy_set_txpower(struct mt76x02_dev *dev)
} }
mt76x02_add_rate_power_offset(&t, -base_power); mt76x02_add_rate_power_offset(&t, -base_power);
dev->target_power = txp.chain[0].target_power; dev->target_power = txp.target_power;
dev->target_power_delta[0] = txp_0 - txp.chain[0].target_power; dev->target_power_delta[0] = txp_0 - txp.chain[0].target_power;
dev->target_power_delta[1] = txp_1 - txp.chain[0].target_power; dev->target_power_delta[1] = txp_1 - txp.chain[0].target_power;
dev->mt76.rate_power = t; dev->mt76.rate_power = t;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment