[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAOFcj8Qy=6gpKpkph_rj8Nyc82t_q87XM8B3hhmX0Rijv-FxeQ@mail.gmail.com>
Date: Sat, 3 Jan 2026 10:42:47 -0800
From: Zac Bowling <zbowling@...il.com>
To: Sean Wang <sean.wang@...nel.org>
Cc: deren.wu@...iatek.com, kvalo@...nel.org, linux-kernel@...r.kernel.org,
linux-mediatek@...ts.infradead.org, linux-wireless@...r.kernel.org,
lorenzo@...nel.org, nbd@....name, ryder.lee@...iatek.com,
sean.wang@...iatek.com
Subject: Re: [PATCH] wifi: mt76: mt792x: fix firmware reload failure after
previous load crash
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@...nel.org> wrote:
>
> On Fri, Jan 2, 2026 at 2:03 PM Zac Bowling <zbowling@...il.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@...bowling.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
> >
> >
> >
Powered by blists - more mailing lists