mt76: mt7615: enable survey support
authorLorenzo Bianconi <lorenzo@kernel.org>
Mon, 5 Aug 2019 06:55:53 +0000 (08:55 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 5 Sep 2019 15:42:31 +0000 (17:42 +0200)
Introduce channel survey support for mt7615 driver

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
drivers/net/wireless/mediatek/mt76/mt7615/main.c
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
drivers/net/wireless/mediatek/mt76/mt7615/pci.c
drivers/net/wireless/mediatek/mt76/mt7615/regs.h

index 0554aa2..cf6bef1 100644 (file)
@@ -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;
index 5fdda85..0b53bbd 100644 (file)
@@ -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,
 };
index 4e6ab3a..a79f4ff 100644 (file)
@@ -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,
index 9e82cb5..e250607 100644 (file)
@@ -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;
index 12fc12e..b193814 100644 (file)
 #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)