Skip to content

Commit

Permalink
wifi: mt76: mt7921e: fix race issue between reset and suspend/resume
Browse files Browse the repository at this point in the history
[ Upstream commit ff6c4a6 ]

It is unexpected that the reset work is running simultaneously with
the suspend or resume context and it is possible that reset work is still
running even after mt7921 is suspended if we don't fix the race issue.

Thus, the suspend procedure should be waiting until the reset is completed
at the beginning and ignore the subsequent the reset requests.

In case there is an error that happens during either suspend or resume
handler, we will schedule a reset task to recover the error before
returning the error code to ensure we can immediately fix the error there.

Fixes: 0c1ce98 ("mt76: mt7921: add wifi reset support")
Co-developed-by: YN Chen <YN.Chen@mediatek.com>
Signed-off-by: YN Chen <YN.Chen@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
moore-bros authored and gregkh committed Oct 21, 2022
1 parent e53c618 commit 2270fb7
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 4 deletions.
5 changes: 5 additions & 0 deletions drivers/net/wireless/mediatek/mt76/mt7921/mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -780,15 +780,20 @@ void mt7921_mac_reset_work(struct work_struct *work)
void mt7921_reset(struct mt76_dev *mdev)
{
struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
struct mt76_connac_pm *pm = &dev->pm;

if (!dev->hw_init_done)
return;

if (dev->hw_full_reset)
return;

if (pm->suspended)
return;

queue_work(dev->mt76.wq, &dev->reset_work);
}
EXPORT_SYMBOL_GPL(mt7921_reset);

void mt7921_mac_update_mib_stats(struct mt7921_phy *phy)
{
Expand Down
13 changes: 9 additions & 4 deletions drivers/net/wireless/mediatek/mt76/mt7921/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,7 @@ static int mt7921_pci_suspend(struct device *device)
int i, err;

pm->suspended = true;
flush_work(&dev->reset_work);
cancel_delayed_work_sync(&pm->ps_work);
cancel_work_sync(&pm->wake_work);

Expand Down Expand Up @@ -428,6 +429,9 @@ static int mt7921_pci_suspend(struct device *device)
restore_suspend:
pm->suspended = false;

if (err < 0)
mt7921_reset(&dev->mt76);

return err;
}

Expand All @@ -441,7 +445,7 @@ static int mt7921_pci_resume(struct device *device)

err = mt7921_mcu_drv_pmctrl(dev);
if (err < 0)
return err;
goto failed;

mt7921_wpdma_reinit_cond(dev);

Expand Down Expand Up @@ -471,11 +475,12 @@ static int mt7921_pci_resume(struct device *device)
mt76_connac_mcu_set_deep_sleep(&dev->mt76, false);

err = mt76_connac_mcu_set_hif_suspend(mdev, false);
if (err)
return err;

failed:
pm->suspended = false;

if (err < 0)
mt7921_reset(&dev->mt76);

return err;
}

Expand Down

0 comments on commit 2270fb7

Please sign in to comment.