Commit bd003fb3 authored by Max Chou's avatar Max Chou Committed by Luiz Augusto von Dentz

Bluetooth: btrtl: Load FW v2 otherwise FW v1 for RTL8852C

In this commit, prefer to load FW v2 if available. Fallback to FW v1
otherwise. This behavior is only for RTL8852C.

Fixes: 9a24ce5e ("Bluetooth: btrtl: Firmware format v2 support")
Cc: stable@vger.kernel.org
Suggested-by: default avatarJuerg Haefliger <juerg.haefliger@canonical.com>
Tested-by: default avatarHilda Wu <hildawu@realtek.com>
Signed-off-by: default avatarMax Chou <max.chou@realtek.com>
Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
parent 3cd43dd1
...@@ -104,7 +104,7 @@ static const struct id_table ic_id_table[] = { ...@@ -104,7 +104,7 @@ static const struct id_table ic_id_table[] = {
{ IC_INFO(RTL_ROM_LMP_8723A, 0xb, 0x6, HCI_USB), { IC_INFO(RTL_ROM_LMP_8723A, 0xb, 0x6, HCI_USB),
.config_needed = false, .config_needed = false,
.has_rom_version = false, .has_rom_version = false,
.fw_name = "rtl_bt/rtl8723a_fw.bin", .fw_name = "rtl_bt/rtl8723a_fw",
.cfg_name = NULL, .cfg_name = NULL,
.hw_info = "rtl8723au" }, .hw_info = "rtl8723au" },
...@@ -112,7 +112,7 @@ static const struct id_table ic_id_table[] = { ...@@ -112,7 +112,7 @@ static const struct id_table ic_id_table[] = {
{ IC_INFO(RTL_ROM_LMP_8723B, 0xb, 0x6, HCI_UART), { IC_INFO(RTL_ROM_LMP_8723B, 0xb, 0x6, HCI_UART),
.config_needed = true, .config_needed = true,
.has_rom_version = true, .has_rom_version = true,
.fw_name = "rtl_bt/rtl8723bs_fw.bin", .fw_name = "rtl_bt/rtl8723bs_fw",
.cfg_name = "rtl_bt/rtl8723bs_config", .cfg_name = "rtl_bt/rtl8723bs_config",
.hw_info = "rtl8723bs" }, .hw_info = "rtl8723bs" },
...@@ -120,7 +120,7 @@ static const struct id_table ic_id_table[] = { ...@@ -120,7 +120,7 @@ static const struct id_table ic_id_table[] = {
{ IC_INFO(RTL_ROM_LMP_8723B, 0xb, 0x6, HCI_USB), { IC_INFO(RTL_ROM_LMP_8723B, 0xb, 0x6, HCI_USB),
.config_needed = false, .config_needed = false,
.has_rom_version = true, .has_rom_version = true,
.fw_name = "rtl_bt/rtl8723b_fw.bin", .fw_name = "rtl_bt/rtl8723b_fw",
.cfg_name = "rtl_bt/rtl8723b_config", .cfg_name = "rtl_bt/rtl8723b_config",
.hw_info = "rtl8723bu" }, .hw_info = "rtl8723bu" },
...@@ -132,7 +132,7 @@ static const struct id_table ic_id_table[] = { ...@@ -132,7 +132,7 @@ static const struct id_table ic_id_table[] = {
.hci_bus = HCI_UART, .hci_bus = HCI_UART,
.config_needed = true, .config_needed = true,
.has_rom_version = true, .has_rom_version = true,
.fw_name = "rtl_bt/rtl8723cs_cg_fw.bin", .fw_name = "rtl_bt/rtl8723cs_cg_fw",
.cfg_name = "rtl_bt/rtl8723cs_cg_config", .cfg_name = "rtl_bt/rtl8723cs_cg_config",
.hw_info = "rtl8723cs-cg" }, .hw_info = "rtl8723cs-cg" },
...@@ -144,7 +144,7 @@ static const struct id_table ic_id_table[] = { ...@@ -144,7 +144,7 @@ static const struct id_table ic_id_table[] = {
.hci_bus = HCI_UART, .hci_bus = HCI_UART,
.config_needed = true, .config_needed = true,
.has_rom_version = true, .has_rom_version = true,
.fw_name = "rtl_bt/rtl8723cs_vf_fw.bin", .fw_name = "rtl_bt/rtl8723cs_vf_fw",
.cfg_name = "rtl_bt/rtl8723cs_vf_config", .cfg_name = "rtl_bt/rtl8723cs_vf_config",
.hw_info = "rtl8723cs-vf" }, .hw_info = "rtl8723cs-vf" },
...@@ -156,7 +156,7 @@ static const struct id_table ic_id_table[] = { ...@@ -156,7 +156,7 @@ static const struct id_table ic_id_table[] = {
.hci_bus = HCI_UART, .hci_bus = HCI_UART,
.config_needed = true, .config_needed = true,
.has_rom_version = true, .has_rom_version = true,
.fw_name = "rtl_bt/rtl8723cs_xx_fw.bin", .fw_name = "rtl_bt/rtl8723cs_xx_fw",
.cfg_name = "rtl_bt/rtl8723cs_xx_config", .cfg_name = "rtl_bt/rtl8723cs_xx_config",
.hw_info = "rtl8723cs" }, .hw_info = "rtl8723cs" },
...@@ -164,7 +164,7 @@ static const struct id_table ic_id_table[] = { ...@@ -164,7 +164,7 @@ static const struct id_table ic_id_table[] = {
{ IC_INFO(RTL_ROM_LMP_8723B, 0xd, 0x8, HCI_USB), { IC_INFO(RTL_ROM_LMP_8723B, 0xd, 0x8, HCI_USB),
.config_needed = true, .config_needed = true,
.has_rom_version = true, .has_rom_version = true,
.fw_name = "rtl_bt/rtl8723d_fw.bin", .fw_name = "rtl_bt/rtl8723d_fw",
.cfg_name = "rtl_bt/rtl8723d_config", .cfg_name = "rtl_bt/rtl8723d_config",
.hw_info = "rtl8723du" }, .hw_info = "rtl8723du" },
...@@ -172,7 +172,7 @@ static const struct id_table ic_id_table[] = { ...@@ -172,7 +172,7 @@ static const struct id_table ic_id_table[] = {
{ IC_INFO(RTL_ROM_LMP_8723B, 0xd, 0x8, HCI_UART), { IC_INFO(RTL_ROM_LMP_8723B, 0xd, 0x8, HCI_UART),
.config_needed = true, .config_needed = true,
.has_rom_version = true, .has_rom_version = true,
.fw_name = "rtl_bt/rtl8723ds_fw.bin", .fw_name = "rtl_bt/rtl8723ds_fw",
.cfg_name = "rtl_bt/rtl8723ds_config", .cfg_name = "rtl_bt/rtl8723ds_config",
.hw_info = "rtl8723ds" }, .hw_info = "rtl8723ds" },
...@@ -180,7 +180,7 @@ static const struct id_table ic_id_table[] = { ...@@ -180,7 +180,7 @@ static const struct id_table ic_id_table[] = {
{ IC_INFO(RTL_ROM_LMP_8821A, 0xa, 0x6, HCI_USB), { IC_INFO(RTL_ROM_LMP_8821A, 0xa, 0x6, HCI_USB),
.config_needed = false, .config_needed = false,
.has_rom_version = true, .has_rom_version = true,
.fw_name = "rtl_bt/rtl8821a_fw.bin", .fw_name = "rtl_bt/rtl8821a_fw",
.cfg_name = "rtl_bt/rtl8821a_config", .cfg_name = "rtl_bt/rtl8821a_config",
.hw_info = "rtl8821au" }, .hw_info = "rtl8821au" },
...@@ -189,7 +189,7 @@ static const struct id_table ic_id_table[] = { ...@@ -189,7 +189,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = false, .config_needed = false,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = true, .has_msft_ext = true,
.fw_name = "rtl_bt/rtl8821c_fw.bin", .fw_name = "rtl_bt/rtl8821c_fw",
.cfg_name = "rtl_bt/rtl8821c_config", .cfg_name = "rtl_bt/rtl8821c_config",
.hw_info = "rtl8821cu" }, .hw_info = "rtl8821cu" },
...@@ -198,7 +198,7 @@ static const struct id_table ic_id_table[] = { ...@@ -198,7 +198,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = true, .config_needed = true,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = true, .has_msft_ext = true,
.fw_name = "rtl_bt/rtl8821cs_fw.bin", .fw_name = "rtl_bt/rtl8821cs_fw",
.cfg_name = "rtl_bt/rtl8821cs_config", .cfg_name = "rtl_bt/rtl8821cs_config",
.hw_info = "rtl8821cs" }, .hw_info = "rtl8821cs" },
...@@ -206,7 +206,7 @@ static const struct id_table ic_id_table[] = { ...@@ -206,7 +206,7 @@ static const struct id_table ic_id_table[] = {
{ IC_INFO(RTL_ROM_LMP_8761A, 0xa, 0x6, HCI_USB), { IC_INFO(RTL_ROM_LMP_8761A, 0xa, 0x6, HCI_USB),
.config_needed = false, .config_needed = false,
.has_rom_version = true, .has_rom_version = true,
.fw_name = "rtl_bt/rtl8761a_fw.bin", .fw_name = "rtl_bt/rtl8761a_fw",
.cfg_name = "rtl_bt/rtl8761a_config", .cfg_name = "rtl_bt/rtl8761a_config",
.hw_info = "rtl8761au" }, .hw_info = "rtl8761au" },
...@@ -215,7 +215,7 @@ static const struct id_table ic_id_table[] = { ...@@ -215,7 +215,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = false, .config_needed = false,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = true, .has_msft_ext = true,
.fw_name = "rtl_bt/rtl8761b_fw.bin", .fw_name = "rtl_bt/rtl8761b_fw",
.cfg_name = "rtl_bt/rtl8761b_config", .cfg_name = "rtl_bt/rtl8761b_config",
.hw_info = "rtl8761btv" }, .hw_info = "rtl8761btv" },
...@@ -223,7 +223,7 @@ static const struct id_table ic_id_table[] = { ...@@ -223,7 +223,7 @@ static const struct id_table ic_id_table[] = {
{ IC_INFO(RTL_ROM_LMP_8761A, 0xb, 0xa, HCI_USB), { IC_INFO(RTL_ROM_LMP_8761A, 0xb, 0xa, HCI_USB),
.config_needed = false, .config_needed = false,
.has_rom_version = true, .has_rom_version = true,
.fw_name = "rtl_bt/rtl8761bu_fw.bin", .fw_name = "rtl_bt/rtl8761bu_fw",
.cfg_name = "rtl_bt/rtl8761bu_config", .cfg_name = "rtl_bt/rtl8761bu_config",
.hw_info = "rtl8761bu" }, .hw_info = "rtl8761bu" },
...@@ -232,7 +232,7 @@ static const struct id_table ic_id_table[] = { ...@@ -232,7 +232,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = true, .config_needed = true,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = true, .has_msft_ext = true,
.fw_name = "rtl_bt/rtl8822cs_fw.bin", .fw_name = "rtl_bt/rtl8822cs_fw",
.cfg_name = "rtl_bt/rtl8822cs_config", .cfg_name = "rtl_bt/rtl8822cs_config",
.hw_info = "rtl8822cs" }, .hw_info = "rtl8822cs" },
...@@ -241,7 +241,7 @@ static const struct id_table ic_id_table[] = { ...@@ -241,7 +241,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = true, .config_needed = true,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = true, .has_msft_ext = true,
.fw_name = "rtl_bt/rtl8822cs_fw.bin", .fw_name = "rtl_bt/rtl8822cs_fw",
.cfg_name = "rtl_bt/rtl8822cs_config", .cfg_name = "rtl_bt/rtl8822cs_config",
.hw_info = "rtl8822cs" }, .hw_info = "rtl8822cs" },
...@@ -250,7 +250,7 @@ static const struct id_table ic_id_table[] = { ...@@ -250,7 +250,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = false, .config_needed = false,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = true, .has_msft_ext = true,
.fw_name = "rtl_bt/rtl8822cu_fw.bin", .fw_name = "rtl_bt/rtl8822cu_fw",
.cfg_name = "rtl_bt/rtl8822cu_config", .cfg_name = "rtl_bt/rtl8822cu_config",
.hw_info = "rtl8822cu" }, .hw_info = "rtl8822cu" },
...@@ -259,7 +259,7 @@ static const struct id_table ic_id_table[] = { ...@@ -259,7 +259,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = true, .config_needed = true,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = true, .has_msft_ext = true,
.fw_name = "rtl_bt/rtl8822b_fw.bin", .fw_name = "rtl_bt/rtl8822b_fw",
.cfg_name = "rtl_bt/rtl8822b_config", .cfg_name = "rtl_bt/rtl8822b_config",
.hw_info = "rtl8822bu" }, .hw_info = "rtl8822bu" },
...@@ -268,7 +268,7 @@ static const struct id_table ic_id_table[] = { ...@@ -268,7 +268,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = false, .config_needed = false,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = true, .has_msft_ext = true,
.fw_name = "rtl_bt/rtl8852au_fw.bin", .fw_name = "rtl_bt/rtl8852au_fw",
.cfg_name = "rtl_bt/rtl8852au_config", .cfg_name = "rtl_bt/rtl8852au_config",
.hw_info = "rtl8852au" }, .hw_info = "rtl8852au" },
...@@ -277,7 +277,7 @@ static const struct id_table ic_id_table[] = { ...@@ -277,7 +277,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = true, .config_needed = true,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = true, .has_msft_ext = true,
.fw_name = "rtl_bt/rtl8852bs_fw.bin", .fw_name = "rtl_bt/rtl8852bs_fw",
.cfg_name = "rtl_bt/rtl8852bs_config", .cfg_name = "rtl_bt/rtl8852bs_config",
.hw_info = "rtl8852bs" }, .hw_info = "rtl8852bs" },
...@@ -286,7 +286,7 @@ static const struct id_table ic_id_table[] = { ...@@ -286,7 +286,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = false, .config_needed = false,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = true, .has_msft_ext = true,
.fw_name = "rtl_bt/rtl8852bu_fw.bin", .fw_name = "rtl_bt/rtl8852bu_fw",
.cfg_name = "rtl_bt/rtl8852bu_config", .cfg_name = "rtl_bt/rtl8852bu_config",
.hw_info = "rtl8852bu" }, .hw_info = "rtl8852bu" },
...@@ -295,7 +295,7 @@ static const struct id_table ic_id_table[] = { ...@@ -295,7 +295,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = false, .config_needed = false,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = true, .has_msft_ext = true,
.fw_name = "rtl_bt/rtl8852cu_fw.bin", .fw_name = "rtl_bt/rtl8852cu_fw",
.cfg_name = "rtl_bt/rtl8852cu_config", .cfg_name = "rtl_bt/rtl8852cu_config",
.hw_info = "rtl8852cu" }, .hw_info = "rtl8852cu" },
...@@ -304,7 +304,7 @@ static const struct id_table ic_id_table[] = { ...@@ -304,7 +304,7 @@ static const struct id_table ic_id_table[] = {
.config_needed = false, .config_needed = false,
.has_rom_version = true, .has_rom_version = true,
.has_msft_ext = false, .has_msft_ext = false,
.fw_name = "rtl_bt/rtl8851bu_fw.bin", .fw_name = "rtl_bt/rtl8851bu_fw",
.cfg_name = "rtl_bt/rtl8851bu_config", .cfg_name = "rtl_bt/rtl8851bu_config",
.hw_info = "rtl8851bu" }, .hw_info = "rtl8851bu" },
}; };
...@@ -1045,6 +1045,7 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, ...@@ -1045,6 +1045,7 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev,
struct sk_buff *skb; struct sk_buff *skb;
struct hci_rp_read_local_version *resp; struct hci_rp_read_local_version *resp;
struct hci_command_hdr *cmd; struct hci_command_hdr *cmd;
char fw_name[40];
char cfg_name[40]; char cfg_name[40];
u16 hci_rev, lmp_subver; u16 hci_rev, lmp_subver;
u8 hci_ver, lmp_ver, chip_type = 0; u8 hci_ver, lmp_ver, chip_type = 0;
...@@ -1154,8 +1155,26 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, ...@@ -1154,8 +1155,26 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev,
goto err_free; goto err_free;
} }
btrtl_dev->fw_len = rtl_load_file(hdev, btrtl_dev->ic_info->fw_name, if (!btrtl_dev->ic_info->fw_name) {
&btrtl_dev->fw_data); ret = -ENOMEM;
goto err_free;
}
btrtl_dev->fw_len = -EIO;
if (lmp_subver == RTL_ROM_LMP_8852A && hci_rev == 0x000c) {
snprintf(fw_name, sizeof(fw_name), "%s_v2.bin",
btrtl_dev->ic_info->fw_name);
btrtl_dev->fw_len = rtl_load_file(hdev, fw_name,
&btrtl_dev->fw_data);
}
if (btrtl_dev->fw_len < 0) {
snprintf(fw_name, sizeof(fw_name), "%s.bin",
btrtl_dev->ic_info->fw_name);
btrtl_dev->fw_len = rtl_load_file(hdev, fw_name,
&btrtl_dev->fw_data);
}
if (btrtl_dev->fw_len < 0) { if (btrtl_dev->fw_len < 0) {
rtl_dev_err(hdev, "firmware file %s not found", rtl_dev_err(hdev, "firmware file %s not found",
btrtl_dev->ic_info->fw_name); btrtl_dev->ic_info->fw_name);
...@@ -1491,4 +1510,5 @@ MODULE_FIRMWARE("rtl_bt/rtl8852bs_config.bin"); ...@@ -1491,4 +1510,5 @@ MODULE_FIRMWARE("rtl_bt/rtl8852bs_config.bin");
MODULE_FIRMWARE("rtl_bt/rtl8852bu_fw.bin"); MODULE_FIRMWARE("rtl_bt/rtl8852bu_fw.bin");
MODULE_FIRMWARE("rtl_bt/rtl8852bu_config.bin"); MODULE_FIRMWARE("rtl_bt/rtl8852bu_config.bin");
MODULE_FIRMWARE("rtl_bt/rtl8852cu_fw.bin"); MODULE_FIRMWARE("rtl_bt/rtl8852cu_fw.bin");
MODULE_FIRMWARE("rtl_bt/rtl8852cu_fw_v2.bin");
MODULE_FIRMWARE("rtl_bt/rtl8852cu_config.bin"); MODULE_FIRMWARE("rtl_bt/rtl8852cu_config.bin");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment