rtl8xxxu: fix RTL8723BU connection failure issue after warm reboot
authorChris Chiu <chiu@endlessm.com>
Wed, 16 Oct 2019 01:54:08 +0000 (09:54 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 22 Oct 2019 08:26:13 +0000 (11:26 +0300)
The RTL8723BU has problems connecting to AP after each warm reboot.
Sometimes it returns no scan result, and in most cases, it fails
the authentication for unknown reason. However, it works totally
fine after cold reboot.

Compare the value of register SYS_CR and SYS_CLK_MAC_CLK_ENABLE
for cold reboot and warm reboot, the registers imply that the MAC
is already powered and thus some procedures are skipped during
driver initialization. Double checked the vendor driver, it reads
the SYS_CR and SYS_CLK_MAC_CLK_ENABLE also but doesn't skip any
during initialization based on them. This commit only tells the
RTL8723BU to do full initialization without checking MAC status.

Signed-off-by: Chris Chiu <chiu@endlessm.com>
Signed-off-by: Jes Sorensen <Jes.Sorensen@gmail.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c

index 22e95b11bfbbb68ccaa99f67b7f1136d7ed7f7ab..6598c8d786ea2d46514a96eec34ec2df772fb2a6 100644 (file)
@@ -1425,6 +1425,7 @@ struct rtl8xxxu_fileops {
        u8 has_s0s1:1;
        u8 has_tx_report:1;
        u8 gen2_thermal_meter:1;
+       u8 needs_full_init:1;
        u32 adda_1t_init;
        u32 adda_1t_path_on;
        u32 adda_2t_path_on_a;
index d15dde388435b6385b035587ad924b18761709d6..a71e1816e632229f8c22cde48b2eeb41b6b3f834 100644 (file)
@@ -1668,6 +1668,7 @@ struct rtl8xxxu_fileops rtl8723bu_fops = {
        .has_s0s1 = 1,
        .has_tx_report = 1,
        .gen2_thermal_meter = 1,
+       .needs_full_init = 1,
        .adda_1t_init = 0x01c00014,
        .adda_1t_path_on = 0x01c00014,
        .adda_2t_path_on_a = 0x01c00014,
index 1e3b71626f1b07d01b594cfc6dfaae56497c1ac1..f982f91b8bb6dd597645fc36b39b1561c269bd47 100644 (file)
@@ -3900,6 +3900,9 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
        else
                macpower = true;
 
+       if (fops->needs_full_init)
+               macpower = false;
+
        ret = fops->power_on(priv);
        if (ret < 0) {
                dev_warn(dev, "%s: Failed power on\n", __func__);