Commit 863c15a1 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau
Browse files

mt76: mt7615: enable survey support



Introduce channel survey support for mt7615 driver

Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent fc98e670
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -1155,6 +1155,29 @@ mt7615_mac_scs_check(struct mt7615_dev *dev)
		mt7615_mac_set_default_sensitivity(dev);
}

void mt7615_update_channel(struct mt76_dev *mdev)
{
	struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
	struct mt76_channel_state *state;
	ktime_t cur_time;
	u32 busy;

	if (!test_bit(MT76_STATE_RUNNING, &mdev->state))
		return;

	state = mt76_channel_state(mdev, mdev->chandef.chan);
	/* TODO: add DBDC support */
	busy = mt76_get_field(dev, MT_MIB_SDR16(0), MT_MIB_BUSY_MASK);

	spin_lock_bh(&mdev->cc_lock);
	cur_time = ktime_get_boottime();
	state->cc_busy += busy;
	state->cc_active += ktime_to_us(ktime_sub(cur_time,
						  mdev->survey_time));
	mdev->survey_time = cur_time;
	spin_unlock_bh(&mdev->cc_lock);
}

void mt7615_mac_work(struct work_struct *work)
{
	struct mt7615_dev *dev;
@@ -1163,6 +1186,7 @@ void mt7615_mac_work(struct work_struct *work)
						mac_work.work);

	mutex_lock(&dev->mt76.mutex);
	mt7615_update_channel(&dev->mt76);
	if (++dev->mac_work_count == 5) {
		mt7615_mac_scs_check(dev);
		dev->mac_work_count = 0;
+5 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ static int mt7615_start(struct ieee80211_hw *hw)
{
	struct mt7615_dev *dev = hw->priv;

	dev->mt76.survey_time = ktime_get_boottime();
	set_bit(MT76_STATE_RUNNING, &dev->mt76.state);
	ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mt76.mac_work,
				     MT7615_WATCHDOG_TIME);
@@ -149,6 +150,9 @@ static int mt7615_set_channel(struct mt7615_dev *dev)

	ret = mt7615_dfs_init_radar_detector(dev);
	mt7615_mac_cca_stats_reset(dev);
	dev->mt76.survey_time = ktime_get_boottime();
	/* TODO: add DBDC support */
	mt76_rr(dev, MT_MIB_SDR16(0));

out:
	clear_bit(MT76_RESET, &dev->mt76.state);
@@ -521,4 +525,5 @@ const struct ieee80211_ops mt7615_ops = {
	.release_buffered_frames = mt76_release_buffered_frames,
	.get_txpower = mt76_get_txpower,
	.channel_switch_beacon = mt7615_channel_switch_beacon,
	.get_survey = mt76_get_survey,
};
+1 −0
Original line number Diff line number Diff line
@@ -228,6 +228,7 @@ static inline void mt7615_irq_disable(struct mt7615_dev *dev, u32 mask)
	mt76_set_irq_mask(&dev->mt76, MT_INT_MASK_CSR, mask, 0);
}

void mt7615_update_channel(struct mt76_dev *mdev);
void mt7615_mac_cca_stats_reset(struct mt7615_dev *dev);
void mt7615_mac_set_scs(struct mt7615_dev *dev, bool enable);
int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,
+1 −0
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ static int mt7615_pci_probe(struct pci_dev *pdev,
		.sta_add = mt7615_sta_add,
		.sta_assoc = mt7615_sta_assoc,
		.sta_remove = mt7615_sta_remove,
		.update_survey = mt7615_update_channel,
	};
	struct mt7615_dev *dev;
	struct mt76_dev *mdev;
+3 −0
Original line number Diff line number Diff line
@@ -255,6 +255,9 @@
#define MT_MIB_RTS_RETRIES_COUNT_MASK	GENMASK(31, 16)
#define MT_MIB_RTS_COUNT_MASK		GENMASK(15, 0)

#define MT_MIB_SDR16(n)			MT_WF_MIB(0x48 + ((n) << 9))
#define MT_MIB_BUSY_MASK		GENMASK(23, 0)

#define MT_EFUSE_BASE			0x81070000
#define MT_EFUSE_BASE_CTRL		0x000
#define MT_EFUSE_BASE_CTRL_EMPTY	BIT(30)