mt76: mt7615: set macwork timeout according to runtime-pm
authorLorenzo Bianconi <lorenzo@kernel.org>
Fri, 18 Jun 2021 08:08:24 +0000 (10:08 +0200)
committerFelix Fietkau <nbd@nbd.name>
Sat, 19 Jun 2021 07:22:51 +0000 (09:22 +0200)
Set macwork timeout value according to runtime-pm in order to reduce
power consumption

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_mac.c

index bd0d189..ff3f85e 100644 (file)
@@ -1954,9 +1954,14 @@ void mt7615_pm_wake_work(struct work_struct *work)
                        mt76_queue_tx_cleanup(dev, mdev->q_mcu[MT_MCUQ_WM],
                                              false);
                }
-               if (test_bit(MT76_STATE_RUNNING, &mphy->state))
+
+               if (test_bit(MT76_STATE_RUNNING, &mphy->state)) {
+                       unsigned long timeout;
+
+                       timeout = mt7615_get_macwork_timeout(dev);
                        ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work,
-                                                    MT7615_WATCHDOG_TIME);
+                                                    timeout);
+               }
        }
 
        ieee80211_wake_queues(mphy->hw);
@@ -1991,6 +1996,7 @@ void mt7615_mac_work(struct work_struct *work)
 {
        struct mt7615_phy *phy;
        struct mt76_phy *mphy;
+       unsigned long timeout;
 
        mphy = (struct mt76_phy *)container_of(work, struct mt76_phy,
                                               mac_work.work);
@@ -2009,8 +2015,9 @@ void mt7615_mac_work(struct work_struct *work)
        mt7615_mutex_release(phy->dev);
 
        mt76_tx_status_check(mphy->dev, NULL, false);
-       ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work,
-                                    MT7615_WATCHDOG_TIME);
+
+       timeout = mt7615_get_macwork_timeout(phy->dev);
+       ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work, timeout);
 }
 
 void mt7615_tx_token_put(struct mt7615_dev *dev)
index bd2f42e..dada43d 100644 (file)
@@ -28,6 +28,7 @@ static int mt7615_start(struct ieee80211_hw *hw)
 {
        struct mt7615_dev *dev = mt7615_hw_dev(hw);
        struct mt7615_phy *phy = mt7615_hw_phy(hw);
+       unsigned long timeout;
        bool running;
        int ret;
 
@@ -78,8 +79,8 @@ static int mt7615_start(struct ieee80211_hw *hw)
 
        set_bit(MT76_STATE_RUNNING, &phy->mt76->state);
 
-       ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
-                                    MT7615_WATCHDOG_TIME);
+       timeout = mt7615_get_macwork_timeout(dev);
+       ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work, timeout);
 
        if (!running)
                mt7615_mac_reset_counters(dev);
@@ -350,10 +351,12 @@ out:
        mt7615_mutex_release(dev);
 
        mt76_worker_schedule(&dev->mt76.tx_worker);
-       if (!mt76_testmode_enabled(phy->mt76))
+       if (!mt76_testmode_enabled(phy->mt76)) {
+               unsigned long timeout = mt7615_get_macwork_timeout(dev);
+
                ieee80211_queue_delayed_work(phy->mt76->hw,
-                                            &phy->mt76->mac_work,
-                                            MT7615_WATCHDOG_TIME);
+                                            &phy->mt76->mac_work, timeout);
+       }
 
        return ret;
 }
@@ -1225,6 +1228,7 @@ static int mt7615_resume(struct ieee80211_hw *hw)
 {
        struct mt7615_phy *phy = mt7615_hw_phy(hw);
        struct mt7615_dev *dev = mt7615_hw_dev(hw);
+       unsigned long timeout;
        bool running;
 
        mt7615_mutex_acquire(dev);
@@ -1248,8 +1252,8 @@ static int mt7615_resume(struct ieee80211_hw *hw)
                                            mt76_connac_mcu_set_suspend_iter,
                                            phy->mt76);
 
-       ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
-                                    MT7615_WATCHDOG_TIME);
+       timeout = mt7615_get_macwork_timeout(dev);
+       ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work, timeout);
 
        mt7615_mutex_release(dev);
 
index 8fbaf83..d0c64a9 100644 (file)
@@ -20,7 +20,6 @@
                                         MT7615_MAX_INTERFACES)
 
 #define MT7615_PM_TIMEOUT              (HZ / 12)
-#define MT7615_WATCHDOG_TIME           (HZ / 10)
 #define MT7615_HW_SCAN_TIMEOUT         (HZ / 10)
 #define MT7615_RESET_TIMEOUT           (30 * HZ)
 #define MT7615_RATE_RETRY              2
@@ -461,6 +460,12 @@ static inline u32 mt7615_tx_mcu_int_mask(struct mt7615_dev *dev)
        return MT_INT_TX_DONE(dev->mt76.q_mcu[MT_MCUQ_WM]->hw_idx);
 }
 
+static inline unsigned long
+mt7615_get_macwork_timeout(struct mt7615_dev *dev)
+{
+       return dev->pm.enable ? HZ / 3 : HZ / 10;
+}
+
 void mt7615_dma_reset(struct mt7615_dev *dev);
 void mt7615_scan_work(struct work_struct *work);
 void mt7615_roc_work(struct work_struct *work);
index cc278d8..da87c02 100644 (file)
@@ -268,6 +268,7 @@ void mt7615_mac_reset_work(struct work_struct *work)
        struct mt7615_phy *phy2;
        struct mt76_phy *ext_phy;
        struct mt7615_dev *dev;
+       unsigned long timeout;
 
        dev = container_of(work, struct mt7615_dev, reset_work);
        ext_phy = dev->mt76.phy2;
@@ -345,11 +346,11 @@ void mt7615_mac_reset_work(struct work_struct *work)
 
        mt7615_mutex_release(dev);
 
+       timeout = mt7615_get_macwork_timeout(dev);
        ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mphy.mac_work,
-                                    MT7615_WATCHDOG_TIME);
+                                    timeout);
        if (phy2)
                ieee80211_queue_delayed_work(ext_phy->hw,
-                                            &phy2->mt76->mac_work,
-                                            MT7615_WATCHDOG_TIME);
+                                            &phy2->mt76->mac_work, timeout);
 
 }