[PATCH] wifi: mt76: mt792x: fix firmware reload failure after previous load crash
Zac Bowling
zbowling at gmail.com
Sat Jan 3 10:42:47 PST 2026
Hi Sean,
Thanks! I don't have a MT7921, only a MT7925, so no unfortunately. I
ordered off Amazon and should be here in a week or two.
Zac Bowling
Zac Bowling
On Fri, Jan 2, 2026 at 10:46 PM Sean Wang <sean.wang at kernel.org> wrote:
>
> On Fri, Jan 2, 2026 at 2:03 PM Zac Bowling <zbowling at gmail.com> wrote:
> >
> > If the firmware loading process crashes or is interrupted after
> > acquiring the patch semaphore but before releasing it, subsequent
> > firmware load attempts will fail with 'Failed to get patch semaphore'
> > because the semaphore is still held.
> >
> > This issue manifests as devices becoming unusable after suspend/resume
> > failures or firmware crashes, requiring a full hardware reboot to
> > recover. This has been widely reported on MT7921 and MT7925 devices.
> >
> > Apply the same fix that was applied to MT7915 in commit 79dd14f:
> > 1. Release the patch semaphore before starting firmware load (in case
> > it was held by a previous failed attempt)
> > 2. Restart MCU firmware to ensure clean state
> > 3. Wait briefly for MCU to be ready
> >
> > This fix applies to both MT7921 and MT7925 drivers which share the
> > mt792x_load_firmware() function.
> >
> > Fixes: 'Failed to get patch semaphore' errors after firmware crash
> > Signed-off-by: Zac Bowling <zac at zacbowling.com>
> > ---
> > mt792x_core.c | 14 ++++++++++++++
> > 1 file changed, 14 insertions(+)
> >
> > diff --git a/mt792x_core.c b/mt792x_core.c
> > index cc488ee9..b82e4470 100644
> > --- a/mt792x_core.c
> > +++ b/mt792x_core.c
> > @@ -927,6 +927,20 @@ int mt792x_load_firmware(struct mt792x_dev *dev)
> > {
> > int ret;
> >
> > + /* Release semaphore if taken by previous failed load attempt.
> > + * This prevents "Failed to get patch semaphore" errors when
> > + * recovering from firmware crashes or suspend/resume failures.
> > + */
> > + ret = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, false);
> > + if (ret < 0)
> > + dev_dbg(dev->mt76.dev, "Semaphore release returned %d (may be expected)\n", ret);
> > +
> > + /* Always restart MCU to ensure clean state before loading firmware */
> > + mt76_connac_mcu_restart(&dev->mt76);
> > +
> > + /* Wait for MCU to be ready after restart */
> > + msleep(100);
> > +
>
> Hi Zac,
>
> This is a good finding. Since this is a common mt792x code path, have you
> also had a chance to test it on MT7921?
>
> One small nit: the Fixes tag should reference the actual commit being
> fixed, e.g.
>
> Fixes: <commit-sha> ("mt76: mt792x: ...")
>
> instead of the error string.
>
> Sean
>
> > ret = mt76_connac2_load_patch(&dev->mt76, mt792x_patch_name(dev));
> > if (ret)
> > return ret;
> > --
> > 2.51.0
> >
> >
> >
More information about the Linux-mediatek
mailing list