]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 31 Dec 2019 15:35:22 +0000 (16:35 +0100)
[ Upstream commit 0eeb91ade90ce06d2fa1e2fcb55e3316b64c203c ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.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 8828baf26e7b88f0e367788a00e99345921cc84d..47c2bfe06d030bc2c5225c61e8c021d91427220f 100644 (file)
@@ -1349,6 +1349,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 26b674aca1258bedcb8cec90b943d46cac664aea..14e207f2466caba92967186481dc417dabbf8be7 100644 (file)
@@ -1673,6 +1673,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 2b4fcdf4ec5bb96f1efaaf6b1ef0e12ae3d8e9b7..66c6ee70f00aa0c5ba261252258d6d8f039e9b53 100644 (file)
@@ -3905,6 +3905,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__);