]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mt76: mt7921s: fix possible sdio deadlock in command fail
authorDeren Wu <deren.wu@mediatek.com>
Tue, 14 Jun 2022 07:50:24 +0000 (15:50 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:41:03 +0000 (14:41 +0200)
[ Upstream commit 364718c94ac2ea4e51958ac0aa15c9092c785a3a ]

Move sdio_release_host() to final resource handing

Fixes: b12deb5e86fa ("mt76: mt7921s: fix mt7921s_mcu_[fw|drv]_pmctrl")
Reported-by: YN Chen <YN.Chen@mediatek.com>
Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/mediatek/mt76/mt7921/sdio_mcu.c

index 54a5c712a3c3e017c49879f6111d4ff332d04077..c572a3107b8b75c3c4e9c07affb2d7b6239baac6 100644 (file)
@@ -136,8 +136,8 @@ int mt7921s_mcu_fw_pmctrl(struct mt7921_dev *dev)
        struct sdio_func *func = dev->mt76.sdio.func;
        struct mt76_phy *mphy = &dev->mt76.phy;
        struct mt76_connac_pm *pm = &dev->pm;
-       int err = 0;
        u32 status;
+       int err;
 
        sdio_claim_host(func);
 
@@ -148,7 +148,7 @@ int mt7921s_mcu_fw_pmctrl(struct mt7921_dev *dev)
                                         2000, 1000000);
                if (err < 0) {
                        dev_err(dev->mt76.dev, "mailbox ACK not cleared\n");
-                       goto err;
+                       goto out;
                }
        }
 
@@ -156,18 +156,18 @@ int mt7921s_mcu_fw_pmctrl(struct mt7921_dev *dev)
 
        err = readx_poll_timeout(mt76s_read_pcr, &dev->mt76, status,
                                 !(status & WHLPCR_IS_DRIVER_OWN), 2000, 1000000);
+out:
        sdio_release_host(func);
 
-err:
        if (err < 0) {
                dev_err(dev->mt76.dev, "firmware own failed\n");
                clear_bit(MT76_STATE_PM, &mphy->state);
-               err = -EIO;
+               return -EIO;
        }
 
        pm->stats.last_doze_event = jiffies;
        pm->stats.awake_time += pm->stats.last_doze_event -
                                pm->stats.last_wake_event;
 
-       return err;
+       return 0;
 }