mt76: mt7615: fix a possible race enabling/disabling runtime-pm
authorLorenzo Bianconi <lorenzo@kernel.org>
Mon, 27 Dec 2021 13:08:52 +0000 (14:08 +0100)
committerFelix Fietkau <nbd@nbd.name>
Thu, 3 Feb 2022 12:57:58 +0000 (13:57 +0100)
Similar to mt7921 driver, fix a possible race enabling/disabling
runtime-pm between mt7615_pm_set() and mt7615_poll_rx().
mt7615_pm_wake_work() always schedules rx-napi callback and it will
trigger mt7615_pm_power_save_work routine putting the chip in low-power
state even if we are disabling runtime-pm deferring the actual chip wake
at the next access.

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

index b535280..ca7efca 100644 (file)
@@ -105,10 +105,10 @@ mt7615_pm_set(void *data, u64 val)
        if (!mt7615_firmware_offload(dev) || mt76_is_usb(&dev->mt76))
                return -EOPNOTSUPP;
 
-       if (val == pm->enable)
-               return 0;
+       mutex_lock(&dev->mt76.mutex);
 
-       mt7615_mutex_acquire(dev);
+       if (val == pm->enable)
+               goto out;
 
        if (dev->phy.n_beacon_vif) {
                ret = -EBUSY;
@@ -119,9 +119,16 @@ mt7615_pm_set(void *data, u64 val)
                pm->stats.last_wake_event = jiffies;
                pm->stats.last_doze_event = jiffies;
        }
+       /* make sure the chip is awake here and ps_work is scheduled
+        * just at end of the this routine.
+        */
+       pm->enable = false;
+       mt76_connac_pm_wake(&dev->mphy, pm);
+
        pm->enable = val;
+       mt76_connac_power_save_sched(&dev->mphy, pm);
 out:
-       mt7615_mutex_release(dev);
+       mutex_unlock(&dev->mt76.mutex);
 
        return ret;
 }