diff options
author | Lorenzo Bianconi <lorenzo@kernel.org> | 2021-04-18 18:45:29 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2021-04-21 20:55:52 +0200 |
commit | 7f2bc8ba11a0e82d474f0047933c3baeebf4406c (patch) | |
tree | 276669ee84dd7f3c1034019c68f4e89c05bb5359 /drivers/net/wireless | |
parent | mt76: mt7663: fix a race between mt7615_mcu_drv_pmctrl and mt7615_mcu_fw_pmctrl (diff) | |
download | linux-7f2bc8ba11a0e82d474f0047933c3baeebf4406c.tar.xz linux-7f2bc8ba11a0e82d474f0047933c3baeebf4406c.zip |
mt76: connac: introduce wake counter for fw_pmctrl synchronization
Introduce wake counter and related spinlock in order to synchronize
tx/rx path and fw_pmctrl request.
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/mediatek/mt76/mt76_connac.h | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac.h index 2b31c9794e92..85846eab8d7d 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76_connac.h +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac.h @@ -54,6 +54,11 @@ struct mt76_connac_pm { struct work_struct wake_work; struct completion wake_cmpl; + + struct { + spinlock_t lock; + u32 count; + } wake; struct mutex mutex; struct delayed_work ps_work; @@ -85,6 +90,32 @@ void mt76_connac_power_save_sched(struct mt76_phy *phy, void mt76_connac_free_pending_tx_skbs(struct mt76_connac_pm *pm, struct mt76_wcid *wcid); +static inline bool +mt76_connac_pm_ref(struct mt76_phy *phy, struct mt76_connac_pm *pm) +{ + bool ret = false; + + spin_lock_bh(&pm->wake.lock); + if (test_bit(MT76_STATE_PM, &phy->state)) + goto out; + + pm->wake.count++; + ret = true; +out: + spin_unlock_bh(&pm->wake.lock); + + return ret; +} + +static inline void +mt76_connac_pm_unref(struct mt76_connac_pm *pm) +{ + spin_lock_bh(&pm->wake.lock); + pm->wake.count--; + pm->last_activity = jiffies; + spin_unlock_bh(&pm->wake.lock); +} + static inline void mt76_connac_mutex_acquire(struct mt76_dev *dev, struct mt76_connac_pm *pm) __acquires(&dev->mutex) |