* [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU
@ 2025-08-01 20:35 Bitterblue Smith
2025-08-01 20:37 ` [PATCH rtw-next 01/11] wifi: rtw89: Fix rtw89_core_get_ch_dma() " Bitterblue Smith
` (8 more replies)
0 siblings, 9 replies; 10+ messages in thread
From: Bitterblue Smith @ 2025-08-01 20:35 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
Add support for RTL8852CU. It works well but sometimes it loses the
connection:
Jul 04 16:05:56 ideapad2 kernel: wlp3s0f3u4: Connection to AP ... lost
Jul 14 13:45:26 ideapad2 kernel: wlp3s0f3u4: Connection to AP ... lost
Jul 15 17:51:28 ideapad2 kernel: wlp3s0f3u4: Connection to AP ... lost
Jul 18 14:43:30 ideapad2 kernel: wlp3s0f3u4: Connection to AP ... lost
Jul 24 14:58:07 ideapad2 kernel: wlp3s0f3u4: Connection to AP ... lost
When that happens it reconnects immediately.
Bitterblue Smith (11):
wifi: rtw89: Fix rtw89_core_get_ch_dma() for RTL8852CU
wifi: rtw89: usb: Fix rtw89_usb_get_bulkout_id() for RTL8852CU
wifi: rtw89: usb: Fix rtw89_usb_ops_mac_pre_init() for RTL8852CU
wifi: rtw89: usb: Fix rtw89_usb_ops_mac_post_init() for RTL8852CU
wifi: rtw89: Fix rtw89_mac_dmac_func_pre_en_ax() for USB/SDIO
wifi: rtw89: 8852c: Fix rtw8852c_pwr_{on,off}_func() for USB
wifi: rtw89: Add rtw8852c_dle_mem_usb{2,3}
wifi: rtw89: Add rtw8852c_hfc_param_ini_usb
wifi: rtw89: 8852c: Accept USB devices and load their MAC address
wifi: rtw89: Add rtw8852cu.c
wifi: rtw89: Enable the new rtw89_8852cu module.
drivers/net/wireless/realtek/rtw89/Kconfig | 11 ++
drivers/net/wireless/realtek/rtw89/Makefile | 3 +
drivers/net/wireless/realtek/rtw89/mac.c | 31 ++++-
drivers/net/wireless/realtek/rtw89/mac.h | 10 ++
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 124 +++++++++++++++---
drivers/net/wireless/realtek/rtw89/rtw8852c.h | 2 +-
.../net/wireless/realtek/rtw89/rtw8852cu.c | 45 +++++++
drivers/net/wireless/realtek/rtw89/txrx.h | 19 +++
drivers/net/wireless/realtek/rtw89/usb.c | 118 +++++++++++++----
9 files changed, 316 insertions(+), 47 deletions(-)
create mode 100644 drivers/net/wireless/realtek/rtw89/rtw8852cu.c
--
2.50.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH rtw-next 01/11] wifi: rtw89: Fix rtw89_core_get_ch_dma() for RTL8852CU
2025-08-01 20:35 [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
@ 2025-08-01 20:37 ` Bitterblue Smith
2025-08-01 20:37 ` [PATCH rtw-next 02/11] wifi: rtw89: usb: Fix rtw89_usb_get_bulkout_id() " Bitterblue Smith
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Bitterblue Smith @ 2025-08-01 20:37 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
It seems RTL8852CU can only use TX channels 0, 2, and 8 (for band 0),
otherwise the chip stops working after downloading at maximum speed
for a few seconds.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
drivers/net/wireless/realtek/rtw89/txrx.h | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtw89/txrx.h b/drivers/net/wireless/realtek/rtw89/txrx.h
index ec01bfc363da..318fd0ac8726 100644
--- a/drivers/net/wireless/realtek/rtw89/txrx.h
+++ b/drivers/net/wireless/realtek/rtw89/txrx.h
@@ -734,6 +734,25 @@ rtw89_core_get_qsel_mgmt(struct rtw89_dev *rtwdev, struct rtw89_core_tx_request
static inline u8 rtw89_core_get_ch_dma(struct rtw89_dev *rtwdev, u8 qsel)
{
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_USB &&
+ rtwdev->chip->chip_id == RTL8852C) {
+ switch (qsel) {
+ default:
+ rtw89_warn(rtwdev, "Cannot map qsel to dma: %d\n",
+ qsel);
+ fallthrough;
+ case RTW89_TX_QSEL_BE_0:
+ case RTW89_TX_QSEL_VO_0:
+ return RTW89_TXCH_ACH0;
+ case RTW89_TX_QSEL_BK_0:
+ case RTW89_TX_QSEL_VI_0:
+ return RTW89_TXCH_ACH2;
+ case RTW89_TX_QSEL_B0_MGMT:
+ case RTW89_TX_QSEL_B0_HI:
+ return RTW89_TXCH_CH8;
+ }
+ }
+
switch (qsel) {
default:
rtw89_warn(rtwdev, "Cannot map qsel to dma: %d\n", qsel);
--
2.50.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 02/11] wifi: rtw89: usb: Fix rtw89_usb_get_bulkout_id() for RTL8852CU
2025-08-01 20:35 [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
2025-08-01 20:37 ` [PATCH rtw-next 01/11] wifi: rtw89: Fix rtw89_core_get_ch_dma() " Bitterblue Smith
@ 2025-08-01 20:37 ` Bitterblue Smith
2025-08-01 20:38 ` [PATCH rtw-next 03/11] wifi: rtw89: usb: Fix rtw89_usb_ops_mac_pre_init() " Bitterblue Smith
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Bitterblue Smith @ 2025-08-01 20:37 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
RTL8852CU can work in two bands at the same time, thus some USB bulk
out endpoints are dedicated to one band, others to the other band.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
drivers/net/wireless/realtek/rtw89/usb.c | 64 +++++++++++++++++-------
1 file changed, 46 insertions(+), 18 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/usb.c b/drivers/net/wireless/realtek/rtw89/usb.c
index 6cf89aee252e..eb9978a60d04 100644
--- a/drivers/net/wireless/realtek/rtw89/usb.c
+++ b/drivers/net/wireless/realtek/rtw89/usb.c
@@ -167,24 +167,52 @@ rtw89_usb_ops_check_and_reclaim_tx_resource(struct rtw89_dev *rtwdev,
return 42; /* TODO some kind of calculation? */
}
-static u8 rtw89_usb_get_bulkout_id(u8 ch_dma)
+static u8 rtw89_usb_get_bulkout_id(struct rtw89_dev *rtwdev, u8 ch_dma)
{
- switch (ch_dma) {
- case RTW89_DMA_ACH0:
- return 3;
- case RTW89_DMA_ACH1:
- return 4;
- case RTW89_DMA_ACH2:
- return 5;
- case RTW89_DMA_ACH3:
- return 6;
- default:
- case RTW89_DMA_B0MG:
- return 0;
- case RTW89_DMA_B0HI:
- return 1;
- case RTW89_DMA_H2C:
- return 2;
+ if (rtwdev->chip->chip_id == RTL8852C) {
+ switch (ch_dma) {
+ case RTW89_DMA_ACH0:
+ return 3;
+ case RTW89_DMA_ACH2:
+ return 5;
+ case RTW89_DMA_ACH4:
+ return 4;
+ case RTW89_DMA_ACH6:
+ return 6;
+ default:
+ rtw89_warn(rtwdev, "unexpected TX channel %d\n",
+ ch_dma);
+ fallthrough;
+ case RTW89_DMA_B0MG:
+ case RTW89_DMA_B0HI:
+ return 0;
+ case RTW89_DMA_B1MG:
+ case RTW89_DMA_B1HI:
+ return 1;
+ case RTW89_DMA_H2C:
+ return 2;
+ }
+ } else {
+ switch (ch_dma) {
+ case RTW89_DMA_ACH0:
+ return 3;
+ case RTW89_DMA_ACH1:
+ return 4;
+ case RTW89_DMA_ACH2:
+ return 5;
+ case RTW89_DMA_ACH3:
+ return 6;
+ default:
+ rtw89_warn(rtwdev, "unexpected TX channel %d\n",
+ ch_dma);
+ fallthrough;
+ case RTW89_DMA_B0MG:
+ return 0;
+ case RTW89_DMA_B0HI:
+ return 1;
+ case RTW89_DMA_H2C:
+ return 2;
+ }
}
}
@@ -251,7 +279,7 @@ static int rtw89_usb_write_port(struct rtw89_dev *rtwdev, u8 ch_dma,
struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
struct usb_device *usbd = rtwusb->udev;
struct urb *urb;
- u8 bulkout_id = rtw89_usb_get_bulkout_id(ch_dma);
+ u8 bulkout_id = rtw89_usb_get_bulkout_id(rtwdev, ch_dma);
unsigned int pipe;
int ret;
--
2.50.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 03/11] wifi: rtw89: usb: Fix rtw89_usb_ops_mac_pre_init() for RTL8852CU
2025-08-01 20:35 [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
2025-08-01 20:37 ` [PATCH rtw-next 01/11] wifi: rtw89: Fix rtw89_core_get_ch_dma() " Bitterblue Smith
2025-08-01 20:37 ` [PATCH rtw-next 02/11] wifi: rtw89: usb: Fix rtw89_usb_get_bulkout_id() " Bitterblue Smith
@ 2025-08-01 20:38 ` Bitterblue Smith
2025-08-01 20:38 ` [PATCH rtw-next 04/11] wifi: rtw89: usb: Fix rtw89_usb_ops_mac_post_init() " Bitterblue Smith
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Bitterblue Smith @ 2025-08-01 20:38 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
The registers used in this function are located at different offsets in
RTL8852CU compared to other chips. Use the right registers for each
chip.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
drivers/net/wireless/realtek/rtw89/usb.c | 29 ++++++++++++++++++++----
1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/usb.c b/drivers/net/wireless/realtek/rtw89/usb.c
index eb9978a60d04..e749a37ac1b5 100644
--- a/drivers/net/wireless/realtek/rtw89/usb.c
+++ b/drivers/net/wireless/realtek/rtw89/usb.c
@@ -726,20 +726,39 @@ static int rtw89_usb_ops_deinit(struct rtw89_dev *rtwdev)
static int rtw89_usb_ops_mac_pre_init(struct rtw89_dev *rtwdev)
{
+ u32 usb_host_request_2, usb_wlan0_1, hci_func_en;
u32 val32;
- rtw89_write32_set(rtwdev, R_AX_USB_HOST_REQUEST_2, B_AX_R_USBIO_MODE);
+ switch (rtwdev->chip->chip_id) {
+ case RTL8851B:
+ case RTL8852A:
+ case RTL8852B:
+ usb_host_request_2 = R_AX_USB_HOST_REQUEST_2;
+ usb_wlan0_1 = R_AX_USB_WLAN0_1;
+ hci_func_en = R_AX_HCI_FUNC_EN;
+ break;
+ case RTL8852C:
+ usb_host_request_2 = R_AX_USB_HOST_REQUEST_2_V1;
+ usb_wlan0_1 = R_AX_USB_WLAN0_1_V1;
+ hci_func_en = R_AX_HCI_FUNC_EN_V1;
+ break;
+ default:
+ rtw89_err(rtwdev, "%s: unknown chip\n", __func__);
+ return -EOPNOTSUPP;
+ }
+
+ rtw89_write32_set(rtwdev, usb_host_request_2, B_AX_R_USBIO_MODE);
/* fix USB IO hang suggest by chihhanli@realtek.com */
- rtw89_write32_clr(rtwdev, R_AX_USB_WLAN0_1,
+ rtw89_write32_clr(rtwdev, usb_wlan0_1,
B_AX_USBRX_RST | B_AX_USBTX_RST);
- val32 = rtw89_read32(rtwdev, R_AX_HCI_FUNC_EN);
+ val32 = rtw89_read32(rtwdev, hci_func_en);
val32 &= ~(B_AX_HCI_RXDMA_EN | B_AX_HCI_TXDMA_EN);
- rtw89_write32(rtwdev, R_AX_HCI_FUNC_EN, val32);
+ rtw89_write32(rtwdev, hci_func_en, val32);
val32 |= B_AX_HCI_RXDMA_EN | B_AX_HCI_TXDMA_EN;
- rtw89_write32(rtwdev, R_AX_HCI_FUNC_EN, val32);
+ rtw89_write32(rtwdev, hci_func_en, val32);
/* fix USB TRX hang suggest by chihhanli@realtek.com */
return 0;
--
2.50.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 04/11] wifi: rtw89: usb: Fix rtw89_usb_ops_mac_post_init() for RTL8852CU
2025-08-01 20:35 [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
` (2 preceding siblings ...)
2025-08-01 20:38 ` [PATCH rtw-next 03/11] wifi: rtw89: usb: Fix rtw89_usb_ops_mac_pre_init() " Bitterblue Smith
@ 2025-08-01 20:38 ` Bitterblue Smith
2025-08-01 20:38 ` [PATCH rtw-next 05/11] wifi: rtw89: Fix rtw89_mac_dmac_func_pre_en_ax() for USB/SDIO Bitterblue Smith
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Bitterblue Smith @ 2025-08-01 20:38 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
The registers used in this function are located at different offsets in
RTL8852CU compared to other chips. Use the right registers for each
chip.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
drivers/net/wireless/realtek/rtw89/usb.c | 25 +++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/usb.c b/drivers/net/wireless/realtek/rtw89/usb.c
index e749a37ac1b5..1c65fbdf7673 100644
--- a/drivers/net/wireless/realtek/rtw89/usb.c
+++ b/drivers/net/wireless/realtek/rtw89/usb.c
@@ -772,10 +772,29 @@ static int rtw89_usb_ops_mac_pre_deinit(struct rtw89_dev *rtwdev)
static int rtw89_usb_ops_mac_post_init(struct rtw89_dev *rtwdev)
{
struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
+ u32 usb3_mac_npi_config_intf_0, usb_endpoint_0, usb_endpoint_2;
enum usb_device_speed speed;
u32 ep;
- rtw89_write32_clr(rtwdev, R_AX_USB3_MAC_NPI_CONFIG_INTF_0,
+ switch (rtwdev->chip->chip_id) {
+ case RTL8851B:
+ case RTL8852A:
+ case RTL8852B:
+ usb3_mac_npi_config_intf_0 = R_AX_USB3_MAC_NPI_CONFIG_INTF_0;
+ usb_endpoint_0 = R_AX_USB_ENDPOINT_0;
+ usb_endpoint_2 = R_AX_USB_ENDPOINT_2;
+ break;
+ case RTL8852C:
+ usb3_mac_npi_config_intf_0 = R_AX_USB3_MAC_NPI_CONFIG_INTF_0_V1;
+ usb_endpoint_0 = R_AX_USB_ENDPOINT_0_V1;
+ usb_endpoint_2 = R_AX_USB_ENDPOINT_2_V1;
+ break;
+ default:
+ rtw89_err(rtwdev, "%s: unknown chip\n", __func__);
+ return -EOPNOTSUPP;
+ }
+
+ rtw89_write32_clr(rtwdev, usb3_mac_npi_config_intf_0,
B_AX_SSPHY_LFPS_FILTER);
speed = rtwusb->udev->speed;
@@ -791,9 +810,9 @@ static int rtw89_usb_ops_mac_post_init(struct rtw89_dev *rtwdev)
if (ep == 8)
continue;
- rtw89_write8_mask(rtwdev, R_AX_USB_ENDPOINT_0,
+ rtw89_write8_mask(rtwdev, usb_endpoint_0,
B_AX_EP_IDX, ep);
- rtw89_write8(rtwdev, R_AX_USB_ENDPOINT_2 + 1, NUMP);
+ rtw89_write8(rtwdev, usb_endpoint_2 + 1, NUMP);
}
return 0;
--
2.50.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 05/11] wifi: rtw89: Fix rtw89_mac_dmac_func_pre_en_ax() for USB/SDIO
2025-08-01 20:35 [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
` (3 preceding siblings ...)
2025-08-01 20:38 ` [PATCH rtw-next 04/11] wifi: rtw89: usb: Fix rtw89_usb_ops_mac_post_init() " Bitterblue Smith
@ 2025-08-01 20:38 ` Bitterblue Smith
2025-08-01 20:39 ` [PATCH rtw-next 06/11] wifi: rtw89: 8852c: Fix rtw8852c_pwr_{on,off}_func() for USB Bitterblue Smith
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Bitterblue Smith @ 2025-08-01 20:38 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
Set the DMA mode according to the interface type.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
drivers/net/wireless/realtek/rtw89/mac.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index fce48ac97a02..2d473f1bb66c 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -3979,8 +3979,15 @@ static void rtw89_mac_dmac_func_pre_en_ax(struct rtw89_dev *rtwdev)
val = rtw89_read32(rtwdev, R_AX_HAXI_INIT_CFG1);
val &= ~(B_AX_DMA_MODE_MASK | B_AX_STOP_AXI_MST);
- val |= FIELD_PREP(B_AX_DMA_MODE_MASK, DMA_MOD_PCIE_1B) |
- B_AX_TXHCI_EN_V1 | B_AX_RXHCI_EN_V1;
+ val |= B_AX_TXHCI_EN_V1 | B_AX_RXHCI_EN_V1;
+
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
+ val |= FIELD_PREP(B_AX_DMA_MODE_MASK, DMA_MOD_PCIE_1B);
+ else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB)
+ val |= FIELD_PREP(B_AX_DMA_MODE_MASK, DMA_MOD_USB);
+ else
+ val |= FIELD_PREP(B_AX_DMA_MODE_MASK, DMA_MOD_SDIO);
+
rtw89_write32(rtwdev, R_AX_HAXI_INIT_CFG1, val);
rtw89_write32_clr(rtwdev, R_AX_HAXI_DMA_STOP1,
--
2.50.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 06/11] wifi: rtw89: 8852c: Fix rtw8852c_pwr_{on,off}_func() for USB
2025-08-01 20:35 [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
` (4 preceding siblings ...)
2025-08-01 20:38 ` [PATCH rtw-next 05/11] wifi: rtw89: Fix rtw89_mac_dmac_func_pre_en_ax() for USB/SDIO Bitterblue Smith
@ 2025-08-01 20:39 ` Bitterblue Smith
2025-08-01 20:40 ` [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Bitterblue Smith @ 2025-08-01 20:39 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
There are a few differences in the power on/off functions between PCIE
and USB. The changes in the power off function in particular are needed
for the RTL8832CU to be able to power on again after it's powered off.
While the RTL8832CU appears to work without the changes in the power on
function, it's probably best to implement them, in case they are needed
in some situations.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 31 ++++++++++++++-----
1 file changed, 24 insertions(+), 7 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
index 88cf8ea13e7c..49fdcb9aebb5 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
@@ -214,7 +214,8 @@ static int rtw8852c_pwr_on_func(struct rtw89_dev *rtwdev)
int ret;
val32 = rtw89_read32_mask(rtwdev, R_AX_SYS_STATUS1, B_AX_PAD_HCI_SEL_V2_MASK);
- if (val32 == MAC_AX_HCI_SEL_PCIE_USB)
+ if (val32 == MAC_AX_HCI_SEL_PCIE_USB ||
+ rtwdev->hci.type == RTW89_HCI_TYPE_USB)
rtw89_write32_set(rtwdev, R_AX_LDO_AON_CTRL0, B_AX_PD_REGU_L);
rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_AFSM_WLSUS_EN |
@@ -246,7 +247,9 @@ static int rtw8852c_pwr_on_func(struct rtw89_dev *rtwdev)
rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
- rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
+
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
+ rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL_EXTEND, B_AX_CMAC1_FEN);
rtw89_write32_set(rtwdev, R_AX_SYS_ISO_CTRL_EXTEND, B_AX_R_SYM_ISO_CMAC12PP);
@@ -305,9 +308,11 @@ static int rtw8852c_pwr_on_func(struct rtw89_dev *rtwdev)
rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B14);
rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
- rtw89_write32_set(rtwdev, R_AX_GPIO0_15_EECS_EESK_LED1_PULL_LOW_EN,
- B_AX_EECS_PULL_LOW_EN | B_AX_EESK_PULL_LOW_EN |
- B_AX_LED1_PULL_LOW_EN);
+
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
+ rtw89_write32_set(rtwdev, R_AX_GPIO0_15_EECS_EESK_LED1_PULL_LOW_EN,
+ B_AX_EECS_PULL_LOW_EN | B_AX_EESK_PULL_LOW_EN |
+ B_AX_LED1_PULL_LOW_EN);
rtw89_write32_set(rtwdev, R_AX_DMAC_FUNC_EN,
B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN | B_AX_MPDU_PROC_EN |
@@ -385,12 +390,24 @@ static int rtw8852c_pwr_off_func(struct rtw89_dev *rtwdev)
if (ret)
return ret;
- rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
+ rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
+ else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB)
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
+
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_XTAL_OFF_A_DIE);
rtw89_write32_set(rtwdev, R_AX_SYS_SWR_CTRL1, B_AX_SYM_CTRL_SPS_PWMFREQ);
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0,
B_AX_REG_ZCDC_H_MASK, 0x3);
- rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
+
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) {
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
+ } else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB) {
+ val32 = rtw89_read32(rtwdev, R_AX_SYS_PW_CTRL);
+ val32 &= ~B_AX_AFSM_PCIE_SUS_EN;
+ val32 |= B_AX_AFSM_WLSUS_EN;
+ rtw89_write32(rtwdev, R_AX_SYS_PW_CTRL, val32);
+ }
return 0;
}
--
2.50.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU
2025-08-01 20:35 [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
` (5 preceding siblings ...)
2025-08-01 20:39 ` [PATCH rtw-next 06/11] wifi: rtw89: 8852c: Fix rtw8852c_pwr_{on,off}_func() for USB Bitterblue Smith
@ 2025-08-01 20:40 ` Bitterblue Smith
2025-08-01 20:41 ` [PATCH rtw-next 09/11] wifi: rtw89: 8852c: Accept USB devices and load their MAC address Bitterblue Smith
2025-08-01 20:44 ` [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
8 siblings, 0 replies; 10+ messages in thread
From: Bitterblue Smith @ 2025-08-01 20:40 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
"hfc" means "hci fc" which is "Host Control Interface Flow Control".
These are some parameters needed for RTL8852CU.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 46 ++++++++++++++++++-
1 file changed, 45 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
index 5e58bab5d39f..4a1405ba3567 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
@@ -51,6 +51,48 @@ static const struct rtw89_hfc_param_ini rtw8852c_hfc_param_ini_pcie[] = {
[RTW89_QTA_INVALID] = {NULL},
};
+static const struct rtw89_hfc_ch_cfg rtw8852c_hfc_chcfg_usb[] = {
+ {18, 344, grp_0}, /* ACH 0 */
+ {0, 0, grp_0}, /* ACH 1 */
+ {18, 344, grp_0}, /* ACH 2 */
+ {0, 0, grp_0}, /* ACH 3 */
+ {18, 344, grp_0}, /* ACH 4 */
+ {0, 0, grp_0}, /* ACH 5 */
+ {18, 344, grp_0}, /* ACH 6 */
+ {0, 0, grp_0}, /* ACH 7 */
+ {18, 344, grp_0}, /* B0MGQ */
+ {0, 0, grp_0}, /* B0HIQ */
+ {18, 344, grp_0}, /* B1MGQ */
+ {0, 0, grp_0}, /* B1HIQ */
+ {0, 0, 0} /* FWCMDQ */
+};
+
+static const struct rtw89_hfc_pub_cfg rtw8852c_hfc_pubcfg_usb = {
+ 344, /* Group 0 */
+ 0, /* Group 1 */
+ 344, /* Public Max */
+ 0 /* WP threshold */
+};
+
+static const struct rtw89_hfc_prec_cfg rtw8852c_hfc_preccfg_usb = {
+ 9, /* CH 0-11 pre-cost */
+ 32, /* H2C pre-cost */
+ 48, /* WP CH 0-7 pre-cost */
+ 48, /* WP CH 8-11 pre-cost */
+ 1, /* CH 0-11 full condition */
+ 1, /* H2C full condition */
+ 1, /* WP CH 0-7 full condition */
+ 1, /* WP CH 8-11 full condition */
+};
+
+static const struct rtw89_hfc_param_ini rtw8852c_hfc_param_ini_usb[] = {
+ [RTW89_QTA_SCC] = {rtw8852c_hfc_chcfg_usb, &rtw8852c_hfc_pubcfg_usb,
+ &rtw8852c_hfc_preccfg_usb, RTW89_HCIFC_STF},
+ [RTW89_QTA_DLFW] = {NULL, NULL,
+ &rtw8852c_hfc_preccfg_usb, RTW89_HCIFC_STF},
+ [RTW89_QTA_INVALID] = {NULL},
+};
+
static const struct rtw89_dle_mem rtw8852c_dle_mem_pcie[] = {
[RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size19,
&rtw89_mac_size.ple_size19, &rtw89_mac_size.wde_qt18,
@@ -3048,7 +3090,9 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
.max_amsdu_limit = 8000,
.dis_2g_40m_ul_ofdma = false,
.rsvd_ple_ofst = 0x6f800,
- .hfc_param_ini = {rtw8852c_hfc_param_ini_pcie, NULL, NULL},
+ .hfc_param_ini = {rtw8852c_hfc_param_ini_pcie,
+ rtw8852c_hfc_param_ini_usb,
+ NULL},
.dle_mem = {rtw8852c_dle_mem_pcie,
rtw8852c_dle_mem_usb2,
rtw8852c_dle_mem_usb3,
--
2.50.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 09/11] wifi: rtw89: 8852c: Accept USB devices and load their MAC address
2025-08-01 20:35 [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
` (6 preceding siblings ...)
2025-08-01 20:40 ` [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
@ 2025-08-01 20:41 ` Bitterblue Smith
2025-08-01 20:44 ` [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
8 siblings, 0 replies; 10+ messages in thread
From: Bitterblue Smith @ 2025-08-01 20:41 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
Make rtw8852c_read_efuse() accept USB devices and load the MAC
address from the correct offset.
Also fix the offset of the MAC address because it was wrong.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 16 +++++++---------
drivers/net/wireless/realtek/rtw89/rtw8852c.h | 2 +-
2 files changed, 8 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
index 4a1405ba3567..2e5fa87ba9a1 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
@@ -480,14 +480,6 @@ static int rtw8852c_pwr_off_func(struct rtw89_dev *rtwdev)
return 0;
}
-static void rtw8852c_e_efuse_parsing(struct rtw89_efuse *efuse,
- struct rtw8852c_efuse *map)
-{
- ether_addr_copy(efuse->addr, map->e.mac_addr);
- efuse->rfe_type = map->rfe_type;
- efuse->xtal_cap = map->xtal_k;
-}
-
static void rtw8852c_efuse_parsing_tssi(struct rtw89_dev *rtwdev,
struct rtw8852c_efuse *map)
{
@@ -596,12 +588,18 @@ static int rtw8852c_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map,
switch (rtwdev->hci.type) {
case RTW89_HCI_TYPE_PCIE:
- rtw8852c_e_efuse_parsing(efuse, map);
+ ether_addr_copy(efuse->addr, map->e.mac_addr);
+ break;
+ case RTW89_HCI_TYPE_USB:
+ ether_addr_copy(efuse->addr, map->u.mac_addr);
break;
default:
return -ENOTSUPP;
}
+ efuse->rfe_type = map->rfe_type;
+ efuse->xtal_cap = map->xtal_k;
+
rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type);
return 0;
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.h b/drivers/net/wireless/realtek/rtw89/rtw8852c.h
index 77b05daedd10..8585921ac6c4 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.h
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.h
@@ -11,7 +11,7 @@
#define BB_PATH_NUM_8852C 2
struct rtw8852c_u_efuse {
- u8 rsvd[0x38];
+ u8 rsvd[0x88];
u8 mac_addr[ETH_ALEN];
};
--
2.50.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU
2025-08-01 20:35 [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
` (7 preceding siblings ...)
2025-08-01 20:41 ` [PATCH rtw-next 09/11] wifi: rtw89: 8852c: Accept USB devices and load their MAC address Bitterblue Smith
@ 2025-08-01 20:44 ` Bitterblue Smith
8 siblings, 0 replies; 10+ messages in thread
From: Bitterblue Smith @ 2025-08-01 20:44 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
On 01/08/2025 23:35, Bitterblue Smith wrote:
> Add support for RTL8852CU. It works well but sometimes it loses the
> connection:
>
> Jul 04 16:05:56 ideapad2 kernel: wlp3s0f3u4: Connection to AP ... lost
> Jul 14 13:45:26 ideapad2 kernel: wlp3s0f3u4: Connection to AP ... lost
> Jul 15 17:51:28 ideapad2 kernel: wlp3s0f3u4: Connection to AP ... lost
> Jul 18 14:43:30 ideapad2 kernel: wlp3s0f3u4: Connection to AP ... lost
> Jul 24 14:58:07 ideapad2 kernel: wlp3s0f3u4: Connection to AP ... lost
>
> When that happens it reconnects immediately.
>
> Bitterblue Smith (11):
> wifi: rtw89: Fix rtw89_core_get_ch_dma() for RTL8852CU
> wifi: rtw89: usb: Fix rtw89_usb_get_bulkout_id() for RTL8852CU
> wifi: rtw89: usb: Fix rtw89_usb_ops_mac_pre_init() for RTL8852CU
> wifi: rtw89: usb: Fix rtw89_usb_ops_mac_post_init() for RTL8852CU
> wifi: rtw89: Fix rtw89_mac_dmac_func_pre_en_ax() for USB/SDIO
> wifi: rtw89: 8852c: Fix rtw8852c_pwr_{on,off}_func() for USB
> wifi: rtw89: Add rtw8852c_dle_mem_usb{2,3}
> wifi: rtw89: Add rtw8852c_hfc_param_ini_usb
> wifi: rtw89: 8852c: Accept USB devices and load their MAC address
> wifi: rtw89: Add rtw8852cu.c
> wifi: rtw89: Enable the new rtw89_8852cu module.
>
> drivers/net/wireless/realtek/rtw89/Kconfig | 11 ++
> drivers/net/wireless/realtek/rtw89/Makefile | 3 +
> drivers/net/wireless/realtek/rtw89/mac.c | 31 ++++-
> drivers/net/wireless/realtek/rtw89/mac.h | 10 ++
> drivers/net/wireless/realtek/rtw89/rtw8852c.c | 124 +++++++++++++++---
> drivers/net/wireless/realtek/rtw89/rtw8852c.h | 2 +-
> .../net/wireless/realtek/rtw89/rtw8852cu.c | 45 +++++++
> drivers/net/wireless/realtek/rtw89/txrx.h | 19 +++
> drivers/net/wireless/realtek/rtw89/usb.c | 118 +++++++++++++----
> 9 files changed, 316 insertions(+), 47 deletions(-)
> create mode 100644 drivers/net/wireless/realtek/rtw89/rtw8852cu.c
>
Please disregard this version. I messed up sending the emails. I will
send v2.
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2025-08-01 20:45 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-01 20:35 [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
2025-08-01 20:37 ` [PATCH rtw-next 01/11] wifi: rtw89: Fix rtw89_core_get_ch_dma() " Bitterblue Smith
2025-08-01 20:37 ` [PATCH rtw-next 02/11] wifi: rtw89: usb: Fix rtw89_usb_get_bulkout_id() " Bitterblue Smith
2025-08-01 20:38 ` [PATCH rtw-next 03/11] wifi: rtw89: usb: Fix rtw89_usb_ops_mac_pre_init() " Bitterblue Smith
2025-08-01 20:38 ` [PATCH rtw-next 04/11] wifi: rtw89: usb: Fix rtw89_usb_ops_mac_post_init() " Bitterblue Smith
2025-08-01 20:38 ` [PATCH rtw-next 05/11] wifi: rtw89: Fix rtw89_mac_dmac_func_pre_en_ax() for USB/SDIO Bitterblue Smith
2025-08-01 20:39 ` [PATCH rtw-next 06/11] wifi: rtw89: 8852c: Fix rtw8852c_pwr_{on,off}_func() for USB Bitterblue Smith
2025-08-01 20:40 ` [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
2025-08-01 20:41 ` [PATCH rtw-next 09/11] wifi: rtw89: 8852c: Accept USB devices and load their MAC address Bitterblue Smith
2025-08-01 20:44 ` [PATCH rtw-next 00/11] wifi: rtw89: Add support for RTL8852CU Bitterblue Smith
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox