]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: call power_on ahead before selecting firmware
authorPing-Ke Shih <pkshih@realtek.com>
Mon, 3 Feb 2025 07:29:08 +0000 (15:29 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 10 Feb 2025 02:56:11 +0000 (10:56 +0800)
Driver selects firmware by hardware version, which normally can be read
from registers before selecting firmware. However, certain chips such as
RTL8851B, it needs to read hardware version from efuse while doing
power_on, but do power_on after selecting firmware in current flow.

To resolve this flow problem, move power_on out from
rtw89_mac_partial_init(), and call rtw89_mac_pwr_on() separately at
proper places to have expected flow.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250203072911.47313-2-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h

index da41a417dd7d3425d02e993333faaef9745ae753..ad28f11f2d2418e519a7fab79b8bac0e08b32c63 100644 (file)
@@ -5040,8 +5040,6 @@ static int rtw89_chip_efuse_info_setup(struct rtw89_dev *rtwdev)
 
        rtw89_hci_mac_pre_deinit(rtwdev);
 
-       rtw89_mac_pwr_off(rtwdev);
-
        return 0;
 }
 
@@ -5122,36 +5120,45 @@ int rtw89_chip_info_setup(struct rtw89_dev *rtwdev)
 
        rtw89_read_chip_ver(rtwdev);
 
+       ret = rtw89_mac_pwr_on(rtwdev);
+       if (ret) {
+               rtw89_err(rtwdev, "failed to power on\n");
+               return ret;
+       }
+
        ret = rtw89_wait_firmware_completion(rtwdev);
        if (ret) {
                rtw89_err(rtwdev, "failed to wait firmware completion\n");
-               return ret;
+               goto out;
        }
 
        ret = rtw89_fw_recognize(rtwdev);
        if (ret) {
                rtw89_err(rtwdev, "failed to recognize firmware\n");
-               return ret;
+               goto out;
        }
 
        ret = rtw89_chip_efuse_info_setup(rtwdev);
        if (ret)
-               return ret;
+               goto out;
 
        ret = rtw89_fw_recognize_elements(rtwdev);
        if (ret) {
                rtw89_err(rtwdev, "failed to recognize firmware elements\n");
-               return ret;
+               goto out;
        }
 
        ret = rtw89_chip_board_info_setup(rtwdev);
        if (ret)
-               return ret;
+               goto out;
 
        rtw89_core_setup_rfe_parms(rtwdev);
        rtwdev->ps_mode = rtw89_update_ps_mode(rtwdev);
 
-       return 0;
+out:
+       rtw89_mac_pwr_off(rtwdev);
+
+       return ret;
 }
 EXPORT_SYMBOL(rtw89_chip_info_setup);
 
index f698807790ffc34b0bce655208e4f39bcae2ec2c..3f38f8ed68760ae19e2dec18a5eb0c525ccb6b9e 100644 (file)
@@ -1495,6 +1495,21 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
 #undef PWR_ACT
 }
 
+int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev)
+{
+       int ret;
+
+       ret = rtw89_mac_power_switch(rtwdev, true);
+       if (ret) {
+               rtw89_mac_power_switch(rtwdev, false);
+               ret = rtw89_mac_power_switch(rtwdev, true);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
 void rtw89_mac_pwr_off(struct rtw89_dev *rtwdev)
 {
        rtw89_mac_power_switch(rtwdev, false);
@@ -3996,14 +4011,6 @@ int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb)
 {
        int ret;
 
-       ret = rtw89_mac_power_switch(rtwdev, true);
-       if (ret) {
-               rtw89_mac_power_switch(rtwdev, false);
-               ret = rtw89_mac_power_switch(rtwdev, true);
-               if (ret)
-                       return ret;
-       }
-
        rtw89_mac_ctrl_hci_dma_trx(rtwdev, true);
 
        if (include_bb) {
@@ -4036,6 +4043,10 @@ int rtw89_mac_init(struct rtw89_dev *rtwdev)
        bool include_bb = !!chip->bbmcu_nr;
        int ret;
 
+       ret = rtw89_mac_pwr_on(rtwdev);
+       if (ret)
+               return ret;
+
        ret = rtw89_mac_partial_init(rtwdev, include_bb);
        if (ret)
                goto fail;
@@ -4067,7 +4078,7 @@ int rtw89_mac_init(struct rtw89_dev *rtwdev)
 
        return ret;
 fail:
-       rtw89_mac_power_switch(rtwdev, false);
+       rtw89_mac_pwr_off(rtwdev);
 
        return ret;
 }
index 8edea96d037f64b62bba527d88160d2f1747e92c..6389f54264e5a063c73b04539037ec11015155b2 100644 (file)
@@ -1145,6 +1145,7 @@ rtw89_write32_port_set(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_l
        rtw89_write32_set(rtwdev, reg, bit);
 }
 
+int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev);
 void rtw89_mac_pwr_off(struct rtw89_dev *rtwdev);
 int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb);
 int rtw89_mac_init(struct rtw89_dev *rtwdev);