mt76: unify channel survey update code
authorFelix Fietkau <nbd@nbd.name>
Thu, 5 Sep 2019 16:29:13 +0000 (18:29 +0200)
committerFelix Fietkau <nbd@nbd.name>
Wed, 20 Nov 2019 12:23:49 +0000 (13:23 +0100)
Host time is used to calculate the channel active time on mt7603 and mt7615.
Use the same on mt76x02 and move the lock to core code to get rid of some
duplicated code.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt7603/mac.c
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
drivers/net/wireless/mediatek/mt76/mt76x0/main.c
drivers/net/wireless/mediatek/mt76/mt76x02_mac.c
drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c
drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c

index 38db311b3ca82666e7ae582d0af8fec5a46b6c6c..10d736967fbbb1e77b17e2291cb179cf14e77946 100644 (file)
@@ -416,13 +416,25 @@ mt76_channel_state(struct mt76_dev *dev, struct ieee80211_channel *c)
 
 void mt76_update_survey(struct mt76_dev *dev)
 {
-       struct mt76_channel_state *state;
+       struct mt76_channel_state *state = dev->chan_state;
+       ktime_t cur_time;
+
+       if (!test_bit(MT76_STATE_RUNNING, &dev->state))
+               return;
+
+       spin_lock_bh(&dev->cc_lock);
 
        if (dev->drv->update_survey)
                dev->drv->update_survey(dev);
 
+       cur_time = ktime_get_boottime();
+       state->cc_active += ktime_to_us(ktime_sub(cur_time,
+                                                 dev->survey_time));
+       dev->survey_time = cur_time;
+
+       spin_unlock_bh(&dev->cc_lock);
+
        if (dev->drv->drv_flags & MT_DRV_SW_RX_AIRTIME) {
-               state = mt76_channel_state(dev, dev->chandef.chan);
                spin_lock_bh(&dev->rx_lock);
                spin_lock(&dev->cc_lock);
                state->cc_bss_rx += dev->cur_cc_bss_rx;
index 8e6568d4505bdd73a2d88758f0bbf6c65bd041b8..1497d5ec649eea99f24119c7549e06414bd988ca 100644 (file)
@@ -1571,22 +1571,9 @@ void mt7603_update_channel(struct mt76_dev *mdev)
 {
        struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
        struct mt76_channel_state *state;
-       ktime_t cur_time;
-       u32 busy;
-
-       if (!test_bit(MT76_STATE_RUNNING, &dev->mt76.state))
-               return;
 
        state = mdev->chan_state;
-       busy = mt76_rr(dev, MT_MIB_STAT_CCA);
-
-       spin_lock_bh(&dev->mt76.cc_lock);
-       cur_time = ktime_get_boottime();
-       state->cc_busy += busy;
-       state->cc_active += ktime_to_us(ktime_sub(cur_time,
-                                                 dev->mt76.survey_time));
-       dev->mt76.survey_time = cur_time;
-       spin_unlock_bh(&dev->mt76.cc_lock);
+       state->cc_busy += mt76_rr(dev, MT_MIB_STAT_CCA);
 }
 
 void
index 81f45c4ccc26647cb199d3a3b98a13e3b85ef9ae..271f36f4acb395850e6acb2341c385c8d9de8950 100644 (file)
@@ -1263,23 +1263,11 @@ 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 = mdev->chan_state;
        /* 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);
+       state = mdev->chan_state;
+       state->cc_busy += mt76_get_field(dev, MT_MIB_SDR16(0),
+                                        MT_MIB_BUSY_MASK);
 }
 
 void mt7615_mac_work(struct work_struct *work)
index efb7ca93863d3b4d4847195985d58f96ed79c2ea..f7682bd2e5a80461f48063413d49be441f8e1f50 100644 (file)
@@ -19,10 +19,7 @@ mt76x0_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef)
        mt76_set_channel(&dev->mt76);
        mt76x0_phy_set_channel(dev, chandef);
 
-       /* channel cycle counters read-and-clear */
-       mt76_rr(dev, MT_CH_IDLE);
-       mt76_rr(dev, MT_CH_BUSY);
-
+       mt76x02_mac_cc_reset(dev);
        mt76x02_edcca_init(dev);
 
        if (mt76_is_mmio(dev)) {
index c987e57db0b4768ca0599a5e16f80eb891bef337..e49d0136adbcd4d16bd1da7562aaad764821e573 100644 (file)
@@ -984,17 +984,9 @@ void mt76x02_update_channel(struct mt76_dev *mdev)
 {
        struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
        struct mt76_channel_state *state;
-       u32 active, busy;
 
        state = mdev->chan_state;
-
-       busy = mt76_rr(dev, MT_CH_BUSY);
-       active = busy + mt76_rr(dev, MT_CH_IDLE);
-
-       spin_lock_bh(&dev->mt76.cc_lock);
-       state->cc_busy += busy;
-       state->cc_active += active;
-       spin_unlock_bh(&dev->mt76.cc_lock);
+       state->cc_busy += mt76_rr(dev, MT_CH_BUSY);
 }
 EXPORT_SYMBOL_GPL(mt76x02_update_channel);
 
@@ -1152,6 +1144,16 @@ void mt76x02_mac_work(struct work_struct *work)
                                     MT_MAC_WORK_INTERVAL);
 }
 
+void mt76x02_mac_cc_reset(struct mt76x02_dev *dev)
+{
+       dev->mt76.survey_time = ktime_get_boottime();
+
+       /* channel cycle counters read-and-clear */
+       mt76_rr(dev, MT_CH_BUSY);
+       mt76_rr(dev, MT_CH_IDLE);
+}
+EXPORT_SYMBOL_GPL(mt76x02_mac_cc_reset);
+
 void mt76x02_mac_set_bssid(struct mt76x02_dev *dev, u8 idx, const u8 *addr)
 {
        idx &= 7;
index b687341236c038c49fbd1210c1ed8dc639731817..48de8eb82856c34b7ac02aa1617c60ba2612b9b4 100644 (file)
@@ -193,6 +193,7 @@ void mt76x02_tx_complete_skb(struct mt76_dev *mdev, enum mt76_txq_id qid,
 void mt76x02_update_channel(struct mt76_dev *mdev);
 void mt76x02_mac_work(struct work_struct *work);
 
+void mt76x02_mac_cc_reset(struct mt76x02_dev *dev);
 void mt76x02_mac_set_bssid(struct mt76x02_dev *dev, u8 idx, const u8 *addr);
 int mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 vif_idx,
                           struct sk_buff *skb);
index 385960dca906e97a7fb12908d7ece23ba370f136..1387f3172d7ffee73958706708fdfc81dd5f2fc7 100644 (file)
@@ -52,10 +52,7 @@ mt76x2_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef)
        mt76x2_mac_stop(dev, true);
        ret = mt76x2_phy_set_channel(dev, chandef);
 
-       /* channel cycle counters read-and-clear */
-       mt76_rr(dev, MT_CH_IDLE);
-       mt76_rr(dev, MT_CH_BUSY);
-
+       mt76x02_mac_cc_reset(dev);
        mt76x02_dfs_init_params(dev);
 
        mt76x2_mac_resume(dev);
index 1e6f78760dd8d9f4ce81d65a656dc2d4e1c18d8d..a76a40dcd261a17a7d93056a9be8cd57f2c90ac7 100644 (file)
@@ -49,10 +49,7 @@ mt76x2u_set_channel(struct mt76x02_dev *dev,
 
        err = mt76x2u_phy_set_channel(dev, chandef);
 
-       /* channel cycle counters read-and-clear */
-       mt76_rr(dev, MT_CH_IDLE);
-       mt76_rr(dev, MT_CH_BUSY);
-
+       mt76x02_mac_cc_reset(dev);
        mt76x2_mac_resume(dev);
 
        clear_bit(MT76_RESET, &dev->mt76.state);