mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ping-Ke Shih <pkshih@realtek.com>
To: Abdurrahman Karadag <abdurrahmankaradag19@gmail.com>
Cc: "linux-wireless@vger.kernel.org" <linux-wireless@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"rtl8821cerfe2@gmail.com" <rtl8821cerfe2@gmail.com>
Subject: RE: [PATCH rtw-next 1/2] wifi: rtw88: pci: wake the TX queues when the rings are reset
Date: Mon, 5 Oct 2026 01:49:24 +0000	[thread overview]
Message-ID: <f7f10dc29e1641999903347b94815e09@realtek.com> (raw)
In-Reply-To: <20261002231013.11792-2-abdurrahmankaradag19@gmail.com>

Abdurrahman Karadag <abdurrahmankaradag19@gmail.com> wrote:
> For a queue stopped by the PCI TX ring-full path, ring->queue_stopped
> is normally cleared and the stop reason released only from the
> completion loop in rtw_pci_tx_isr(). When the rings are reset the
> pending descriptors are dropped and their skbs are freed directly by
> rtw_pci_free_tx_ring_skbs(), so that loop never runs for them. The flag
> and the stop reason both survive the reset, and because the ring is now
> empty no completion will ever arrive to clear them. Any queue stopped
> that way stays stopped.
> 
> This makes ieee80211_restart_hw() unable to recover a device that
> stopped a queue before the restart, which is the opposite of what the
> recovery is for.
> 
> Reproduced on an RTL8821CE by pausing TX in hardware, which freezes the
> read index while the driver keeps submitting, the same shape the chip
> shows when it wedges on its own:
> 
>     # echo "522 f 1" > /sys/kernel/debug/ieee80211/phy0/rtw88/write_reg
>     # ... push traffic until the ring fills ...
>     BE 0x3a8: 0x0081007f, avail_desc() 1, BE queue stop reason 0x1
> 
>     # (call rtw_fw_recovery() from a debug build)
>     firmware crash, start reset and recover
>     ieee80211 phy1: Hardware restart was requested
>     wlan0: associated
> 
>     REG_TXPAUSE 0x00, BE 0x3a8: 0x00000000, ring empty
>     BE queue stop reason 0x1, 100% packet loss, no recovery in 90 s
> 
> The station reassociated twice during those 90 s, so the link was fine;
> only the queue was still stopped. With this patch the same sequence
> clears the stop reason and traffic returns within 2 s.

I feel there are too much detail in commit message. Just describe why
this patch is necessary, and how it fix the problem.

> 
> Record the queue mappings this path stops and release them both from
> the completion loop and when the reset empties the ring. It has to be a
> set rather than one value: the stop runs after every submission that
> leaves fewer than two descriptors, rtw_pci_tx_write_data() still
> accepts a frame while one is left, and rtw_tx_queue_mapping() places
> management frames on the MGMT ring and multicast on HI0 whatever their
> skb queue mapping is, so one ring can stop two different queues before
> it is emptied. Keeping only the last one would leave the other stopped
> for good.
> 
> Recording the mappings also limits the wake to the queues this
> ring-full path actually stopped, instead of waking every mac80211
> queue.
> 
> Fixes: e3037485c68e ("rtw88: new Realtek 802.11ac driver")

This is to assist with recovery, right? So at the initial moment,
we didn't support recovery yet. No this fixes then.

> Signed-off-by: Abdurrahman Karadag <abdurrahmankaradag19@gmail.com>
> ---

[...]

>  static void rtw_pci_reset_trx_ring(struct rtw_dev *rtwdev)
>  {
> +       struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
> +       struct rtw_pci_tx_ring *ring;
> +       enum rtw_tx_queue_type queue;
> +
>         rtw_pci_reset_buf_desc(rtwdev);
> +
> +       /*
> +        * The rings are empty again, so nothing is left whose completion
> +        * could reach the wake in rtw_pci_tx_isr(). Release the queues this
> +        * path stopped - the stop reasons it set are cleared nowhere else,
> +        * and over an empty ring no completion will ever arrive to clear
> +        * them.
> +        */
> +       for (queue = 0; queue < RTK_MAX_TX_QUEUE_NUM; queue++) {
> +               ring = &rtwpci->tx_rings[queue];
> +
> +               if (!ring->queue_stopped)
> +                       continue;
> +
> +               rtw_pci_wake_stopped_queues(rtwdev, ring);
> +       }

Is it enough just a ieee80211_wake_queues()? No other changes.

>  }
> 
>  static void rtw_pci_enable_interrupt(struct rtw_dev *rtwdev,



  reply	other threads:[~2026-10-05  1:49 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-02 23:10 [PATCH rtw-next 0/2] rtw88: recover a stopped TX queue, and notice a stalled ring Abdurrahman Karadag
2026-10-02 23:10 ` [PATCH rtw-next 1/2] wifi: rtw88: pci: wake the TX queues when the rings are reset Abdurrahman Karadag
2026-10-05  1:49   ` Ping-Ke Shih [this message]
2026-10-02 23:10 ` [PATCH rtw-next 2/2] wifi: rtw88: pci: warn when a TX ring stops advancing Abdurrahman Karadag
2026-10-05  1:52   ` Ping-Ke Shih

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f7f10dc29e1641999903347b94815e09@realtek.com \
    --to=pkshih@realtek.com \
    --cc=abdurrahmankaradag19@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=rtl8821cerfe2@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®