Commit b6862eff authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau

mt76: move mt76_rate_power in mt76_dev

Move mt76_rate_power data structure from mt76x2_dev to mt76_dev in order
to share it with mt76x0 driver. Moreover move txpower_conf and
txpower_cur in mt76_dev
Signed-off-by: default avatarLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 2cf5ac31
...@@ -275,6 +275,19 @@ struct mt76_sband { ...@@ -275,6 +275,19 @@ struct mt76_sband {
struct mt76_channel_state *chan; struct mt76_channel_state *chan;
}; };
struct mt76_rate_power {
union {
struct {
s8 cck[4];
s8 ofdm[8];
s8 stbc[10];
s8 ht[16];
s8 vht[10];
};
s8 all[48];
};
};
/* addr req mask */ /* addr req mask */
#define MT_VEND_TYPE_EEPROM BIT(31) #define MT_VEND_TYPE_EEPROM BIT(31)
#define MT_VEND_TYPE_CFG BIT(30) #define MT_VEND_TYPE_CFG BIT(30)
...@@ -395,6 +408,10 @@ struct mt76_dev { ...@@ -395,6 +408,10 @@ struct mt76_dev {
struct debugfs_blob_wrapper otp; struct debugfs_blob_wrapper otp;
struct mt76_hw_cap cap; struct mt76_hw_cap cap;
struct mt76_rate_power rate_power;
int txpower_conf;
int txpower_cur;
u32 debugfs_reg; u32 debugfs_reg;
struct led_classdev led_cdev; struct led_classdev led_cdev;
...@@ -418,19 +435,6 @@ enum mt76_phy_type { ...@@ -418,19 +435,6 @@ enum mt76_phy_type {
MT_PHY_TYPE_VHT, MT_PHY_TYPE_VHT,
}; };
struct mt76_rate_power {
union {
struct {
s8 cck[4];
s8 ofdm[8];
s8 stbc[10];
s8 ht[16];
s8 vht[10];
};
s8 all[48];
};
};
struct mt76_rx_status { struct mt76_rx_status {
struct mt76_wcid *wcid; struct mt76_wcid *wcid;
......
...@@ -82,8 +82,6 @@ struct mt76x2_dev { ...@@ -82,8 +82,6 @@ struct mt76x2_dev {
struct mutex mutex; struct mutex mutex;
const u16 *beacon_offsets; const u16 *beacon_offsets;
int txpower_conf;
int txpower_cur;
u8 txdone_seq; u8 txdone_seq;
DECLARE_KFIFO_PTR(txstatus_fifo, struct mt76x02_tx_status); DECLARE_KFIFO_PTR(txstatus_fifo, struct mt76x02_tx_status);
...@@ -113,7 +111,6 @@ struct mt76x2_dev { ...@@ -113,7 +111,6 @@ struct mt76x2_dev {
s8 target_power; s8 target_power;
s8 target_power_delta[2]; s8 target_power_delta[2];
struct mt76_rate_power rate_power;
bool enable_tpc; bool enable_tpc;
u8 coverage_class; u8 coverage_class;
......
...@@ -55,16 +55,16 @@ static int read_txpower(struct seq_file *file, void *data) ...@@ -55,16 +55,16 @@ static int read_txpower(struct seq_file *file, void *data)
mt76_seq_puts_array(file, "Delta", dev->target_power_delta, mt76_seq_puts_array(file, "Delta", dev->target_power_delta,
ARRAY_SIZE(dev->target_power_delta)); ARRAY_SIZE(dev->target_power_delta));
mt76_seq_puts_array(file, "CCK", dev->rate_power.cck, mt76_seq_puts_array(file, "CCK", dev->mt76.rate_power.cck,
ARRAY_SIZE(dev->rate_power.cck)); ARRAY_SIZE(dev->mt76.rate_power.cck));
mt76_seq_puts_array(file, "OFDM", dev->rate_power.ofdm, mt76_seq_puts_array(file, "OFDM", dev->mt76.rate_power.ofdm,
ARRAY_SIZE(dev->rate_power.ofdm)); ARRAY_SIZE(dev->mt76.rate_power.ofdm));
mt76_seq_puts_array(file, "STBC", dev->rate_power.stbc, mt76_seq_puts_array(file, "STBC", dev->mt76.rate_power.stbc,
ARRAY_SIZE(dev->rate_power.stbc)); ARRAY_SIZE(dev->mt76.rate_power.stbc));
mt76_seq_puts_array(file, "HT", dev->rate_power.ht, mt76_seq_puts_array(file, "HT", dev->mt76.rate_power.ht,
ARRAY_SIZE(dev->rate_power.ht)); ARRAY_SIZE(dev->mt76.rate_power.ht));
mt76_seq_puts_array(file, "VHT", dev->rate_power.vht, mt76_seq_puts_array(file, "VHT", dev->mt76.rate_power.vht,
ARRAY_SIZE(dev->rate_power.vht)); ARRAY_SIZE(dev->mt76.rate_power.vht));
return 0; return 0;
} }
......
...@@ -100,7 +100,7 @@ void mt76x2_mac_write_txwi(struct mt76x2_dev *dev, struct mt76x02_txwi *txwi, ...@@ -100,7 +100,7 @@ void mt76x2_mac_write_txwi(struct mt76x2_dev *dev, struct mt76x02_txwi *txwi,
} }
spin_unlock_bh(&dev->mt76.lock); spin_unlock_bh(&dev->mt76.lock);
txpwr_adj = mt76x2_tx_get_txpwr_adj(dev, dev->txpower_conf, txpwr_adj = mt76x2_tx_get_txpwr_adj(dev, dev->mt76.txpower_conf,
max_txpwr_adj); max_txpwr_adj);
txwi->ctl2 = FIELD_PREP(MT_TX_PWR_ADJ, txpwr_adj); txwi->ctl2 = FIELD_PREP(MT_TX_PWR_ADJ, txpwr_adj);
......
...@@ -106,14 +106,14 @@ mt76x2_config(struct ieee80211_hw *hw, u32 changed) ...@@ -106,14 +106,14 @@ mt76x2_config(struct ieee80211_hw *hw, u32 changed)
} }
if (changed & IEEE80211_CONF_CHANGE_POWER) { if (changed & IEEE80211_CONF_CHANGE_POWER) {
dev->txpower_conf = hw->conf.power_level * 2; dev->mt76.txpower_conf = hw->conf.power_level * 2;
/* convert to per-chain power for 2x2 devices */ /* convert to per-chain power for 2x2 devices */
dev->txpower_conf -= 6; dev->mt76.txpower_conf -= 6;
if (test_bit(MT76_STATE_RUNNING, &dev->mt76.state)) { if (test_bit(MT76_STATE_RUNNING, &dev->mt76.state)) {
mt76x2_phy_set_txpower(dev); mt76x2_phy_set_txpower(dev);
mt76x2_tx_set_txpwr_auto(dev, dev->txpower_conf); mt76x2_tx_set_txpwr_auto(dev, dev->mt76.txpower_conf);
} }
} }
...@@ -206,7 +206,7 @@ mt76x2_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, int *dbm) ...@@ -206,7 +206,7 @@ mt76x2_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, int *dbm)
{ {
struct mt76x2_dev *dev = hw->priv; struct mt76x2_dev *dev = hw->priv;
*dbm = dev->txpower_cur / 2; *dbm = dev->mt76.txpower_cur / 2;
/* convert from per-chain power to combined output on 2x2 devices */ /* convert from per-chain power to combined output on 2x2 devices */
*dbm += 3; *dbm += 3;
......
...@@ -192,8 +192,8 @@ void mt76x2_phy_set_txpower(struct mt76x2_dev *dev) ...@@ -192,8 +192,8 @@ void mt76x2_phy_set_txpower(struct mt76x2_dev *dev)
mt76x2_get_rate_power(dev, &t, chan); mt76x2_get_rate_power(dev, &t, chan);
mt76x2_add_rate_power_offset(&t, txp.chain[0].target_power); mt76x2_add_rate_power_offset(&t, txp.chain[0].target_power);
mt76x2_limit_rate_power(&t, dev->txpower_conf); mt76x2_limit_rate_power(&t, dev->mt76.txpower_conf);
dev->txpower_cur = mt76x2_get_max_rate_power(&t); dev->mt76.txpower_cur = mt76x2_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.chain[0].target_power;
...@@ -215,7 +215,7 @@ void mt76x2_phy_set_txpower(struct mt76x2_dev *dev) ...@@ -215,7 +215,7 @@ void mt76x2_phy_set_txpower(struct mt76x2_dev *dev)
dev->target_power = txp.chain[0].target_power; dev->target_power = txp.chain[0].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->rate_power = t; dev->mt76.rate_power = t;
mt76_rmw_field(dev, MT_TX_ALC_CFG_0, MT_TX_ALC_CFG_0_CH_INIT_0, txp_0); mt76_rmw_field(dev, MT_TX_ALC_CFG_0, MT_TX_ALC_CFG_0_CH_INIT_0, txp_0);
mt76_rmw_field(dev, MT_TX_ALC_CFG_0, MT_TX_ALC_CFG_0_CH_INIT_1, txp_1); mt76_rmw_field(dev, MT_TX_ALC_CFG_0, MT_TX_ALC_CFG_0_CH_INIT_1, txp_1);
......
...@@ -57,23 +57,23 @@ s8 mt76x2_tx_get_max_txpwr_adj(struct mt76_dev *mdev, ...@@ -57,23 +57,23 @@ s8 mt76x2_tx_get_max_txpwr_adj(struct mt76_dev *mdev,
u8 mcs = ieee80211_rate_get_vht_mcs(rate); u8 mcs = ieee80211_rate_get_vht_mcs(rate);
if (mcs == 8 || mcs == 9) { if (mcs == 8 || mcs == 9) {
max_txpwr = dev->rate_power.vht[8]; max_txpwr = mdev->rate_power.vht[8];
} else { } else {
u8 nss, idx; u8 nss, idx;
nss = ieee80211_rate_get_vht_nss(rate); nss = ieee80211_rate_get_vht_nss(rate);
idx = ((nss - 1) << 3) + mcs; idx = ((nss - 1) << 3) + mcs;
max_txpwr = dev->rate_power.ht[idx & 0xf]; max_txpwr = mdev->rate_power.ht[idx & 0xf];
} }
} else if (rate->flags & IEEE80211_TX_RC_MCS) { } else if (rate->flags & IEEE80211_TX_RC_MCS) {
max_txpwr = dev->rate_power.ht[rate->idx & 0xf]; max_txpwr = mdev->rate_power.ht[rate->idx & 0xf];
} else { } else {
enum nl80211_band band = dev->mt76.chandef.chan->band; enum nl80211_band band = dev->mt76.chandef.chan->band;
if (band == NL80211_BAND_2GHZ) { if (band == NL80211_BAND_2GHZ) {
const struct ieee80211_rate *r; const struct ieee80211_rate *r;
struct wiphy *wiphy = mt76_hw(dev)->wiphy; struct wiphy *wiphy = mt76_hw(dev)->wiphy;
struct mt76_rate_power *rp = &dev->rate_power; struct mt76_rate_power *rp = &mdev->rate_power;
r = &wiphy->bands[band]->bitrates[rate->idx]; r = &wiphy->bands[band]->bitrates[rate->idx];
if (r->flags & IEEE80211_RATE_SHORT_PREAMBLE) if (r->flags & IEEE80211_RATE_SHORT_PREAMBLE)
...@@ -81,7 +81,7 @@ s8 mt76x2_tx_get_max_txpwr_adj(struct mt76_dev *mdev, ...@@ -81,7 +81,7 @@ s8 mt76x2_tx_get_max_txpwr_adj(struct mt76_dev *mdev,
else else
max_txpwr = rp->ofdm[r->hw_value & 0x7]; max_txpwr = rp->ofdm[r->hw_value & 0x7];
} else { } else {
max_txpwr = dev->rate_power.ofdm[rate->idx & 0x7]; max_txpwr = mdev->rate_power.ofdm[rate->idx & 0x7];
} }
} }
...@@ -91,7 +91,7 @@ EXPORT_SYMBOL_GPL(mt76x2_tx_get_max_txpwr_adj); ...@@ -91,7 +91,7 @@ EXPORT_SYMBOL_GPL(mt76x2_tx_get_max_txpwr_adj);
s8 mt76x2_tx_get_txpwr_adj(struct mt76x2_dev *dev, s8 txpwr, s8 max_txpwr_adj) s8 mt76x2_tx_get_txpwr_adj(struct mt76x2_dev *dev, s8 txpwr, s8 max_txpwr_adj)
{ {
txpwr = min_t(s8, txpwr, dev->txpower_conf); txpwr = min_t(s8, txpwr, dev->mt76.txpower_conf);
txpwr -= (dev->target_power + dev->target_power_delta[0]); txpwr -= (dev->target_power + dev->target_power_delta[0]);
txpwr = min_t(s8, txpwr, max_txpwr_adj); txpwr = min_t(s8, txpwr, max_txpwr_adj);
...@@ -109,7 +109,7 @@ void mt76x2_tx_set_txpwr_auto(struct mt76x2_dev *dev, s8 txpwr) ...@@ -109,7 +109,7 @@ void mt76x2_tx_set_txpwr_auto(struct mt76x2_dev *dev, s8 txpwr)
s8 txpwr_adj; s8 txpwr_adj;
txpwr_adj = mt76x2_tx_get_txpwr_adj(dev, txpwr, txpwr_adj = mt76x2_tx_get_txpwr_adj(dev, txpwr,
dev->rate_power.ofdm[4]); dev->mt76.rate_power.ofdm[4]);
mt76_rmw_field(dev, MT_PROT_AUTO_TX_CFG, mt76_rmw_field(dev, MT_PROT_AUTO_TX_CFG,
MT_PROT_AUTO_TX_CFG_PROT_PADJ, txpwr_adj); MT_PROT_AUTO_TX_CFG_PROT_PADJ, txpwr_adj);
mt76_rmw_field(dev, MT_PROT_AUTO_TX_CFG, mt76_rmw_field(dev, MT_PROT_AUTO_TX_CFG,
......
...@@ -128,10 +128,10 @@ mt76x2u_config(struct ieee80211_hw *hw, u32 changed) ...@@ -128,10 +128,10 @@ mt76x2u_config(struct ieee80211_hw *hw, u32 changed)
} }
if (changed & IEEE80211_CONF_CHANGE_POWER) { if (changed & IEEE80211_CONF_CHANGE_POWER) {
dev->txpower_conf = hw->conf.power_level * 2; dev->mt76.txpower_conf = hw->conf.power_level * 2;
/* convert to per-chain power for 2x2 devices */ /* convert to per-chain power for 2x2 devices */
dev->txpower_conf -= 6; dev->mt76.txpower_conf -= 6;
if (test_bit(MT76_STATE_RUNNING, &dev->mt76.state)) if (test_bit(MT76_STATE_RUNNING, &dev->mt76.state))
mt76x2_phy_set_txpower(dev); mt76x2_phy_set_txpower(dev);
......
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