Commit 6e39e9a1 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau
Browse files

mt76: mt7615: fix a possible race enabling/disabling runtime-pm



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: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 66ca1a7b
Loading
Loading
Loading
Loading
+11 −4
Original line number Original line Diff line number Diff line
@@ -105,10 +105,10 @@ mt7615_pm_set(void *data, u64 val)
	if (!mt7615_firmware_offload(dev) || mt76_is_usb(&dev->mt76))
	if (!mt7615_firmware_offload(dev) || mt76_is_usb(&dev->mt76))
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;


	if (val == pm->enable)
	mutex_lock(&dev->mt76.mutex);
		return 0;


	mt7615_mutex_acquire(dev);
	if (val == pm->enable)
		goto out;


	if (dev->phy.n_beacon_vif) {
	if (dev->phy.n_beacon_vif) {
		ret = -EBUSY;
		ret = -EBUSY;
@@ -119,9 +119,16 @@ mt7615_pm_set(void *data, u64 val)
		pm->stats.last_wake_event = jiffies;
		pm->stats.last_wake_event = jiffies;
		pm->stats.last_doze_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;
	pm->enable = val;
	mt76_connac_power_save_sched(&dev->mphy, pm);
out:
out:
	mt7615_mutex_release(dev);
	mutex_unlock(&dev->mt76.mutex);


	return ret;
	return ret;
}
}