* [PATCH rtw-next] wifi: rtw88: Enable receiving control frames in monitor mode
@ 2026-06-22 17:02 Bitterblue Smith
2026-06-23 1:15 ` Ping-Ke Shih
0 siblings, 1 reply; 2+ messages in thread
From: Bitterblue Smith @ 2026-06-22 17:02 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih, Georg Bißeling
From: Bitterblue Smith (S.E.A. Datentechnik GmbH) <rtl8821cerfe2@gmail.com>
By default RTL8723D, RTL8703B, RTL8812A, RTL8821A, and RTL8814A are
configured to filter out all control frames except PS-Poll, even in
monitor mode.
Handle FIF_CONTROL in rtw_ops_configure_filter(). When it's set,
configure REG_RXFLTMAP1 to let all control frames through. When it's
unset, restore the original value. Because some drivers configure
REG_RXFLTMAP1 differently, keep track of its value in a new member of
struct rtw_hal.
Signed-off-by: Bitterblue Smith (S.E.A. Datentechnik GmbH) <rtl8821cerfe2@gmail.com>
---
drivers/net/wireless/realtek/rtw88/bf.c | 6 ++++--
drivers/net/wireless/realtek/rtw88/mac80211.c | 8 +++++++-
drivers/net/wireless/realtek/rtw88/main.h | 1 +
drivers/net/wireless/realtek/rtw88/rtw8723x.c | 3 ++-
drivers/net/wireless/realtek/rtw88/rtw8814a.c | 3 ++-
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 4 +++-
drivers/net/wireless/realtek/rtw88/rtw8821c.h | 3 ++-
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 7 +++++--
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 7 +++++--
drivers/net/wireless/realtek/rtw88/rtw88xxa.c | 3 ++-
10 files changed, 33 insertions(+), 12 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/realtek/rtw88/bf.c
index 0d0ccbc7d00c..7313ecc5c82a 100644
--- a/drivers/net/wireless/realtek/rtw88/bf.c
+++ b/drivers/net/wireless/realtek/rtw88/bf.c
@@ -137,7 +137,8 @@ void rtw_bf_cfg_sounding(struct rtw_dev *rtwdev, struct rtw_vif *vif,
rtw_write8_mask(rtwdev, REG_SND_PTCL_CTRL, BIT_MASK_BEAMFORM,
RTW_SND_CTRL_SOUNDING);
rtw_write8(rtwdev, REG_SND_PTCL_CTRL + 3, 0x26);
- rtw_write8_clr(rtwdev, REG_RXFLTMAP1, BIT_RXFLTMAP1_BF_REPORT_POLL);
+ rtwdev->hal.rxfltmap1 &= ~BIT_RXFLTMAP1_BF_REPORT_POLL;
+ rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);
rtw_write8_clr(rtwdev, REG_RXFLTMAP4, BIT_RXFLTMAP4_BF_REPORT_POLL);
if (vif->net_type == RTW_NET_AP_MODE)
@@ -269,7 +270,8 @@ void rtw_bf_enable_bfee_mu(struct rtw_dev *rtwdev, struct rtw_vif *vif,
rtw_write16_set(rtwdev, REG_RXFLTMAP0, BIT_RXFLTMAP0_ACTIONNOACK);
/* accept NDPA and BF report poll */
- rtw_write16_set(rtwdev, REG_RXFLTMAP1, BIT_RXFLTMAP1_BF);
+ rtwdev->hal.rxfltmap1 |= BIT_RXFLTMAP1_BF;
+ rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);
}
EXPORT_SYMBOL(rtw_bf_enable_bfee_mu);
diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
index 766f22d31079..b01b98d24b0a 100644
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
@@ -281,12 +281,18 @@ static void rtw_ops_configure_filter(struct ieee80211_hw *hw,
struct rtw_dev *rtwdev = hw->priv;
*new_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_FCSFAIL |
- FIF_BCN_PRBRESP_PROMISC;
+ FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
mutex_lock(&rtwdev->mutex);
rtw_leave_lps_deep(rtwdev);
+ if (changed_flags & FIF_CONTROL) {
+ if (*new_flags & FIF_CONTROL)
+ rtw_write16(rtwdev, REG_RXFLTMAP1, 0xffff);
+ else
+ rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);
+ }
if (changed_flags & FIF_ALLMULTI) {
if (*new_flags & FIF_ALLMULTI)
rtwdev->hal.rcr |= BIT_AM;
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
index 9c0b746540b0..c6e981ba7986 100644
--- a/drivers/net/wireless/realtek/rtw88/main.h
+++ b/drivers/net/wireless/realtek/rtw88/main.h
@@ -1963,6 +1963,7 @@ struct rtw_sar {
struct rtw_hal {
u32 rcr;
+ u16 rxfltmap1;
u32 chip_version;
u8 cut_version;
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723x.c b/drivers/net/wireless/realtek/rtw88/rtw8723x.c
index 3f3e9b0c44e8..97e6f6a62c0d 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8723x.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723x.c
@@ -356,7 +356,8 @@ static int __rtw8723x_mac_init(struct rtw_dev *rtwdev)
rtw_write32(rtwdev, REG_TCR, BIT_TCR_CFG);
rtw_write16(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
- rtw_write16(rtwdev, REG_RXFLTMAP1, WLAN_RX_FILTER1);
+ rtwdev->hal.rxfltmap1 = WLAN_RX_FILTER1;
+ rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);
rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8814a.c b/drivers/net/wireless/realtek/rtw88/rtw8814a.c
index ca1079e12023..fa02aa299b5e 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8814a.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8814a.c
@@ -400,7 +400,8 @@ static int rtw8814a_mac_init(struct rtw_dev *rtwdev)
rtw_write16(rtwdev, REG_RETRY_LIMIT, 0x3030);
rtw_write16(rtwdev, REG_RXFLTMAP0, 0xffff);
- rtw_write16(rtwdev, REG_RXFLTMAP1, 0x0400);
+ rtwdev->hal.rxfltmap1 = 0x0400;
+ rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);
rtw_write16(rtwdev, REG_RXFLTMAP2, 0xffff);
rtw_write8(rtwdev, REG_MAX_AGGR_NUM, 0x36);
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
index 246046da4f13..ee689fa3d87f 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
@@ -248,7 +248,9 @@ static int rtw8821c_mac_init(struct rtw_dev *rtwdev)
rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8);
/* WMAC configuration */
- rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
+ rtw_write16(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
+ rtwdev->hal.rxfltmap1 = WLAN_RX_FILTER1;
+ rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);
rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512);
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
index 954e93c8020d..ea85b7e73050 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
@@ -139,7 +139,8 @@ extern const struct rtw_chip_info rtw8821c_hw_spec;
#define WLAN_DRV_EARLY_INT 0x04
#define WLAN_BCN_DMA_TIME 0x02
-#define WLAN_RX_FILTER0 0x0FFFFFFF
+#define WLAN_RX_FILTER0 0xFFFF
+#define WLAN_RX_FILTER1 0x0FFF
#define WLAN_RX_FILTER2 0xFFFF
#define WLAN_RCR_CFG 0xE400220E
#define WLAN_RXPKT_MAX_SZ 12288
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
index 37b7a520fea0..a56c8befa077 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
@@ -202,7 +202,8 @@ static void rtw8822b_phy_set_param(struct rtw_dev *rtwdev)
#define WLAN_DRV_EARLY_INT 0x04
#define WLAN_BCN_DMA_TIME 0x02
-#define WLAN_RX_FILTER0 0x0FFFFFFF
+#define WLAN_RX_FILTER0 0xFFFF
+#define WLAN_RX_FILTER1 0x0FFF
#define WLAN_RX_FILTER2 0xFFFF
#define WLAN_RCR_CFG 0xE400220E
#define WLAN_RXPKT_MAX_SZ 12288
@@ -273,7 +274,9 @@ static int rtw8822b_mac_init(struct rtw_dev *rtwdev)
rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME);
rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8);
/* WMAC configuration */
- rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
+ rtw_write16(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
+ rtwdev->hal.rxfltmap1 = WLAN_RX_FILTER1;
+ rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);
rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512);
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
index 80c9f0c11e5c..64ba5dbfe2bd 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
@@ -1942,7 +1942,8 @@ static void rtw8822c_phy_set_param(struct rtw_dev *rtwdev)
#define WLAN_EDCA_BE_PARAM 0x005EA42B
#define WLAN_EDCA_BK_PARAM 0x0000A44F
-#define WLAN_RX_FILTER0 0xFFFFFFFF
+#define WLAN_RX_FILTER0 0xFFFF
+#define WLAN_RX_FILTER1 0xFFFF
#define WLAN_RX_FILTER2 0xFFFF
#define WLAN_RCR_CFG 0xE400220E
#define WLAN_RXPKT_MAX_SZ 12288
@@ -2093,7 +2094,9 @@ static int rtw8822c_mac_init(struct rtw_dev *rtwdev)
rtw_write16(rtwdev, REG_EIFS, WLAN_EIFS_DUR_TUNE);
rtw_write8(rtwdev, REG_NAV_CTRL + 2, WLAN_NAV_MAX);
rtw_write8(rtwdev, REG_WMAC_TRXPTCL_CTL_H + 2, WLAN_BAR_ACK_TYPE);
- rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
+ rtw_write16(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
+ rtwdev->hal.rxfltmap1 = WLAN_RX_FILTER1;
+ rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);
rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512);
diff --git a/drivers/net/wireless/realtek/rtw88/rtw88xxa.c b/drivers/net/wireless/realtek/rtw88/rtw88xxa.c
index 0fa943271fb6..2eaadcfec4cb 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw88xxa.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw88xxa.c
@@ -512,7 +512,8 @@ static int rtw88xxau_init_queue_priority(struct rtw_dev *rtwdev)
static void rtw88xxa_init_wmac_setting(struct rtw_dev *rtwdev)
{
rtw_write16(rtwdev, REG_RXFLTMAP0, 0xffff);
- rtw_write16(rtwdev, REG_RXFLTMAP1, 0x0400);
+ rtwdev->hal.rxfltmap1 = 0x0400;
+ rtw_write16(rtwdev, REG_RXFLTMAP1, rtwdev->hal.rxfltmap1);
rtw_write16(rtwdev, REG_RXFLTMAP2, 0xffff);
rtw_write32(rtwdev, REG_MAR, 0xffffffff);
--
2.54.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* RE: [PATCH rtw-next] wifi: rtw88: Enable receiving control frames in monitor mode
2026-06-22 17:02 [PATCH rtw-next] wifi: rtw88: Enable receiving control frames in monitor mode Bitterblue Smith
@ 2026-06-23 1:15 ` Ping-Ke Shih
0 siblings, 0 replies; 2+ messages in thread
From: Ping-Ke Shih @ 2026-06-23 1:15 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org; +Cc: Georg Bißeling
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> From: Bitterblue Smith (S.E.A. Datentechnik GmbH) <rtl8821cerfe2@gmail.com>
>
> By default RTL8723D, RTL8703B, RTL8812A, RTL8821A, and RTL8814A are
> configured to filter out all control frames except PS-Poll, even in
> monitor mode.
>
> Handle FIF_CONTROL in rtw_ops_configure_filter(). When it's set,
> configure REG_RXFLTMAP1 to let all control frames through. When it's
> unset, restore the original value. Because some drivers configure
> REG_RXFLTMAP1 differently, keep track of its value in a new member of
> struct rtw_hal.
All behaviors are unchanged for non-monitor mode, right?
>
> Signed-off-by: Bitterblue Smith (S.E.A. Datentechnik GmbH) <rtl8821cerfe2@gmail.com>
Once you migrate to your company mail, maybe you can add an entry to .mailmap,
which only affects the output of git-shortlog though.
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-06-23 1:15 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-22 17:02 [PATCH rtw-next] wifi: rtw88: Enable receiving control frames in monitor mode Bitterblue Smith
2026-06-23 1:15 ` 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.