]> git.ipfire.org Git - thirdparty/openwrt.git/blob
8008b58ff4d40083bcc05ce11167d2edbcca2c9c
[thirdparty/openwrt.git] /
1 From f24d0d8c3cd7e4237f802c4d2f3bd4ac04572948 Mon Sep 17 00:00:00 2001
2 From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
3 Date: Sat, 10 May 2025 16:12:34 +0300
4 Subject: [PATCH] wifi: rtw88: Fix the random "error beacon valid" messages for
5 USB
6
7 All the USB devices have a problem in AP mode: uploading the updated
8 beacon to the chip's reserved page can randomly fail:
9
10 [34996.474304] rtw88_8723du 1-2:1.2: error beacon valid
11 [34996.474788] rtw88_8723du 1-2:1.2: failed to download drv rsvd page
12 [34999.956369] rtw88_8723du 1-2:1.2: error beacon valid
13 [34999.956846] rtw88_8723du 1-2:1.2: failed to download drv rsvd page
14 [34999.956855] rtw88_8723du 1-2:1.2: failed to download beacon
15 [35017.978296] rtw88_8723du 1-2:1.2: error beacon valid
16 [35017.978805] rtw88_8723du 1-2:1.2: failed to download drv rsvd page
17 [35017.978823] rtw88_8723du 1-2:1.2: failed to download beacon
18 [35023.200395] rtw88_8723du 1-2:1.2: error beacon valid
19 [35023.200869] rtw88_8723du 1-2:1.2: failed to download drv rsvd page
20 [35023.200875] rtw88_8723du 1-2:1.2: failed to download beacon
21 [35478.680547] rtw88_8723du 1-2:1.2: error beacon valid
22 [35478.681023] rtw88_8723du 1-2:1.2: failed to download drv rsvd page
23
24 Disable some beacon-related hardware functions before uploading the
25 beacon and enable them again after.
26
27 Tested with RTL8723DU, RTL8812BU, RTL8822CE.
28
29 Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
30 Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
31 Link: https://patch.msgid.link/c248c40a-d432-47ed-90e0-d81ee6c32464@gmail.com
32 ---
33 drivers/net/wireless/realtek/rtw88/fw.c | 8 +++++++-
34 1 file changed, 7 insertions(+), 1 deletion(-)
35
36 --- a/drivers/net/wireless/realtek/rtw88/fw.c
37 +++ b/drivers/net/wireless/realtek/rtw88/fw.c
38 @@ -1467,7 +1467,7 @@ void rtw_add_rsvd_page_sta(struct rtw_de
39 int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,
40 u8 *buf, u32 size)
41 {
42 - u8 bckp[2];
43 + u8 bckp[3];
44 u8 val;
45 u16 rsvd_pg_head;
46 u32 bcn_valid_addr;
47 @@ -1479,6 +1479,8 @@ int rtw_fw_write_data_rsvd_page(struct r
48 if (!size)
49 return -EINVAL;
50
51 + bckp[2] = rtw_read8(rtwdev, REG_BCN_CTRL);
52 +
53 if (rtw_chip_wcpu_11n(rtwdev)) {
54 rtw_write32_set(rtwdev, REG_DWBCN0_CTRL, BIT_BCN_VALID);
55 } else {
56 @@ -1492,6 +1494,9 @@ int rtw_fw_write_data_rsvd_page(struct r
57 val |= BIT_ENSWBCN >> 8;
58 rtw_write8(rtwdev, REG_CR + 1, val);
59
60 + rtw_write8(rtwdev, REG_BCN_CTRL,
61 + (bckp[2] & ~BIT_EN_BCN_FUNCTION) | BIT_DIS_TSF_UDT);
62 +
63 if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE) {
64 val = rtw_read8(rtwdev, REG_FWHW_TXQ_CTRL + 2);
65 bckp[1] = val;
66 @@ -1522,6 +1527,7 @@ restore:
67 rsvd_pg_head = rtwdev->fifo.rsvd_boundary;
68 rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2,
69 rsvd_pg_head | BIT_BCN_VALID_V1);
70 + rtw_write8(rtwdev, REG_BCN_CTRL, bckp[2]);
71 if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE)
72 rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, bckp[1]);
73 rtw_write8(rtwdev, REG_CR + 1, bckp[0]);