wifi: rtw89: fw: propagate an argument include_bb for BB MCU firmware
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 1 Sep 2023 07:39:53 +0000 (15:39 +0800)
committerKalle Valo <kvalo@kernel.org>
Thu, 7 Sep 2023 05:57:16 +0000 (08:57 +0300)
Though WiFi 7 chips need BB MCU firmware, we don't download it in probe
stage. Instead, only bring interface up under normal operation or WoWLAN
mode. So, add an argument to assist download flow to setup download
settings properly.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230901073956.54203-6-pkshih@realtek.com
12 files changed:
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/mac_be.c
drivers/net/wireless/realtek/rtw89/rtw8851b.c
drivers/net/wireless/realtek/rtw89/rtw8852a.c
drivers/net/wireless/realtek/rtw89/rtw8852b.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c
drivers/net/wireless/realtek/rtw89/wow.c

index 183e1f34fcceb955ef8f850b2e5a44268a78664a..856f3543eff2ab3983961fc4dbbf9264adf6cc28 100644 (file)
@@ -3788,7 +3788,7 @@ static int rtw89_chip_efuse_info_setup(struct rtw89_dev *rtwdev)
 {
        int ret;
 
-       ret = rtw89_mac_partial_init(rtwdev);
+       ret = rtw89_mac_partial_init(rtwdev, false);
        if (ret)
                return ret;
 
index 62778d056653924dcb84756c8b8adce06e81f3ec..b232bb3a3cf8a1f5f50ca61daeb4d7d4aedc36b0 100644 (file)
@@ -3446,6 +3446,7 @@ struct rtw89_chip_info {
        const char *fw_basename;
        u8 fw_format_max;
        bool try_ce_fw;
+       u8 bbmcu_nr;
        u32 needed_fw_elms;
        u32 fifo_size;
        bool small_fifo_size;
index 68a9d81164cc4dce4d05b80515204b35025cd06d..40f398fe0d537d7ca085ea754ebdc4fef472ccb5 100644 (file)
@@ -872,7 +872,8 @@ static void rtw89_fw_dl_fail_dump(struct rtw89_dev *rtwdev)
        rtw89_fw_prog_cnt_dump(rtwdev);
 }
 
-int rtw89_fw_download(struct rtw89_dev *rtwdev, enum rtw89_fw_type type)
+int rtw89_fw_download(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
+                     bool include_bb)
 {
        const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
        struct rtw89_fw_info *fw_info = &rtwdev->fw;
@@ -881,7 +882,7 @@ int rtw89_fw_download(struct rtw89_dev *rtwdev, enum rtw89_fw_type type)
        int ret;
 
        mac->disable_cpu(rtwdev);
-       ret = mac->fwdl_enable_wcpu(rtwdev, 0, true);
+       ret = mac->fwdl_enable_wcpu(rtwdev, 0, true, include_bb);
        if (ret)
                return ret;
 
index cba37315e3f92ec9c6d87ec4e4ea3d158c0ccfcb..b034e4caed915d6d762d141538f841dad835b6e0 100644 (file)
@@ -3628,7 +3628,8 @@ rtw89_early_fw_feature_recognize(struct device *device,
                                 const struct rtw89_chip_info *chip,
                                 struct rtw89_fw_info *early_fw,
                                 int *used_fw_format);
-int rtw89_fw_download(struct rtw89_dev *rtwdev, enum rtw89_fw_type type);
+int rtw89_fw_download(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
+                     bool include_bb);
 void rtw89_load_firmware_work(struct work_struct *work);
 void rtw89_unload_firmware(struct rtw89_dev *rtwdev);
 int rtw89_wait_firmware_completion(struct rtw89_dev *rtwdev);
index f02828f295ced632b4d7840182f0097d0a95514f..9a03f7fa9188338a5f49f9f7061d9126d615da21 100644 (file)
@@ -3467,7 +3467,8 @@ static void rtw89_mac_disable_cpu_ax(struct rtw89_dev *rtwdev)
        rtw89_write32_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
 }
 
-static int rtw89_mac_enable_cpu_ax(struct rtw89_dev *rtwdev, u8 boot_reason, bool dlfw)
+static int rtw89_mac_enable_cpu_ax(struct rtw89_dev *rtwdev, u8 boot_reason,
+                                  bool dlfw, bool include_bb)
 {
        u32 val;
        int ret;
@@ -3592,7 +3593,7 @@ int rtw89_mac_disable_bb_rf(struct rtw89_dev *rtwdev)
 }
 EXPORT_SYMBOL(rtw89_mac_disable_bb_rf);
 
-int rtw89_mac_partial_init(struct rtw89_dev *rtwdev)
+int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb)
 {
        int ret;
 
@@ -3616,7 +3617,7 @@ int rtw89_mac_partial_init(struct rtw89_dev *rtwdev)
                        return ret;
        }
 
-       ret = rtw89_fw_download(rtwdev, RTW89_FW_NORMAL);
+       ret = rtw89_fw_download(rtwdev, RTW89_FW_NORMAL, include_bb);
        if (ret)
                return ret;
 
@@ -3625,9 +3626,11 @@ int rtw89_mac_partial_init(struct rtw89_dev *rtwdev)
 
 int rtw89_mac_init(struct rtw89_dev *rtwdev)
 {
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+       bool include_bb = !!chip->bbmcu_nr;
        int ret;
 
-       ret = rtw89_mac_partial_init(rtwdev);
+       ret = rtw89_mac_partial_init(rtwdev, include_bb);
        if (ret)
                goto fail;
 
index 0b772c37d56698e5f7b56530aa4390f01de4b55e..03d3956f77eb31ca8fc946b288e9b8cd4d042870 100644 (file)
@@ -860,7 +860,8 @@ struct rtw89_mac_gen_def {
        u32 rx_fltr;
 
        void (*disable_cpu)(struct rtw89_dev *rtwdev);
-       int (*fwdl_enable_wcpu)(struct rtw89_dev *rtwdev, u8 boot_reason, bool dlfw);
+       int (*fwdl_enable_wcpu)(struct rtw89_dev *rtwdev, u8 boot_reason,
+                               bool dlfw, bool include_bb);
        u8 (*fwdl_get_status)(struct rtw89_dev *rtwdev, enum rtw89_fwdl_check_type type);
        int (*fwdl_check_path_ready)(struct rtw89_dev *rtwdev, bool h2c_or_fwdl);
 };
@@ -962,7 +963,7 @@ rtw89_write32_port_set(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
 }
 
 void rtw89_mac_pwr_off(struct rtw89_dev *rtwdev);
-int rtw89_mac_partial_init(struct rtw89_dev *rtwdev);
+int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb);
 int rtw89_mac_init(struct rtw89_dev *rtwdev);
 int rtw89_mac_check_mac_en(struct rtw89_dev *rtwdev, u8 band,
                           enum rtw89_mac_hwmod_sel sel);
index 2a80d8bb4758af6bbb3b41b924b76f6b669c3004..8cdc594e5703b8c9e3895260b84342d10ea23ab7 100644 (file)
@@ -51,10 +51,13 @@ static void rtw89_mac_disable_cpu_be(struct rtw89_dev *rtwdev)
        rtw89_write32(rtwdev, R_BE_UDM2, 0);
 }
 
-static void set_cpu_en(struct rtw89_dev *rtwdev)
+static void set_cpu_en(struct rtw89_dev *rtwdev, bool include_bb)
 {
        u32 set = B_BE_WLANCPU_FWDL_EN;
 
+       if (include_bb)
+               set |= B_BE_BBMCU0_FWDL_EN;
+
        rtw89_write32_set(rtwdev, R_BE_WCPU_FW_CTRL, set);
 }
 
@@ -109,9 +112,10 @@ static int wcpu_on(struct rtw89_dev *rtwdev, u8 boot_reason, bool dlfw)
 }
 
 static int rtw89_mac_fwdl_enable_wcpu_be(struct rtw89_dev *rtwdev,
-                                        u8 boot_reason, bool dlfw)
+                                        u8 boot_reason, bool dlfw,
+                                        bool include_bb)
 {
-       set_cpu_en(rtwdev);
+       set_cpu_en(rtwdev, include_bb);
 
        return wcpu_on(rtwdev, boot_reason, dlfw);
 }
index 103893f28b5177c5a2f1927be9260ee902ca071f..401c2b68dd5fb0c0c446caa3b394e9e3e0199992 100644 (file)
@@ -2345,6 +2345,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
        .fw_basename            = RTW8851B_FW_BASENAME,
        .fw_format_max          = RTW8851B_FW_FORMAT_MAX,
        .try_ce_fw              = true,
+       .bbmcu_nr               = 0,
        .needed_fw_elms         = 0,
        .fifo_size              = 196608,
        .small_fifo_size        = true,
index d068eae6a2f084968a211041b98e288114a10e96..7810f72e8457d06d81f437c8a4b4ff4dfe2585e4 100644 (file)
@@ -2081,6 +2081,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
        .fw_basename            = RTW8852A_FW_BASENAME,
        .fw_format_max          = RTW8852A_FW_FORMAT_MAX,
        .try_ce_fw              = false,
+       .bbmcu_nr               = 0,
        .needed_fw_elms         = 0,
        .fifo_size              = 458752,
        .small_fifo_size        = false,
index 0063301952b35bc1b13bd0a857edb7c350e8900f..38a00c26e2ad66431fef2ec658cce80841c51b3b 100644 (file)
@@ -2514,6 +2514,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
        .fw_basename            = RTW8852B_FW_BASENAME,
        .fw_format_max          = RTW8852B_FW_FORMAT_MAX,
        .try_ce_fw              = true,
+       .bbmcu_nr               = 0,
        .needed_fw_elms         = 0,
        .fifo_size              = 196608,
        .small_fifo_size        = true,
index 00f1236e21931e223ea60f4bd06e3abd970b529e..297ce4fe6d21793c5bfdc022dba37464ff47f21b 100644 (file)
@@ -2816,6 +2816,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
        .fw_basename            = RTW8852C_FW_BASENAME,
        .fw_format_max          = RTW8852C_FW_FORMAT_MAX,
        .try_ce_fw              = false,
+       .bbmcu_nr               = 0,
        .needed_fw_elms         = 0,
        .fifo_size              = 458752,
        .small_fifo_size        = false,
index aa9efca0402539e0069b0862418725a5b33ac9db..660bf2ece9277cb50c29cc7784a70c538ebff1d4 100644 (file)
@@ -488,6 +488,8 @@ static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow)
        struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
        struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
        struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+       bool include_bb = !!chip->bbmcu_nr;
        struct ieee80211_sta *wow_sta;
        struct rtw89_sta *rtwsta = NULL;
        bool is_conn = true;
@@ -501,7 +503,7 @@ static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow)
        else
                is_conn = false;
 
-       ret = rtw89_fw_download(rtwdev, fw_type);
+       ret = rtw89_fw_download(rtwdev, fw_type, include_bb);
        if (ret) {
                rtw89_warn(rtwdev, "download fw failed\n");
                return ret;