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

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
...@@ -1155,6 +1155,29 @@ mt7615_mac_scs_check(struct mt7615_dev *dev) ...@@ -1155,6 +1155,29 @@ mt7615_mac_scs_check(struct mt7615_dev *dev)
mt7615_mac_set_default_sensitivity(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) void mt7615_mac_work(struct work_struct *work)
{ {
struct mt7615_dev *dev; struct mt7615_dev *dev;
...@@ -1163,6 +1186,7 @@ void mt7615_mac_work(struct work_struct *work) ...@@ -1163,6 +1186,7 @@ void mt7615_mac_work(struct work_struct *work)
mac_work.work); mac_work.work);
mutex_lock(&dev->mt76.mutex); mutex_lock(&dev->mt76.mutex);
mt7615_update_channel(&dev->mt76);
if (++dev->mac_work_count == 5) { if (++dev->mac_work_count == 5) {
mt7615_mac_scs_check(dev); mt7615_mac_scs_check(dev);
dev->mac_work_count = 0; dev->mac_work_count = 0;
......
...@@ -16,6 +16,7 @@ static int mt7615_start(struct ieee80211_hw *hw) ...@@ -16,6 +16,7 @@ static int mt7615_start(struct ieee80211_hw *hw)
{ {
struct mt7615_dev *dev = hw->priv; struct mt7615_dev *dev = hw->priv;
dev->mt76.survey_time = ktime_get_boottime();
set_bit(MT76_STATE_RUNNING, &dev->mt76.state); set_bit(MT76_STATE_RUNNING, &dev->mt76.state);
ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mt76.mac_work, ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mt76.mac_work,
MT7615_WATCHDOG_TIME); MT7615_WATCHDOG_TIME);
...@@ -149,6 +150,9 @@ static int mt7615_set_channel(struct mt7615_dev *dev) ...@@ -149,6 +150,9 @@ static int mt7615_set_channel(struct mt7615_dev *dev)
ret = mt7615_dfs_init_radar_detector(dev); ret = mt7615_dfs_init_radar_detector(dev);
mt7615_mac_cca_stats_reset(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: out:
clear_bit(MT76_RESET, &dev->mt76.state); clear_bit(MT76_RESET, &dev->mt76.state);
...@@ -521,4 +525,5 @@ const struct ieee80211_ops mt7615_ops = { ...@@ -521,4 +525,5 @@ const struct ieee80211_ops mt7615_ops = {
.release_buffered_frames = mt76_release_buffered_frames, .release_buffered_frames = mt76_release_buffered_frames,
.get_txpower = mt76_get_txpower, .get_txpower = mt76_get_txpower,
.channel_switch_beacon = mt7615_channel_switch_beacon, .channel_switch_beacon = mt7615_channel_switch_beacon,
.get_survey = mt76_get_survey,
}; };
...@@ -228,6 +228,7 @@ static inline void mt7615_irq_disable(struct mt7615_dev *dev, u32 mask) ...@@ -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); 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_cca_stats_reset(struct mt7615_dev *dev);
void mt7615_mac_set_scs(struct mt7615_dev *dev, bool enable); void mt7615_mac_set_scs(struct mt7615_dev *dev, bool enable);
int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi, int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,
......
...@@ -81,6 +81,7 @@ static int mt7615_pci_probe(struct pci_dev *pdev, ...@@ -81,6 +81,7 @@ static int mt7615_pci_probe(struct pci_dev *pdev,
.sta_add = mt7615_sta_add, .sta_add = mt7615_sta_add,
.sta_assoc = mt7615_sta_assoc, .sta_assoc = mt7615_sta_assoc,
.sta_remove = mt7615_sta_remove, .sta_remove = mt7615_sta_remove,
.update_survey = mt7615_update_channel,
}; };
struct mt7615_dev *dev; struct mt7615_dev *dev;
struct mt76_dev *mdev; struct mt76_dev *mdev;
......
...@@ -255,6 +255,9 @@ ...@@ -255,6 +255,9 @@
#define MT_MIB_RTS_RETRIES_COUNT_MASK GENMASK(31, 16) #define MT_MIB_RTS_RETRIES_COUNT_MASK GENMASK(31, 16)
#define MT_MIB_RTS_COUNT_MASK GENMASK(15, 0) #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 0x81070000
#define MT_EFUSE_BASE_CTRL 0x000 #define MT_EFUSE_BASE_CTRL 0x000
#define MT_EFUSE_BASE_CTRL_EMPTY BIT(30) #define MT_EFUSE_BASE_CTRL_EMPTY BIT(30)
......
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