mt76: mt7921: reduce the mutex lock scope during reset
authorSean Wang <sean.wang@mediatek.com>
Sun, 26 Jun 2022 23:27:06 +0000 (07:27 +0800)
committerFelix Fietkau <nbd@nbd.name>
Mon, 11 Jul 2022 11:40:03 +0000 (13:40 +0200)
Reduce the mutex lock scope for reset to get rid of possible task hung
e.g wpa_supplicant and to allow the user-space process to keep running
during we need more retries to complete the reset.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Suggested-by: YN Chen <YN.Chen@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7921/mac.c

index a07e9a4c2ea3e7db2fa549f921fdee86cd944e3d..47f0aa81ab0280d323a84ec773e210ecde8f2b79 100644 (file)
@@ -738,7 +738,7 @@ void mt7921_mac_reset_work(struct work_struct *work)
                                              reset_work);
        struct ieee80211_hw *hw = mt76_hw(dev);
        struct mt76_connac_pm *pm = &dev->pm;
-       int i;
+       int i, ret;
 
        dev_dbg(dev->mt76.dev, "chip reset\n");
        dev->hw_full_reset = true;
@@ -748,11 +748,14 @@ void mt7921_mac_reset_work(struct work_struct *work)
        cancel_delayed_work_sync(&pm->ps_work);
        cancel_work_sync(&pm->wake_work);
 
-       mutex_lock(&dev->mt76.mutex);
-       for (i = 0; i < 10; i++)
-               if (!mt7921_dev_reset(dev))
+       for (i = 0; i < 10; i++) {
+               mutex_lock(&dev->mt76.mutex);
+               ret = mt7921_dev_reset(dev);
+               mutex_unlock(&dev->mt76.mutex);
+
+               if (!ret)
                        break;
-       mutex_unlock(&dev->mt76.mutex);
+       }
 
        if (i == 10)
                dev_err(dev->mt76.dev, "chip reset failed\n");