]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw88: Fix USB/SDIO devices not transmitting beacons
authorBitterblue Smith <rtl8821cerfe2@gmail.com>
Wed, 21 Aug 2024 13:11:03 +0000 (16:11 +0300)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 2 Sep 2024 00:36:01 +0000 (08:36 +0800)
All USB devices supported by rtw88 have the same problem: they don't
transmit beacons in AP mode. (Some?) SDIO devices are also affected.
The cause appears to be clearing BIT_EN_BCNQ_DL of REG_FWHW_TXQ_CTRL
before uploading the beacon reserved page, so don't clear the bit for
USB and SDIO devices.

Tested with RTL8811CU and RTL8723DU.

Cc: <stable@vger.kernel.org> # 6.6.x
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/49de73b5-698f-4865-ab63-100e28dfc4a1@gmail.com
drivers/net/wireless/realtek/rtw88/fw.c

index ab7d414d0ba67988491b244bb0b74c06a55f9003..b9b0114e253b4366b5ac94fd707065a434d7ddc0 100644 (file)
@@ -1468,10 +1468,12 @@ int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,
        val |= BIT_ENSWBCN >> 8;
        rtw_write8(rtwdev, REG_CR + 1, val);
 
-       val = rtw_read8(rtwdev, REG_FWHW_TXQ_CTRL + 2);
-       bckp[1] = val;
-       val &= ~(BIT_EN_BCNQ_DL >> 16);
-       rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, val);
+       if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE) {
+               val = rtw_read8(rtwdev, REG_FWHW_TXQ_CTRL + 2);
+               bckp[1] = val;
+               val &= ~(BIT_EN_BCNQ_DL >> 16);
+               rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, val);
+       }
 
        ret = rtw_hci_write_data_rsvd_page(rtwdev, buf, size);
        if (ret) {
@@ -1496,7 +1498,8 @@ restore:
        rsvd_pg_head = rtwdev->fifo.rsvd_boundary;
        rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2,
                    rsvd_pg_head | BIT_BCN_VALID_V1);
-       rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, bckp[1]);
+       if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE)
+               rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, bckp[1]);
        rtw_write8(rtwdev, REG_CR + 1, bckp[0]);
 
        return ret;