All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH rtw-next v2] wifi: rtw88: pci: wake the TX queues when the rings are reset
@ 2026-10-10 19:31 Abdurrahman Karadag
  2026-10-12  6:57 ` Ping-Ke Shih
  0 siblings, 1 reply; 6+ messages in thread
From: Abdurrahman Karadag @ 2026-10-10 19:31 UTC (permalink / raw)
  To: linux-wireless; +Cc: pkshih, linux-kernel, rtl8821cerfe2

When a TX ring fills, rtw_pci_tx_write() stops the mac80211 queue and
records that in ring->queue_stopped, which is cleared only by the
completion loop in rtw_pci_tx_isr(). Resetting the rings rewinds the
indices, so nothing that was in flight can complete and run that loop,
and the queue stays stopped over a ring that is now empty.
ieee80211_restart_hw() does not release that stop either, because
ieee80211_reconfig() wakes only IEEE80211_QUEUE_STOP_REASON_SUSPEND.

Release those queues where the reset happens. The stop side is the one
that matters: rtw_fw_recovery() reaches rtw_pci_dma_release() through
rtw_enter_ips() before it calls ieee80211_restart_hw(), so that is
where a queue stopped before the crash is still stopped. By the time
rtw_pci_setup() runs the flag is already clear.

Wake all the queues, but only if at least one ring had filled. This
cannot tell one DRIVER stop from another: rtw_pci_io_err_detected() and
the hardware scan paths in fw.c stop every queue with the same
IEEE80211_QUEUE_STOP_REASON_DRIVER, which mac80211 keeps as a single
non-refcounted slot per queue. Gating on ring->queue_stopped at least
keeps the resets that stopped nothing out of it.

On an RTL8821CE, a BE ring held until rtw_pci_tx_write() stopped its
queue did not come back from the restart. The ring itself was reset -
0x3a8 read 0x00000000 and REG_TXPAUSE was clear again - but BE's
mac80211 stop reason still read 0x1 three minutes later and TX never
resumed. With this patch it reads 0x0 and TX resumes within 2 s. The
ring was filled by writing REG_TXPAUSE 0x0f from debugfs under load,
and rtw_fw_recovery() was called from a debug build.

Signed-off-by: Abdurrahman Karadag <abdurrahmankaradag19@gmail.com>
---
v2:
 - wake with ieee80211_wake_queues() instead of recording and replaying
   per-ring queue mappings (Ping-Ke Shih)
 - drop the Fixes tag: the bug only bites once a recovery path exists,
   which the blamed commit predates (Ping-Ke Shih)
 - cut the commit message down to why and how (Ping-Ke Shih)
 - say which of the two reset call sites fires during recovery, and
   that the measured stall was induced from debugfs
 - patch 2 of the v1 series is dropped rather than resent, while the
   cause of the stall is still open

v1: https://lore.kernel.org/linux-wireless/20261002231013.11792-1-abdurrahmankaradag19@gmail.com/

 drivers/net/wireless/realtek/rtw88/pci.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
index 66d2e5f..4d3524e 100644
--- a/drivers/net/wireless/realtek/rtw88/pci.c
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
@@ -475,7 +475,29 @@ static void rtw_pci_reset_buf_desc(struct rtw_dev *rtwdev)
 
 static void rtw_pci_reset_trx_ring(struct rtw_dev *rtwdev)
 {
+	struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
+	enum rtw_tx_queue_type queue;
+	bool wake = false;
+
 	rtw_pci_reset_buf_desc(rtwdev);
+
+	/*
+	 * The indices are back at zero, so nothing that was in flight can
+	 * complete and reach the wake in rtw_pci_tx_isr(); a queue stopped
+	 * when its ring filled would stay stopped for good. Only wake when
+	 * that happened: the stop reason is shared with the AER and scan
+	 * paths, which wake the queues again themselves.
+	 */
+	for (queue = 0; queue < RTK_MAX_TX_QUEUE_NUM; queue++) {
+		if (!rtwpci->tx_rings[queue].queue_stopped)
+			continue;
+
+		rtwpci->tx_rings[queue].queue_stopped = false;
+		wake = true;
+	}
+
+	if (wake)
+		ieee80211_wake_queues(rtwdev->hw);
 }
 
 static void rtw_pci_enable_interrupt(struct rtw_dev *rtwdev,
-- 
2.55.0

base-commit: 83de3a16c7b37064a59305040ba9b0f93b832794

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* RE: [PATCH rtw-next v2] wifi: rtw88: pci: wake the TX queues when the rings are reset
  2026-10-10 19:31 [PATCH rtw-next v2] wifi: rtw88: pci: wake the TX queues when the rings are reset Abdurrahman Karadag
@ 2026-10-12  6:57 ` Ping-Ke Shih
  2026-10-13 22:08   ` Abdurrahman Karadag
  0 siblings, 1 reply; 6+ messages in thread
From: Ping-Ke Shih @ 2026-10-12  6:57 UTC (permalink / raw)
  To: Abdurrahman Karadag, linux-wireless@vger.kernel.org
  Cc: linux-kernel@vger.kernel.org, rtl8821cerfe2@gmail.com

Abdurrahman Karadag <abdurrahmankaradag19@gmail.com> wrote:
> When a TX ring fills, rtw_pci_tx_write() stops the mac80211 queue and
> records that in ring->queue_stopped, which is cleared only by the
> completion loop in rtw_pci_tx_isr(). Resetting the rings rewinds the
> indices, so nothing that was in flight can complete and run that loop,
> and the queue stays stopped over a ring that is now empty.
> ieee80211_restart_hw() does not release that stop either, because
> ieee80211_reconfig() wakes only IEEE80211_QUEUE_STOP_REASON_SUSPEND.

The main reason why we need this patch is ieee80211_restart_hw(), so
please point out this in subject. 

> 
> Release those queues where the reset happens. The stop side is the one
> that matters: rtw_fw_recovery() reaches rtw_pci_dma_release() through
> rtw_enter_ips() before it calls ieee80211_restart_hw(), so that is
> where a queue stopped before the crash is still stopped. By the time
> rtw_pci_setup() runs the flag is already clear.
> 
> Wake all the queues, but only if at least one ring had filled. This
> cannot tell one DRIVER stop from another: rtw_pci_io_err_detected() and
> the hardware scan paths in fw.c stop every queue with the same
> IEEE80211_QUEUE_STOP_REASON_DRIVER, which mac80211 keeps as a single
> non-refcounted slot per queue. Gating on ring->queue_stopped at least
> keeps the resets that stopped nothing out of it.
> 
> On an RTL8821CE, a BE ring held until rtw_pci_tx_write() stopped its
> queue did not come back from the restart. The ring itself was reset -
> 0x3a8 read 0x00000000 and REG_TXPAUSE was clear again - but BE's
> mac80211 stop reason still read 0x1 three minutes later and TX never
> resumed. With this patch it reads 0x0 and TX resumes within 2 s. The
> ring was filled by writing REG_TXPAUSE 0x0f from debugfs under load,
> and rtw_fw_recovery() was called from a debug build.

This isn't related to this patch, but it is still digging, so no need.

As I see, the commit message can be very simple -- wake up queues for
ieee80211_restart_hw() case.

(For the analysis in another mail, I'll read it later.)

> 
> Signed-off-by: Abdurrahman Karadag <abdurrahmankaradag19@gmail.com>
> ---
> v2:
>  - wake with ieee80211_wake_queues() instead of recording and replaying
>    per-ring queue mappings (Ping-Ke Shih)
>  - drop the Fixes tag: the bug only bites once a recovery path exists,
>    which the blamed commit predates (Ping-Ke Shih)
>  - cut the commit message down to why and how (Ping-Ke Shih)
>  - say which of the two reset call sites fires during recovery, and
>    that the measured stall was induced from debugfs
>  - patch 2 of the v1 series is dropped rather than resent, while the
>    cause of the stall is still open
> 
> v1: https://lore.kernel.org/linux-wireless/20261002231013.11792-1-abdurrahmankaradag19@gmail.com/
> 
>  drivers/net/wireless/realtek/rtw88/pci.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
> index 66d2e5f..4d3524e 100644
> --- a/drivers/net/wireless/realtek/rtw88/pci.c
> +++ b/drivers/net/wireless/realtek/rtw88/pci.c
> @@ -475,7 +475,29 @@ static void rtw_pci_reset_buf_desc(struct rtw_dev *rtwdev)
> 
>  static void rtw_pci_reset_trx_ring(struct rtw_dev *rtwdev)

I'm thinking if here is too early to wake up queues. Should we do this in
rtw_reconfig_complete()?

Or we check flag RTW_FLAG_RESTARTING of rtwdev->flags to wake up queues.
This will be clear why we need to wake up. The comment isn't necessary
by the way.

>  {
> +       struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
> +       enum rtw_tx_queue_type queue;
> +       bool wake = false;
> +
>         rtw_pci_reset_buf_desc(rtwdev);
> +
> +       /*
> +        * The indices are back at zero, so nothing that was in flight can
> +        * complete and reach the wake in rtw_pci_tx_isr(); a queue stopped
> +        * when its ring filled would stay stopped for good. Only wake when
> +        * that happened: the stop reason is shared with the AER and scan
> +        * paths, which wake the queues again themselves.
> +        */
> +       for (queue = 0; queue < RTK_MAX_TX_QUEUE_NUM; queue++) {
> +               if (!rtwpci->tx_rings[queue].queue_stopped)
> +                       continue;
> +
> +               rtwpci->tx_rings[queue].queue_stopped = false;
> +               wake = true;
> +       }
> +
> +       if (wake)
> +               ieee80211_wake_queues(rtwdev->hw);
>  }
> 
>  static void rtw_pci_enable_interrupt(struct rtw_dev *rtwdev,
> --
> 2.55.0
> 
> base-commit: 83de3a16c7b37064a59305040ba9b0f93b832794

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH rtw-next v2] wifi: rtw88: pci: wake the TX queues when the rings are reset
  2026-10-12  6:57 ` Ping-Ke Shih
@ 2026-10-13 22:08   ` Abdurrahman Karadag
  2026-10-14  1:52     ` Ping-Ke Shih
  0 siblings, 1 reply; 6+ messages in thread
From: Abdurrahman Karadag @ 2026-10-13 22:08 UTC (permalink / raw)
  To: linux-wireless; +Cc: pkshih, linux-kernel

> I'm thinking if here is too early to wake up queues. Should we do this in
> rtw_reconfig_complete()?

It is too early, and rtw_reconfig_complete() is the right place. v3 does
that.

On the reset path rtw_core_stop() has already cleared RTW_FLAG_RUNNING by
the time rtw_pci_reset_trx_ring() runs, so anything mac80211 hands the
driver between that wake and the end of the restart is freed again by
rtw_ops_tx(). reconfig_complete() is called from the wake_up label in
ieee80211_reconfig(), where the comment reads "If this is for hw restart
things are still running". It also makes the fix bus-independent instead
of PCI-only.

I measured it at the new hook before sending, with two builds of current
rtw-next that differ by nothing but this patch, using mac80211's own
tracepoints instead of a register read. Under load the BE queue is
stopped by the ring-full path, then rtw_fw_recovery() is called:

  without the patch
    511.499278  stop_queue  queue:2 reason:0      DRIVER, left dangling
    511.501625  stop_queue  queue:0-3 reason:4    SUSPEND, the restart
    511.957404  drv_reconfig_complete reconfig_type:0
    511.957411  wake_queue  queue:0-3 reason:4    only SUSPEND is woken
    AC_BE stays 0x00000001, 100% loss

  with the patch
    475.930915  drv_reconfig_complete reconfig_type:0
    475.930925  wake_queue  queue:2 reason:0      10 us later
    475.930926  wake_queue  queue:0-3 reason:4
    AC_BE reads 0x00000000, 0% loss

So the wake lands after the restart has completed and before mac80211
wakes the SUSPEND reason itself. No TXPAUSE write and no injection this
time - the ring fills on its own under load, which is also why I am happy
to leave the measurement out of the commit message.

One consequence I should flag, since v2 covered it and v3 does not. A
plain "ip link set wlan0 down/up" also reaches rtw_pci_reset_trx_ring(),
and mac80211 never clears a DRIVER stop on interface down - nothing
outside the stop/wake helpers touches local->q_stop_reasons[]. So with v3
a queue stopped before a down/up stays stopped. Is the restart case the
one you want fixed, or should a down/up release it too?

I also left ring->queue_stopped alone. It stays set until the first
completion after the restart, which clears it, and rtw_pci_tx_write()
does not read it before stopping a queue, so a stale value costs nothing.
I can clear it in rtw_pci_reset_trx_ring() if you would rather the driver
state did not claim a stop that is gone.

> As I see, the commit message can be very simple -- wake up queues for
> ieee80211_restart_hw() case.

Done, and the subject names it now. The measurement paragraph is out -
you are right that the stall belongs elsewhere.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: [PATCH rtw-next v2] wifi: rtw88: pci: wake the TX queues when the rings are reset
  2026-10-13 22:08   ` Abdurrahman Karadag
@ 2026-10-14  1:52     ` Ping-Ke Shih
  2026-10-16 22:47       ` Abdurrahman Karadag
  0 siblings, 1 reply; 6+ messages in thread
From: Ping-Ke Shih @ 2026-10-14  1:52 UTC (permalink / raw)
  To: Abdurrahman Karadag, linux-wireless@vger.kernel.org
  Cc: linux-kernel@vger.kernel.org

Abdurrahman Karadag <abdurrahmankaradag19@gmail.com> wrote:
> I also left ring->queue_stopped alone. It stays set until the first
> completion after the restart, which clears it, and rtw_pci_tx_write()
> does not read it before stopping a queue, so a stale value costs nothing.
> I can clear it in rtw_pci_reset_trx_ring() if you would rather the driver
> state did not claim a stop that is gone.

I re-think ring->queue_stopped and restart work. I feel the flow should be

1. fw/hw asked to restart -> rtw_fw_recovery_work() -> __fw_recovery_work()
2. __fw_recovery_work()
2.1. I think here should call ieee80211_stop_queues() to stop all TX queues
2.2. __fw_recovery_work() resets most driver states, but doesn't reset ring->queue_stopped.
     I think we can reset it (but not call ieee80211_wake_queues() if restarting) by
     rtw_pci_stop() -> rtw_pci_dma_release()
3. rtw_reconfig_complete()
   call ieee80211_wake_queues() as you did in v3.

I'll discuss above flow internally, and give back to you. 

Ping-Ke


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH rtw-next v2] wifi: rtw88: pci: wake the TX queues when the rings are reset
  2026-10-14  1:52     ` Ping-Ke Shih
@ 2026-10-16 22:47       ` Abdurrahman Karadag
  2026-10-19  1:25         ` Ping-Ke Shih
  0 siblings, 1 reply; 6+ messages in thread
From: Abdurrahman Karadag @ 2026-10-16 22:47 UTC (permalink / raw)
  To: linux-wireless; +Cc: pkshih, linux-kernel

> I re-think ring->queue_stopped and restart work. I feel the flow
> should be [...]
> I'll discuss above flow internally, and give back to you.

I traced the three steps against rtw-next. 2.1 looks more necessary than
I expected, 2.2 I need one clarification on, and 3 is v3.

2.1. ieee80211_restart_hw() does stop every queue, but only after the
teardown has run:

  rtw_fw_recovery_work()
      __fw_recovery_work()      <- rtw_enter_ips() on its last line
      ieee80211_restart_hw()    <- queues stopped here

RTW_FLAG_RUNNING is cleared in the rtw_core_stop() that rtw_enter_ips()
calls, so for almost all of the teardown neither flag test blocks a
frame - not the one in rtw_ops_tx(), not the one in
rtw_ops_wake_tx_queue(). And the guards do less than I thought. rtw88
does not set STA_MMPDU_TXQ, so in STA mode mgmt and nulldata fall to
rtw_ops_tx(), which frees the skb as I said last mail, while data goes
through .wake_tx_queue, which frees nothing - those frames stay queued,
and __rtw_tx_work() tests nothing at all.

The reset does unlist them - rtw_sta_remove() and rtw_reset_vif_iter()
call rtw_txq_cleanup() on every sta and vif txq - but those calls sit
just above rtw_enter_ips(), and the flag is still set until
rtw_core_stop() clears it, so .wake_tx_queue can relist a txq in
between; for AC_VO it runs __rtw_tx_work() inline. rtw_core_stop() does
not cancel tx_work, so one queued in that window can still be writing
descriptors and ringing the doorbell while the MAC is powered off.
ieee80211_stop_queues() at the top closes the TXQ path too, because
ieee80211_tx_dequeue() returns NULL on a stopped queue. So I would
keep 2.1.

The one thing I would check in 2.1 is the reason code.
ieee80211_stop_queues() uses IEEE80211_QUEUE_STOP_REASON_DRIVER, which
mac80211 does not unblock by itself - restart_hw() picks SUSPEND
deliberately, with the comment "use this reason, ieee80211_reconfig will
unblock it". And ieee80211_reconfig() can return before
reconfig_complete() is reached: if drv_start() fails it wakes only
SUSPEND and bails. A DRIVER stop taken in 2.1 would be left set on that
path, with step 3 never running.

2.2. There is no ieee80211_wake_queues() on that path today - pci.c has
one, in rtw_pci_io_resume() - so I read "(but not call
ieee80211_wake_queues() if restarting)" two ways: either the reset gets
a wake beside it for the callers that are not a restart, gated on
RTW_FLAG_RESTARTING, or the reset stands alone and step 3 owns the wake.
Which did you mean? The flag fits either way: it is set on the first
line of __fw_recovery_work() and cleared in rtw_reconfig_complete(), so
it is set across the whole teardown, rtw_pci_dma_release() included.

With a wake for the non-restart callers I have no question. With the
reset alone, that path is also reached outside a restart: rtw_enter_ips()
when mac80211 goes idle - which is how the restart itself gets there -
and rtw_ops_stop(), for a plain "ip link set wlan0 down/up" and for
suspend. Step 3 covers only the restart: ieee80211_reconfig() has two
callers, ieee80211_restart_work() and __ieee80211_resume(), so a down/up
never reaches rtw_reconfig_complete() with any reconfig_type at all. And
rtw_leave_ips() -> rtw_core_start() does not wake anything either.

Clearing the flag itself costs nothing, and it is what I offered last
mail - after rtw_pci_dma_release() the indices are rewound and the skbs
freed, so count is 0, and for as long as mac80211 holds a DRIVER stop on
that queue nothing completes, so the wake branch inside
rtw_pci_tx_isr()'s loop cannot run whether the flag is set or not. What
persists is mac80211's DRIVER slot, and that part is self-sustaining:
while it is set neither path reaches rtw_pci_tx_write() -
ieee80211_tx_dequeue() returns NULL for the TXQ frames, and
ieee80211_tx_frags() parks the rest on local->pending[] instead of
calling .tx - so nothing sets queue_stopped again.

3. That is v3 and the part I have measured. Luka Gejak's point from the
v3 thread sits here: rtw_reconfig_complete() also runs after a plain
resume, with RECONFIG_TYPE_SUSPEND. If the wake does go away there,
covering both types would close the resume case; the down/up case needs
something else, for the reason above. v3 stands on the list in the
meantime, and I am holding the respin until you come back with the flow,
so your decision and Luka's points land in the same version.

Your other two questions were in the bug thread; bringing them here as
you asked.

> could you describe how you resolve the stuck (by the method of your
> previous patch, maybe v1)?

Nothing the driver did on its own. Over the five events, power save off:

  rewrite the TXBD host index   0/3   read index never moved
  ip neigh flush                0/4
  iwd reconnect, new PTK        2/4   cleared 08-28 20:32, 09-06 03:17
  ip link set wlan0 down/up     1/2   cleared 09-14 17:48
  reboot                              always

The ladder stops at the first step that works, so the denominators are
not comparable, and the down/up row carries the caveat I sent on 3
October: on 09-14 19:09 the reconnect did fail - the AP answered status
30, "rejected association temporarily" - and the timeout at the down/up
step was my ladder giving up after 25 s rather than the outcome. The
journal has the interface up 3 s after the down/up, and the station
reassociated, with a fresh lease and no reboot, some 90 s after that -
but through iwd's own autoconnect, which it had fallen back to at the
status 30, eleven seconds before the down/up. So I cannot credit the
down/up with it either, and I have left the row at what the probe
measured. The doorbell rewrite is the patch I withdrew.

What the five do separate is narrower: nothing short of tearing the link
down ever cleared one. The two steps that never worked leave the
association alone, and every step that did clear one tore the
association or the interface down and rebuilt it - the down/up through
the driver's own rtw_ops_stop() -> rtw_core_stop() path. I cannot rank
the reconnect against the down/up, because the ladder gave the reconnect
the earlier attempts.

rtw_fw_recovery() also tears down and rebuilds, through the same
rtw_core_stop() -> rtw_power_off() -> rtw_hci_stop() -> rtw_pci_stop()
-> rtw_pci_dma_release() path. In the controlled stall I sent on 3
October it did reinitialise the ring and still left the BE stop reason
at 0x1, with nothing back in the 90 s I watched, while the same script
with patch 1 cleared the reason and had traffic back within 2 s. That is
the one measurement I have that bears on a workaround, and it is
narrower than it looks: the restart also cleared the REG_TXPAUSE I had
set, and in the field TXPAUSE was 0x00 already.

One thing I should flag before you read the dumps. My ladder pokes
debugfs fw_crash anyway, so nine of the captures print
"rtw_fw_recovery() tetikleniyor" - Turkish for "being triggered" - six
on 27 September, two on 14 October, and one where the knob was not
writable. Eight of them follow it with "fw_crash ->
ieee80211_restart_hw: 100% packet loss". Both strings are labels my
script prints for that rung, not anything the driver reported.
rtw_debugfs_set_fw_crash() never calls rtw_fw_recovery(): it leaves deep
LPS, sets RTW_FLAG_RESTART_TRIGGERING and writes REG_HRCV_MSG, and
recovery is entered only through the C2H path I described on 3 October,
which matches your point that the knob only takes effect on 8822C. So
nothing was triggered and nothing was tested at that rung. Section 4 of
the six September dumps also reads fw_crash as 1 before that dump's own
write, because the file prints RTW_FLAG_RESTART_TRIGGERING and only
__fw_recovery_work() clears it; all six are the same boot. The two
October ones are later boots and read 0.

> I suggest to turn it off for all experiments

Agreed. It is off at all five, and no dump since 01:00 on 1 September
records it as on - partly by construction, though: the watchdog forces
it off at the top of the same 20 s pass that takes the dump, and it has
had to do that about a hundred times since, because an iface down/up
returns it to the kernel default, as I said in the bug thread.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: [PATCH rtw-next v2] wifi: rtw88: pci: wake the TX queues when the rings are reset
  2026-10-16 22:47       ` Abdurrahman Karadag
@ 2026-10-19  1:25         ` Ping-Ke Shih
  0 siblings, 0 replies; 6+ messages in thread
From: Ping-Ke Shih @ 2026-10-19  1:25 UTC (permalink / raw)
  To: Abdurrahman Karadag, linux-wireless@vger.kernel.org
  Cc: linux-kernel@vger.kernel.org

Abdurrahman Karadag <abdurrahmankaradag19@gmail.com> wrote:
> > I re-think ring->queue_stopped and restart work. I feel the flow
> > should be [...]
> > I'll discuss above flow internally, and give back to you.

I discussed internally, and we suggest to add ieee80211_wake_queues() and
clear queue_stopped flags in rtw_pci_start().

This can resolve two cases -- restart_hw and interface down/up while
queue_stopped is flagging. Just like initialize or reset to variables. 

No need 3 steps I mentioned. (So I'd not reply your trace.)

> Your other two questions were in the bug thread; bringing them here as
> you asked.
> 
> > could you describe how you resolve the stuck (by the method of your
> > previous patch, maybe v1)?
> 
> Nothing the driver did on its own. Over the five events, power save off:
> 
>   rewrite the TXBD host index   0/3   read index never moved
>   ip neigh flush                0/4
>   iwd reconnect, new PTK        2/4   cleared 08-28 20:32, 09-06 03:17
>   ip link set wlan0 down/up     1/2   cleared 09-14 17:48
>   reboot                              always

So there is no solution for now. Since 3th and 4th events will stop/start
pci, if the cause to fail to recovery is flagged queue_stopped, our above
idea will be helpful. 

Another test is to remove/insert driver ko. It will reset queue states.

(I suppose you did these tests without changing any behavior as was).

[...]

> One thing I should flag before you read the dumps. My ladder pokes
> debugfs fw_crash anyway, so nine of the captures print
> "rtw_fw_recovery() tetikleniyor" - Turkish for "being triggered" - six
> on 27 September, two on 14 October, and one where the knob was not
> writable. Eight of them follow it with "fw_crash ->
> ieee80211_restart_hw: 100% packet loss". Both strings are labels my
> script prints for that rung, not anything the driver reported.
> rtw_debugfs_set_fw_crash() never calls rtw_fw_recovery(): it leaves deep
> LPS, sets RTW_FLAG_RESTART_TRIGGERING and writes REG_HRCV_MSG, and
> recovery is entered only through the C2H path I described on 3 October,
> which matches your point that the knob only takes effect on 8822C. So
> nothing was triggered and nothing was tested at that rung. Section 4 of
> the six September dumps also reads fw_crash as 1 before that dump's own
> write, because the file prints RTW_FLAG_RESTART_TRIGGERING and only
> __fw_recovery_work() clears it; all six are the same boot. The two
> October ones are later boots and read 0.

I need your help to summarize the dumps. I don't have much time to analyze 
them. Sorry. 



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-10-19  1:25 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-10 19:31 [PATCH rtw-next v2] wifi: rtw88: pci: wake the TX queues when the rings are reset Abdurrahman Karadag
2026-10-12  6:57 ` Ping-Ke Shih
2026-10-13 22:08   ` Abdurrahman Karadag
2026-10-14  1:52     ` Ping-Ke Shih
2026-10-16 22:47       ` Abdurrahman Karadag
2026-10-19  1:25         ` Ping-Ke Shih

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.