mt76: mt7615: reschedule ps work according to last activity
authorLorenzo Bianconi <lorenzo@kernel.org>
Tue, 7 Jul 2020 21:27:20 +0000 (23:27 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 21 Jul 2020 17:01:17 +0000 (19:01 +0200)
Reschedule runtime-pm delayed work if there is a new activity when ps
delayed work is already scheduled

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

index 1c440ed..126c54a 100644 (file)
@@ -1932,13 +1932,21 @@ EXPORT_SYMBOL_GPL(mt7615_pm_power_save_sched);
 void mt7615_pm_power_save_work(struct work_struct *work)
 {
        struct mt7615_dev *dev;
+       unsigned long delta;
 
        dev = (struct mt7615_dev *)container_of(work, struct mt7615_dev,
                                                pm.ps_work.work);
 
-       if (mt7615_firmware_own(dev))
-               queue_delayed_work(dev->mt76.wq, &dev->pm.ps_work,
-                                  dev->pm.idle_timeout);
+       delta = dev->pm.idle_timeout;
+       if (time_is_after_jiffies(dev->pm.last_activity + delta)) {
+               delta = dev->pm.last_activity + delta - jiffies;
+               goto out;
+       }
+
+       if (!mt7615_firmware_own(dev))
+               return;
+out:
+       queue_delayed_work(dev->mt76.wq, &dev->pm.ps_work, delta);
 }
 
 static void