]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: mt76: mt7915: mcu: re-init MCU before loading FW patch
authorDavid Bauer <mail@david-bauer.net>
Wed, 2 Apr 2025 00:45:27 +0000 (02:45 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 3 Jul 2025 17:26:53 +0000 (19:26 +0200)
Restart the MCU and release the patch semaphore before loading the MCU
patch firmware from the host.

This fixes failures upon error recovery in case the semaphore was
previously taken and never released by the host.

This happens from time to time upon triggering a full-chip error
recovery. Under this circumstance, the hardware restart fails and the
radio is rendered inoperational.

Signed-off-by: David Bauer <mail@david-bauer.net>
Link: https://patch.msgid.link/20250402004528.1036715-3-mail@david-bauer.net
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c

index 4c2c242608a2113dd63ae666215ca80ac5979b70..cf948628e5889dbb94dadc41043c58cd4983bdb3 100644 (file)
@@ -2115,16 +2115,21 @@ static int mt7915_load_firmware(struct mt7915_dev *dev)
 {
        int ret;
 
-       /* make sure fw is download state */
-       if (mt7915_firmware_state(dev, false)) {
-               /* restart firmware once */
-               mt76_connac_mcu_restart(&dev->mt76);
-               ret = mt7915_firmware_state(dev, false);
-               if (ret) {
-                       dev_err(dev->mt76.dev,
-                               "Firmware is not ready for download\n");
-                       return ret;
-               }
+       /* Release Semaphore if taken by previous failed attempt */
+       ret = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, false);
+       if (ret != PATCH_REL_SEM_SUCCESS) {
+               dev_err(dev->mt76.dev, "Could not release semaphore\n");
+               /* Continue anyways */
+       }
+
+       /* Always restart MCU firmware */
+       mt76_connac_mcu_restart(&dev->mt76);
+
+       /* Check if MCU is ready */
+       ret = mt7915_firmware_state(dev, false);
+       if (ret) {
+               dev_err(dev->mt76.dev, "Firmware did not enter download state\n");
+               return ret;
        }
 
        ret = mt76_connac2_load_patch(&dev->mt76, fw_name_var(dev, ROM_PATCH));