]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: rtw89: hw_scan: Don't let the operating channel be last
authorBitterblue Smith <rtl8821cerfe2@gmail.com>
Thu, 13 Nov 2025 22:54:48 +0000 (00:54 +0200)
committerPing-Ke Shih <pkshih@realtek.com>
Thu, 20 Nov 2025 03:36:01 +0000 (11:36 +0800)
Scanning can be offloaded to the firmware. To that end, the driver
prepares a list of channels to scan, including periodic visits back to
the operating channel, and sends the list to the firmware.

When the channel list is too long to fit in a single H2C message, the
driver splits the list, sends the first part, and tells the firmware to
scan. When the scan is complete, the driver sends the next part of the
list and tells the firmware to scan.

When the last channel that fit in the H2C message is the operating
channel something seems to go wrong in the firmware. It will
acknowledge receiving the list of channels but apparently it will not
do anything more. The AP can't be pinged anymore. The driver still
receives beacons, though.

One way to avoid this is to split the list of channels before the
operating channel.

Affected devices:

* RTL8851BU with firmware 0.29.41.3
* RTL8832BU with firmware 0.29.29.8
* RTL8852BE with firmware 0.29.29.8

The commit 57a5fbe39a18 ("wifi: rtw89: refactor flow that hw scan handles channel list")
is found by git blame, but it is actually to refine the scan flow, but not
a culprit, so skip Fixes tag.

Reported-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Closes: https://lore.kernel.org/linux-wireless/0abbda91-c5c2-4007-84c8-215679e652e1@gmail.com/
Cc: stable@vger.kernel.org # 6.16+
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/c1e61744-8db4-4646-867f-241b47d30386@gmail.com
drivers/net/wireless/realtek/rtw89/fw.c

index ab904a7def1b448224178914c33238a4652fba35..080c4f8a655a86ed0f1968b436efb482af571b23 100644 (file)
@@ -7694,6 +7694,13 @@ int rtw89_hw_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
        INIT_LIST_HEAD(&list);
 
        list_for_each_entry_safe(ch_info, tmp, &scan_info->chan_list, list) {
+               /* The operating channel (tx_null == true) should
+                * not be last in the list, to avoid breaking
+                * RTL8851BU and RTL8832BU.
+                */
+               if (list_len + 1 == RTW89_SCAN_LIST_LIMIT_AX && ch_info->tx_null)
+                       break;
+
                list_move_tail(&ch_info->list, &list);
 
                list_len++;