All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Luka Gejak" <luka.gejak@linux.dev>
To: "Jeremy Fareau" <jeremy.fareau@gmail.com>,
	"Ping-Ke Shih" <pkshih@realtek.com>
Cc: <linux-wireless@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	"Kalle Valo" <kvalo@kernel.org>,
	"Brian Norris" <briannorris@chromium.org>
Subject: Re: [PATCH wireless 2/2] wifi: rtw88: restore the control frame filter when the device is started
Date: Sun, 11 Oct 2026 13:08:39 +0000	[thread overview]
Message-ID: <DM216XAEDYAN.IZDPPZ4YWPLG@linux.dev> (raw)
In-Reply-To: <20261007091225.413-3-jeremy.fareau@gmail.com>

On Wed Oct 7, 2026 at 9:12 AM UTC, Jeremy Fareau wrote:
> Commit ed51a86b787f ("wifi: rtw88: Enable receiving control frames in
> monitor mode") writes REG_RXFLTMAP1 from configure_filter(), but that
> register is reset to the chip default by the chip's mac_init() during
> power_on().  mac80211 only calls ieee80211_ops::configure_filter() when
> its own filter flags change, so after a stop/start cycle the flags are
> unchanged and the control frame filter silently reverts: monitor mode
> stops delivering control frames again.
> 
> Keep track of the value configure_filter() last asked for and restore
> it in rtw_core_start(), next to the RCR restore, which exists for the
> same reason.
> 
> Measured on an RTL8814AU and an RTL8812AU in monitor mode on channel 6,
> 40 s captures taken after a down/up cycle.  Control frames go from 0 to
> 23184 and from 0 to 483 respectively; without this change both are 0.
> 
> Fixes: ed51a86b787f ("wifi: rtw88: Enable receiving control frames in monitor mode")

Please add Cc: stable@vger.kernel.org

> Assisted-by: LLM
> Signed-off-by: Jeremy Fareau <jeremy.fareau@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtw88/mac80211.c | 5 +++--
>  drivers/net/wireless/realtek/rtw88/main.c     | 8 ++++++++
>  drivers/net/wireless/realtek/rtw88/main.h     | 1 +
>  3 files changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
> index 827f38390969..84d869f1efe0 100644
> --- a/drivers/net/wireless/realtek/rtw88/mac80211.c
> +++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
> @@ -300,9 +300,10 @@ static void rtw_ops_configure_filter(struct ieee80211_hw *hw,
>  
>  	if (changed_flags & FIF_CONTROL) {
>  		if (*new_flags & FIF_CONTROL)
> -			rtw_write16(rtwdev, REG_RXFLTMAP1, 0xffff);
> +			rtwdev->hal.rxfltmap1_cur = 0xffff;
>  		else
> -			rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);
> +			rtwdev->hal.rxfltmap1_cur = rtwdev->hal.rxfltmap1;
> +		rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1_cur);
>  	}
>  	if (changed_flags & FIF_ALLMULTI) {

I would change the new rxfltmap1_cur because hal->rxfltmap1 is not a constant.
The beamforming code edits it and writes the register with the
edited value:

          bf.c:140        rtwdev->hal.rxfltmap1 &= ~BIT_RXFLTMAP1_BF_REPORT_POLL;
          bf.c:141        rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);
          bf.c:273        rtwdev->hal.rxfltmap1 |= BIT_RXFLTMAP1_BF;
          bf.c:274        rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);

So after this patch the driver keeps two cached copies of one register. On an
8822C in monitor mode, configure_filter() caches 0xffff while bf.c has cleared
the report poll bit in hal->rxfltmap1, so the next stop/start restores 0xffff
and undoes that. The reverse happens too: a request with FIF_CONTROL off
caches hal->rxfltmap1 as it stands at that moment, and later bf.c edits are
lost at the next restart.

I would keep one variable and add one flag instead of a second shadow value.
It would remember whether control frames were requested, and then on restore
it would rebuild the register from that flag and hal->rxfltmap1.

> diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
> index cd9254370fcc..ea61020a0622 100644
> --- a/drivers/net/wireless/realtek/rtw88/main.c
> +++ b/drivers/net/wireless/realtek/rtw88/main.c
> @@ -1528,6 +1528,14 @@ int rtw_core_start(struct rtw_dev *rtwdev)
>  	/* rcr reset after powered on */
>  	rtw_write32(rtwdev, REG_RCR, rtwdev->hal.rcr);
>  
> +	/* REG_RXFLTMAP1 is reset by the chip's mac_init() during power_on(),
> +	 * and mac80211 only calls ieee80211_ops::configure_filter() when its
> +	 * own filter flags change.  After a stop/start cycle the flags are
> +	 * unchanged, so restore the value configure_filter() last asked for.
> +	 */

Comment style, same as in patch 1.

> +	if (rtwdev->hal.rxfltmap1_cur)
> +		rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1_cur);
> +

A nit: this line doubles as "configure_filter has run". It only works because
no chip has a zero default (0x400, 0x0FFF, 0xFFFF), so an explicit flag would
not depend on that.

Best regards,
Luka Gejak

  reply	other threads:[~2026-10-11 13:08 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-07  9:12 [PATCH wireless 0/2] wifi: rtw88: channel and control frame filter lost on interface restart Jeremy Fareau
2026-10-07  9:12 ` [PATCH wireless 1/2] wifi: rtw88: program the channel when the device is started Jeremy Fareau
2026-10-09 12:12   ` Luka Gejak
2026-10-12  2:07   ` Ping-Ke Shih
2026-10-07  9:12 ` [PATCH wireless 2/2] wifi: rtw88: restore the control frame filter " Jeremy Fareau
2026-10-11 13:08   ` Luka Gejak [this message]
2026-10-12  2:28   ` 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=DM216XAEDYAN.IZDPPZ4YWPLG@linux.dev \
    --to=luka.gejak@linux.dev \
    --cc=briannorris@chromium.org \
    --cc=jeremy.fareau@gmail.com \
    --cc=kvalo@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=pkshih@realtek.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 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.