Commit beaaeb6b authored by Felix Fietkau's avatar Felix Fietkau

mt76: move txpower and antenna mask to struct mt76_phy

Adds multiple wiphy support to mt76_get_txpower
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 9e5f6dd7
...@@ -121,7 +121,7 @@ static void mt76_init_stream_cap(struct mt76_dev *dev, ...@@ -121,7 +121,7 @@ static void mt76_init_stream_cap(struct mt76_dev *dev,
bool vht) bool vht)
{ {
struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap; struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap;
int i, nstream = hweight8(dev->antenna_mask); int i, nstream = hweight8(dev->phy.antenna_mask);
struct ieee80211_sta_vht_cap *vht_cap; struct ieee80211_sta_vht_cap *vht_cap;
u16 mcs_map = 0; u16 mcs_map = 0;
...@@ -326,8 +326,8 @@ int mt76_register_device(struct mt76_dev *dev, bool vht, ...@@ -326,8 +326,8 @@ int mt76_register_device(struct mt76_dev *dev, bool vht,
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AIRTIME_FAIRNESS); wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
wiphy->available_antennas_tx = dev->antenna_mask; wiphy->available_antennas_tx = dev->phy.antenna_mask;
wiphy->available_antennas_rx = dev->antenna_mask; wiphy->available_antennas_rx = dev->phy.antenna_mask;
hw->txq_data_size = sizeof(struct mt76_txq); hw->txq_data_size = sizeof(struct mt76_txq);
hw->max_tx_fragments = 16; hw->max_tx_fragments = 16;
...@@ -941,10 +941,10 @@ EXPORT_SYMBOL_GPL(mt76_sta_state); ...@@ -941,10 +941,10 @@ EXPORT_SYMBOL_GPL(mt76_sta_state);
int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
int *dbm) int *dbm)
{ {
struct mt76_dev *dev = hw->priv; struct mt76_phy *phy = hw->priv;
int n_chains = hweight8(dev->antenna_mask); int n_chains = hweight8(phy->antenna_mask);
*dbm = DIV_ROUND_UP(dev->txpower_cur, 2); *dbm = DIV_ROUND_UP(phy->txpower_cur, 2);
/* convert from per-chain power to combined /* convert from per-chain power to combined
* output power * output power
...@@ -1079,11 +1079,12 @@ EXPORT_SYMBOL_GPL(mt76_sw_scan_complete); ...@@ -1079,11 +1079,12 @@ EXPORT_SYMBOL_GPL(mt76_sw_scan_complete);
int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
{ {
struct mt76_dev *dev = hw->priv; struct mt76_phy *phy = hw->priv;
struct mt76_dev *dev = phy->dev;
mutex_lock(&dev->mutex); mutex_lock(&dev->mutex);
*tx_ant = dev->antenna_mask; *tx_ant = phy->antenna_mask;
*rx_ant = dev->antenna_mask; *rx_ant = phy->antenna_mask;
mutex_unlock(&dev->mutex); mutex_unlock(&dev->mutex);
return 0; return 0;
......
...@@ -468,6 +468,9 @@ struct mt76_phy { ...@@ -468,6 +468,9 @@ struct mt76_phy {
struct mt76_sband sband_2g; struct mt76_sband sband_2g;
struct mt76_sband sband_5g; struct mt76_sband sband_5g;
int txpower_cur;
u8 antenna_mask;
}; };
struct mt76_dev { struct mt76_dev {
...@@ -523,8 +526,6 @@ struct mt76_dev { ...@@ -523,8 +526,6 @@ struct mt76_dev {
u32 aggr_stats[32]; u32 aggr_stats[32];
u8 antenna_mask;
struct tasklet_struct pre_tbtt_tasklet; struct tasklet_struct pre_tbtt_tasklet;
int beacon_int; int beacon_int;
u8 beacon_mask; u8 beacon_mask;
...@@ -534,7 +535,6 @@ struct mt76_dev { ...@@ -534,7 +535,6 @@ struct mt76_dev {
struct mt76_hw_cap cap; struct mt76_hw_cap cap;
struct mt76_rate_power rate_power; struct mt76_rate_power rate_power;
int txpower_cur;
enum nl80211_dfs_regions region; enum nl80211_dfs_regions region;
......
...@@ -113,7 +113,7 @@ mt7603_dma_sched_init(struct mt7603_dev *dev) ...@@ -113,7 +113,7 @@ mt7603_dma_sched_init(struct mt7603_dev *dev)
static void static void
mt7603_phy_init(struct mt7603_dev *dev) mt7603_phy_init(struct mt7603_dev *dev)
{ {
int rx_chains = dev->mt76.antenna_mask; int rx_chains = dev->mphy.antenna_mask;
int tx_chains = hweight8(rx_chains) - 1; int tx_chains = hweight8(rx_chains) - 1;
mt76_rmw(dev, MT_WF_RMAC_RMCR, mt76_rmw(dev, MT_WF_RMAC_RMCR,
...@@ -493,12 +493,12 @@ mt7603_init_txpower(struct mt7603_dev *dev, ...@@ -493,12 +493,12 @@ mt7603_init_txpower(struct mt7603_dev *dev,
target_power += max_offset; target_power += max_offset;
dev->tx_power_limit = target_power; dev->tx_power_limit = target_power;
dev->mt76.txpower_cur = target_power; dev->mphy.txpower_cur = target_power;
target_power = DIV_ROUND_UP(target_power, 2); target_power = DIV_ROUND_UP(target_power, 2);
/* add 3 dBm for 2SS devices (combined output) */ /* add 3 dBm for 2SS devices (combined output) */
if (dev->mt76.antenna_mask & BIT(1)) if (dev->mphy.antenna_mask & BIT(1))
target_power += 3; target_power += 3;
for (i = 0; i < sband->n_channels; i++) { for (i = 0; i < sband->n_channels; i++) {
...@@ -535,9 +535,9 @@ int mt7603_register_device(struct mt7603_dev *dev) ...@@ -535,9 +535,9 @@ int mt7603_register_device(struct mt7603_dev *dev)
(unsigned long)dev); (unsigned long)dev);
/* Check for 7688, which only has 1SS */ /* Check for 7688, which only has 1SS */
dev->mt76.antenna_mask = 3; dev->mphy.antenna_mask = 3;
if (mt76_rr(dev, MT_EFUSE_BASE + 0x64) & BIT(4)) if (mt76_rr(dev, MT_EFUSE_BASE + 0x64) & BIT(4))
dev->mt76.antenna_mask = 1; dev->mphy.antenna_mask = 1;
dev->slottime = 9; dev->slottime = 9;
......
...@@ -609,7 +609,7 @@ mt7603_mac_fill_rx(struct mt7603_dev *dev, struct sk_buff *skb) ...@@ -609,7 +609,7 @@ mt7603_mac_fill_rx(struct mt7603_dev *dev, struct sk_buff *skb)
status->rate_idx = i; status->rate_idx = i;
status->chains = dev->mt76.antenna_mask; status->chains = dev->mphy.antenna_mask;
status->chain_signal[0] = FIELD_GET(MT_RXV4_IB_RSSI0, rxdg3) + status->chain_signal[0] = FIELD_GET(MT_RXV4_IB_RSSI0, rxdg3) +
dev->rssi_offset[0]; dev->rssi_offset[0];
status->chain_signal[1] = FIELD_GET(MT_RXV4_IB_RSSI1, rxdg3) + status->chain_signal[1] = FIELD_GET(MT_RXV4_IB_RSSI1, rxdg3) +
......
...@@ -432,7 +432,7 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev) ...@@ -432,7 +432,7 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev)
{ {
struct cfg80211_chan_def *chandef = &dev->mphy.chandef; struct cfg80211_chan_def *chandef = &dev->mphy.chandef;
struct ieee80211_hw *hw = mt76_hw(dev); struct ieee80211_hw *hw = mt76_hw(dev);
int n_chains = hweight8(dev->mt76.antenna_mask); int n_chains = hweight8(dev->mphy.antenna_mask);
struct { struct {
u8 control_chan; u8 control_chan;
u8 center_chan; u8 center_chan;
...@@ -461,11 +461,11 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev) ...@@ -461,11 +461,11 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev)
} }
tx_power = hw->conf.power_level * 2; tx_power = hw->conf.power_level * 2;
if (dev->mt76.antenna_mask == 3) if (dev->mphy.antenna_mask == 3)
tx_power -= 6; tx_power -= 6;
tx_power = min(tx_power, dev->tx_power_limit); tx_power = min(tx_power, dev->tx_power_limit);
dev->mt76.txpower_cur = tx_power; dev->mphy.txpower_cur = tx_power;
for (i = 0; i < ARRAY_SIZE(req.txpower); i++) for (i = 0; i < ARRAY_SIZE(req.txpower); i++)
req.txpower[i] = tx_power; req.txpower[i] = tx_power;
......
...@@ -126,7 +126,7 @@ static void mt7615_eeprom_parse_hw_cap(struct mt7615_dev *dev) ...@@ -126,7 +126,7 @@ static void mt7615_eeprom_parse_hw_cap(struct mt7615_dev *dev)
tx_mask = max_nss; tx_mask = max_nss;
dev->chainmask = tx_mask << 8 | rx_mask; dev->chainmask = tx_mask << 8 | rx_mask;
dev->mt76.antenna_mask = BIT(tx_mask) - 1; dev->mphy.antenna_mask = BIT(tx_mask) - 1;
} }
int mt7615_eeprom_get_power_index(struct mt7615_dev *dev, int mt7615_eeprom_get_power_index(struct mt7615_dev *dev,
......
...@@ -203,7 +203,7 @@ static void ...@@ -203,7 +203,7 @@ static void
mt7615_init_txpower(struct mt7615_dev *dev, mt7615_init_txpower(struct mt7615_dev *dev,
struct ieee80211_supported_band *sband) struct ieee80211_supported_band *sband)
{ {
int i, n_chains = hweight8(dev->mt76.antenna_mask), target_chains; int i, n_chains = hweight8(dev->mphy.antenna_mask), target_chains;
u8 *eep = (u8 *)dev->mt76.eeprom.data; u8 *eep = (u8 *)dev->mt76.eeprom.data;
enum nl80211_band band = sband->band; enum nl80211_band band = sband->band;
......
...@@ -218,14 +218,14 @@ int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb) ...@@ -218,14 +218,14 @@ int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
status->enc_flags |= RX_ENC_FLAG_STBC_MASK * stbc; status->enc_flags |= RX_ENC_FLAG_STBC_MASK * stbc;
status->chains = dev->mt76.antenna_mask; status->chains = dev->mphy.antenna_mask;
status->chain_signal[0] = to_rssi(MT_RXV4_RCPI0, rxdg3); status->chain_signal[0] = to_rssi(MT_RXV4_RCPI0, rxdg3);
status->chain_signal[1] = to_rssi(MT_RXV4_RCPI1, rxdg3); status->chain_signal[1] = to_rssi(MT_RXV4_RCPI1, rxdg3);
status->chain_signal[2] = to_rssi(MT_RXV4_RCPI2, rxdg3); status->chain_signal[2] = to_rssi(MT_RXV4_RCPI2, rxdg3);
status->chain_signal[3] = to_rssi(MT_RXV4_RCPI3, rxdg3); status->chain_signal[3] = to_rssi(MT_RXV4_RCPI3, rxdg3);
status->signal = status->chain_signal[0]; status->signal = status->chain_signal[0];
for (i = 1; i < hweight8(dev->mt76.antenna_mask); i++) { for (i = 1; i < hweight8(dev->mphy.antenna_mask); i++) {
if (!(status->chains & BIT(i))) if (!(status->chains & BIT(i)))
continue; continue;
......
...@@ -1158,7 +1158,7 @@ int mt7615_mcu_set_bcn(struct mt7615_dev *dev, struct ieee80211_vif *vif, ...@@ -1158,7 +1158,7 @@ int mt7615_mcu_set_bcn(struct mt7615_dev *dev, struct ieee80211_vif *vif,
int mt7615_mcu_set_tx_power(struct mt7615_dev *dev) int mt7615_mcu_set_tx_power(struct mt7615_dev *dev)
{ {
int i, ret, n_chains = hweight8(dev->mt76.antenna_mask); int i, ret, n_chains = hweight8(dev->mphy.antenna_mask);
struct cfg80211_chan_def *chandef = &dev->mphy.chandef; struct cfg80211_chan_def *chandef = &dev->mphy.chandef;
int freq = chandef->center_freq1, len, target_chains; int freq = chandef->center_freq1, len, target_chains;
u8 *req, *data, *eep = (u8 *)dev->mt76.eeprom.data; u8 *req, *data, *eep = (u8 *)dev->mt76.eeprom.data;
...@@ -1200,7 +1200,7 @@ int mt7615_mcu_set_tx_power(struct mt7615_dev *dev) ...@@ -1200,7 +1200,7 @@ int mt7615_mcu_set_tx_power(struct mt7615_dev *dev)
break; break;
} }
tx_power = max_t(s8, tx_power, 0); tx_power = max_t(s8, tx_power, 0);
dev->mt76.txpower_cur = tx_power; dev->mphy.txpower_cur = tx_power;
target_chains = mt7615_ext_pa_enabled(dev, band) ? 1 : n_chains; target_chains = mt7615_ext_pa_enabled(dev, band) ? 1 : n_chains;
for (i = 0; i < target_chains; i++) { for (i = 0; i < target_chains; i++) {
...@@ -1300,7 +1300,7 @@ int mt7615_mcu_set_channel(struct mt7615_dev *dev) ...@@ -1300,7 +1300,7 @@ int mt7615_mcu_set_channel(struct mt7615_dev *dev)
.control_chan = chandef->chan->hw_value, .control_chan = chandef->chan->hw_value,
.center_chan = ieee80211_frequency_to_channel(freq1), .center_chan = ieee80211_frequency_to_channel(freq1),
.tx_streams = (dev->chainmask >> 8) & 0xf, .tx_streams = (dev->chainmask >> 8) & 0xf,
.rx_streams_mask = dev->mt76.antenna_mask, .rx_streams_mask = dev->mphy.antenna_mask,
.center_chan2 = ieee80211_frequency_to_channel(freq2), .center_chan2 = ieee80211_frequency_to_channel(freq2),
}; };
int ret; int ret;
......
...@@ -849,7 +849,7 @@ void mt76x0_phy_set_txpower(struct mt76x02_dev *dev) ...@@ -849,7 +849,7 @@ void mt76x0_phy_set_txpower(struct mt76x02_dev *dev)
mt76x02_add_rate_power_offset(t, info); mt76x02_add_rate_power_offset(t, info);
mt76x02_limit_rate_power(t, dev->txpower_conf); mt76x02_limit_rate_power(t, dev->txpower_conf);
dev->mt76.txpower_cur = mt76x02_get_max_rate_power(t); dev->mphy.txpower_cur = mt76x02_get_max_rate_power(t);
mt76x02_add_rate_power_offset(t, -info); mt76x02_add_rate_power_offset(t, -info);
dev->target_power = info; dev->target_power = info;
......
...@@ -193,10 +193,10 @@ void mt76x02_init_device(struct mt76x02_dev *dev) ...@@ -193,10 +193,10 @@ void mt76x02_init_device(struct mt76x02_dev *dev)
dev->mphy.sband_5g.sband.ht_cap.cap |= dev->mphy.sband_5g.sband.ht_cap.cap |=
IEEE80211_HT_CAP_LDPC_CODING; IEEE80211_HT_CAP_LDPC_CODING;
dev->chainmask = 0x202; dev->chainmask = 0x202;
dev->mt76.antenna_mask = 3; dev->mphy.antenna_mask = 3;
} else { } else {
dev->chainmask = 0x101; dev->chainmask = 0x101;
dev->mt76.antenna_mask = 1; dev->mphy.antenna_mask = 1;
} }
} }
EXPORT_SYMBOL_GPL(mt76x02_init_device); EXPORT_SYMBOL_GPL(mt76x02_init_device);
......
...@@ -125,7 +125,7 @@ static int mt76x2_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, ...@@ -125,7 +125,7 @@ static int mt76x2_set_antenna(struct ieee80211_hw *hw, u32 tx_ant,
mutex_lock(&dev->mt76.mutex); mutex_lock(&dev->mt76.mutex);
dev->chainmask = (tx_ant == 3) ? 0x202 : 0x101; dev->chainmask = (tx_ant == 3) ? 0x202 : 0x101;
dev->mt76.antenna_mask = tx_ant; dev->mphy.antenna_mask = tx_ant;
mt76_set_stream_caps(&dev->mt76, true); mt76_set_stream_caps(&dev->mt76, true);
mt76x2_phy_set_antenna(dev); mt76x2_phy_set_antenna(dev);
......
...@@ -74,7 +74,7 @@ void mt76x2_phy_set_antenna(struct mt76x02_dev *dev) ...@@ -74,7 +74,7 @@ void mt76x2_phy_set_antenna(struct mt76x02_dev *dev)
val = mt76_rr(dev, MT_BBP(AGC, 0)); val = mt76_rr(dev, MT_BBP(AGC, 0));
val &= ~(BIT(4) | BIT(1)); val &= ~(BIT(4) | BIT(1));
switch (dev->mt76.antenna_mask) { switch (dev->mphy.antenna_mask) {
case 1: case 1:
/* disable mac DAC control */ /* disable mac DAC control */
mt76_clear(dev, MT_BBP(IBI, 9), BIT(11)); mt76_clear(dev, MT_BBP(IBI, 9), BIT(11));
......
...@@ -153,7 +153,7 @@ void mt76x2_phy_set_txpower(struct mt76x02_dev *dev) ...@@ -153,7 +153,7 @@ void mt76x2_phy_set_txpower(struct mt76x02_dev *dev)
mt76x2_get_rate_power(dev, &t, chan); mt76x2_get_rate_power(dev, &t, chan);
mt76x02_add_rate_power_offset(&t, txp.target_power + delta); mt76x02_add_rate_power_offset(&t, txp.target_power + delta);
mt76x02_limit_rate_power(&t, dev->txpower_conf); mt76x02_limit_rate_power(&t, dev->txpower_conf);
dev->mt76.txpower_cur = mt76x02_get_max_rate_power(&t); dev->mphy.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.target_power; delta = base_power - txp.target_power;
......
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