2024-02-27 12:25:17

by Bitterblue Smith

[permalink] [raw]
Subject: [PATCH 2/4] wifi: rtw88: 8821cu: Fix connection failure

Clear bit 8 of REG_SYS_STATUS1 after MAC power on.

Without this, some RTL8821CU and RTL8811CU cannot connect to any
network:

Feb 19 13:33:11 ideapad2 kernel: wlp3s0f3u2: send auth to
90:55:de:__:__:__ (try 1/3)
Feb 19 13:33:13 ideapad2 kernel: wlp3s0f3u2: send auth to
90:55:de:__:__:__ (try 2/3)
Feb 19 13:33:14 ideapad2 kernel: wlp3s0f3u2: send auth to
90:55:de:__:__:__ (try 3/3)
Feb 19 13:33:15 ideapad2 kernel: wlp3s0f3u2: authentication with
90:55:de:__:__:__ timed out

The RTL8822CU and RTL8822BU out-of-tree drivers do this as well, so do
it for all three types of chips.

Tested with RTL8811CU (Tenda U9 V2.0).

Signed-off-by: Bitterblue Smith <[email protected]>
---
drivers/net/wireless/realtek/rtw88/mac.c | 8 ++++++++
1 file changed, 8 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
index 298663b03580..a3b2c57c5503 100644
--- a/drivers/net/wireless/realtek/rtw88/mac.c
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
@@ -309,6 +309,14 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)
pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq;
ret = rtw_pwr_seq_parser(rtwdev, pwr_seq);

+ if (pwr_seq == chip->pwr_on_seq &&
+ rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) {
+ if (chip->id == RTW_CHIP_TYPE_8822C ||
+ chip->id == RTW_CHIP_TYPE_8822B ||
+ chip->id == RTW_CHIP_TYPE_8821C)
+ rtw_write8_clr(rtwdev, REG_SYS_STATUS1 + 1, BIT(0));
+ }
+
if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO)
rtw_write32(rtwdev, REG_SDIO_HIMR, imr);

--
2.43.2


2024-02-29 03:42:46

by Ping-Ke Shih

[permalink] [raw]
Subject: RE: [PATCH 2/4] wifi: rtw88: 8821cu: Fix connection failure



> -----Original Message-----
> From: Bitterblue Smith <[email protected]>
> Sent: Tuesday, February 27, 2024 8:19 PM
> To: [email protected]
> Cc: Ping-Ke Shih <[email protected]>; Sascha Hauer <[email protected]>
> Subject: [PATCH 2/4] wifi: rtw88: 8821cu: Fix connection failure
>
> Clear bit 8 of REG_SYS_STATUS1 after MAC power on.
>
> Without this, some RTL8821CU and RTL8811CU cannot connect to any
> network:
>
> Feb 19 13:33:11 ideapad2 kernel: wlp3s0f3u2: send auth to
> 90:55:de:__:__:__ (try 1/3)
> Feb 19 13:33:13 ideapad2 kernel: wlp3s0f3u2: send auth to
> 90:55:de:__:__:__ (try 2/3)
> Feb 19 13:33:14 ideapad2 kernel: wlp3s0f3u2: send auth to
> 90:55:de:__:__:__ (try 3/3)
> Feb 19 13:33:15 ideapad2 kernel: wlp3s0f3u2: authentication with
> 90:55:de:__:__:__ timed out
>
> The RTL8822CU and RTL8822BU out-of-tree drivers do this as well, so do
> it for all three types of chips.
>
> Tested with RTL8811CU (Tenda U9 V2.0).
>
> Signed-off-by: Bitterblue Smith <[email protected]>
> ---
> drivers/net/wireless/realtek/rtw88/mac.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
> index 298663b03580..a3b2c57c5503 100644
> --- a/drivers/net/wireless/realtek/rtw88/mac.c
> +++ b/drivers/net/wireless/realtek/rtw88/mac.c
> @@ -309,6 +309,14 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)
> pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq;
> ret = rtw_pwr_seq_parser(rtwdev, pwr_seq);
>
> + if (pwr_seq == chip->pwr_on_seq &&

we can just check this by 'pwr_on'.

> + rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) {
> + if (chip->id == RTW_CHIP_TYPE_8822C ||
> + chip->id == RTW_CHIP_TYPE_8822B ||
> + chip->id == RTW_CHIP_TYPE_8821C)
> + rtw_write8_clr(rtwdev, REG_SYS_STATUS1 + 1, BIT(0));
> + }
> +
> if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO)
> rtw_write32(rtwdev, REG_SDIO_HIMR, imr);
>
> --
> 2.43.2