lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0352/1039] mt76: mt7921: fix a possible race enabling/disabling runtime-pm
    Date
    From: Lorenzo Bianconi <lorenzo@kernel.org>

    [ Upstream commit d430dffbe9dd30759f3c64b65bf85b0245c8d8ab ]

    Fix a possible race enabling/disabling runtime-pm between
    mt7921_pm_set() and mt7921_poll_rx() since mt7921_pm_wake_work()
    always schedules rx-napi callback and it will trigger
    mt7921_pm_power_save_work routine putting chip to in low-power state
    during mt7921_pm_set processing.

    Suggested-by: Deren Wu <deren.wu@mediatek.com>
    Tested-by: Deren Wu <deren.wu@mediatek.com>
    Fixes: 1d8efc741df8 ("mt76: mt7921: introduce Runtime PM support")
    Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
    Signed-off-by: Kalle Valo <kvalo@kernel.org>
    Link: https://lore.kernel.org/r/0f3e075a2033dc05f09dab4059e5be8cbdccc239.1640094847.git.lorenzo@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c | 3 ---
    drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c | 12 +++++++++---
    2 files changed, 9 insertions(+), 6 deletions(-)

    diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
    index af43bcb545781..306e9eaea9177 100644
    --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
    +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
    @@ -7,9 +7,6 @@ int mt76_connac_pm_wake(struct mt76_phy *phy, struct mt76_connac_pm *pm)
    {
    struct mt76_dev *dev = phy->dev;

    - if (!pm->enable)
    - return 0;
    -
    if (mt76_is_usb(dev))
    return 0;

    diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c
    index 7cdfdf83529f6..86fd7292b229f 100644
    --- a/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c
    +++ b/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c
    @@ -276,7 +276,7 @@ mt7921_pm_set(void *data, u64 val)
    struct mt7921_dev *dev = data;
    struct mt76_connac_pm *pm = &dev->pm;

    - mt7921_mutex_acquire(dev);
    + mutex_lock(&dev->mt76.mutex);

    if (val == pm->enable)
    goto out;
    @@ -285,7 +285,11 @@ mt7921_pm_set(void *data, u64 val)
    pm->stats.last_wake_event = jiffies;
    pm->stats.last_doze_event = jiffies;
    }
    - pm->enable = val;
    + /* 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);

    ieee80211_iterate_active_interfaces(mt76_hw(dev),
    IEEE80211_IFACE_ITER_RESUME_ALL,
    @@ -293,8 +297,10 @@ mt7921_pm_set(void *data, u64 val)

    mt76_connac_mcu_set_deep_sleep(&dev->mt76, pm->ds_enable);

    + pm->enable = val;
    + mt76_connac_power_save_sched(&dev->mphy, pm);
    out:
    - mt7921_mutex_release(dev);
    + mutex_unlock(&dev->mt76.mutex);

    return 0;
    }
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-01-24 23:10    [W:4.047 / U:1.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site