Commit beaaeb6b authored by Felix Fietkau's avatar Felix Fietkau
Browse files

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
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -121,7 +121,7 @@ static void mt76_init_stream_cap(struct mt76_dev *dev,
				 bool vht)
{
	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;
	u16 mcs_map = 0;

@@ -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_AIRTIME_FAIRNESS);

	wiphy->available_antennas_tx = dev->antenna_mask;
	wiphy->available_antennas_rx = dev->antenna_mask;
	wiphy->available_antennas_tx = dev->phy.antenna_mask;
	wiphy->available_antennas_rx = dev->phy.antenna_mask;

	hw->txq_data_size = sizeof(struct mt76_txq);
	hw->max_tx_fragments = 16;
@@ -941,10 +941,10 @@ EXPORT_SYMBOL_GPL(mt76_sta_state);
int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
		     int *dbm)
{
	struct mt76_dev *dev = hw->priv;
	int n_chains = hweight8(dev->antenna_mask);
	struct mt76_phy *phy = hw->priv;
	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
	 * output power
@@ -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)
{
	struct mt76_dev *dev = hw->priv;
	struct mt76_phy *phy = hw->priv;
	struct mt76_dev *dev = phy->dev;

	mutex_lock(&dev->mutex);
	*tx_ant = dev->antenna_mask;
	*rx_ant = dev->antenna_mask;
	*tx_ant = phy->antenna_mask;
	*rx_ant = phy->antenna_mask;
	mutex_unlock(&dev->mutex);

	return 0;
+3 −3
Original line number Diff line number Diff line
@@ -468,6 +468,9 @@ struct mt76_phy {

	struct mt76_sband sband_2g;
	struct mt76_sband sband_5g;

	int txpower_cur;
	u8 antenna_mask;
};

struct mt76_dev {
@@ -523,8 +526,6 @@ struct mt76_dev {

	u32 aggr_stats[32];

	u8 antenna_mask;

	struct tasklet_struct pre_tbtt_tasklet;
	int beacon_int;
	u8 beacon_mask;
@@ -534,7 +535,6 @@ struct mt76_dev {
	struct mt76_hw_cap cap;

	struct mt76_rate_power rate_power;
	int txpower_cur;

	enum nl80211_dfs_regions region;

+5 −5
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ mt7603_dma_sched_init(struct mt7603_dev *dev)
static void
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;

	mt76_rmw(dev, MT_WF_RMAC_RMCR,
@@ -493,12 +493,12 @@ mt7603_init_txpower(struct mt7603_dev *dev,
	target_power += max_offset;

	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);

	/* 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;

	for (i = 0; i < sband->n_channels; i++) {
@@ -535,9 +535,9 @@ int mt7603_register_device(struct mt7603_dev *dev)
		     (unsigned long)dev);

	/* 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))
		dev->mt76.antenna_mask = 1;
		dev->mphy.antenna_mask = 1;

	dev->slottime = 9;

+1 −1
Original line number Diff line number Diff line
@@ -609,7 +609,7 @@ mt7603_mac_fill_rx(struct mt7603_dev *dev, struct sk_buff *skb)

		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) +
					  dev->rssi_offset[0];
		status->chain_signal[1] = FIELD_GET(MT_RXV4_IB_RSSI1, rxdg3) +
+3 −3
Original line number Diff line number Diff line
@@ -432,7 +432,7 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev)
{
	struct cfg80211_chan_def *chandef = &dev->mphy.chandef;
	struct ieee80211_hw *hw = mt76_hw(dev);
	int n_chains = hweight8(dev->mt76.antenna_mask);
	int n_chains = hweight8(dev->mphy.antenna_mask);
	struct {
		u8 control_chan;
		u8 center_chan;
@@ -461,11 +461,11 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev)
	}

	tx_power = hw->conf.power_level * 2;
	if (dev->mt76.antenna_mask == 3)
	if (dev->mphy.antenna_mask == 3)
		tx_power -= 6;
	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++)
		req.txpower[i] = tx_power;
Loading