OSDN Git Service

Bluetooth: btrtl: Refine the ic_id_table for clearer and more regular
authorMax Chou <max.chou@realtek.com>
Wed, 4 Nov 2020 12:04:14 +0000 (20:04 +0800)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 9 Nov 2020 12:36:40 +0000 (13:36 +0100)
Enhance the ic_id_table that it's able to maintain regularly.
To judge which chip should be initialized by LMP subversion, HCI revision,
 HCI version and HCI bus which were given in the ic_id_table.
Also, refine the incorrect LMP subversion of ROM for RTL8723D and
RTL8723A.

Suggested-by: Alex Lu <alex_lu@realsil.com.cn>
Signed-off-by: Max Chou <max.chou@realtek.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btrtl.c

index 3a9afc9..1ab9f27 100644 (file)
 #define VERSION "0.1"
 
 #define RTL_EPATCH_SIGNATURE   "Realtech"
-#define RTL_ROM_LMP_3499       0x3499
 #define RTL_ROM_LMP_8723A      0x1200
 #define RTL_ROM_LMP_8723B      0x8723
-#define RTL_ROM_LMP_8723D      0x8873
 #define RTL_ROM_LMP_8821A      0x8821
 #define RTL_ROM_LMP_8761A      0x8761
 #define RTL_ROM_LMP_8822B      0x8822
 #define IC_MATCH_FL_HCIREV     (1 << 1)
 #define IC_MATCH_FL_HCIVER     (1 << 2)
 #define IC_MATCH_FL_HCIBUS     (1 << 3)
-#define IC_INFO(lmps, hcir) \
-       .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_HCIREV, \
+#define IC_INFO(lmps, hcir, hciv, bus) \
+       .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_HCIREV | \
+                      IC_MATCH_FL_HCIVER | IC_MATCH_FL_HCIBUS, \
        .lmp_subver = (lmps), \
-       .hci_rev = (hcir)
+       .hci_rev = (hcir), \
+       .hci_ver = (hciv), \
+       .hci_bus = (bus)
 
 struct id_table {
        __u16 match_flags;
@@ -58,112 +59,85 @@ struct btrtl_device_info {
 };
 
 static const struct id_table ic_id_table[] = {
-       { IC_MATCH_FL_LMPSUBV, RTL_ROM_LMP_8723A, 0x0,
-         .config_needed = false,
-         .has_rom_version = false,
-         .fw_name = "rtl_bt/rtl8723a_fw.bin",
-         .cfg_name = NULL },
-
-       { IC_MATCH_FL_LMPSUBV, RTL_ROM_LMP_3499, 0x0,
+       /* 8723A */
+       { IC_INFO(RTL_ROM_LMP_8723A, 0xb, 0x6, HCI_USB),
          .config_needed = false,
          .has_rom_version = false,
          .fw_name = "rtl_bt/rtl8723a_fw.bin",
          .cfg_name = NULL },
 
        /* 8723BS */
-       { .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_HCIREV |
-                        IC_MATCH_FL_HCIVER | IC_MATCH_FL_HCIBUS,
-         .lmp_subver = RTL_ROM_LMP_8723B,
-         .hci_rev = 0xb,
-         .hci_ver = 6,
-         .hci_bus = HCI_UART,
+       { IC_INFO(RTL_ROM_LMP_8723B, 0xb, 0x6, HCI_UART),
          .config_needed = true,
          .has_rom_version = true,
          .fw_name  = "rtl_bt/rtl8723bs_fw.bin",
          .cfg_name = "rtl_bt/rtl8723bs_config" },
 
        /* 8723B */
-       { IC_INFO(RTL_ROM_LMP_8723B, 0xb),
+       { IC_INFO(RTL_ROM_LMP_8723B, 0xb, 0x6, HCI_USB),
          .config_needed = false,
          .has_rom_version = true,
          .fw_name  = "rtl_bt/rtl8723b_fw.bin",
          .cfg_name = "rtl_bt/rtl8723b_config" },
 
        /* 8723D */
-       { IC_INFO(RTL_ROM_LMP_8723B, 0xd),
+       { IC_INFO(RTL_ROM_LMP_8723B, 0xd, 0x8, HCI_USB),
          .config_needed = true,
          .has_rom_version = true,
          .fw_name  = "rtl_bt/rtl8723d_fw.bin",
          .cfg_name = "rtl_bt/rtl8723d_config" },
 
        /* 8723DS */
-       { .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_HCIREV |
-                        IC_MATCH_FL_HCIVER | IC_MATCH_FL_HCIBUS,
-         .lmp_subver = RTL_ROM_LMP_8723B,
-         .hci_rev = 0xd,
-         .hci_ver = 8,
-         .hci_bus = HCI_UART,
+       { IC_INFO(RTL_ROM_LMP_8723B, 0xd, 0x8, HCI_UART),
          .config_needed = true,
          .has_rom_version = true,
          .fw_name  = "rtl_bt/rtl8723ds_fw.bin",
          .cfg_name = "rtl_bt/rtl8723ds_config" },
 
-       /* 8723DU */
-       { IC_INFO(RTL_ROM_LMP_8723D, 0x826C),
-         .config_needed = true,
-         .has_rom_version = true,
-         .fw_name  = "rtl_bt/rtl8723d_fw.bin",
-         .cfg_name = "rtl_bt/rtl8723d_config" },
-
        /* 8821A */
-       { IC_INFO(RTL_ROM_LMP_8821A, 0xa),
+       { IC_INFO(RTL_ROM_LMP_8821A, 0xa, 0x6, HCI_USB),
          .config_needed = false,
          .has_rom_version = true,
          .fw_name  = "rtl_bt/rtl8821a_fw.bin",
          .cfg_name = "rtl_bt/rtl8821a_config" },
 
        /* 8821C */
-       { IC_INFO(RTL_ROM_LMP_8821A, 0xc),
+       { IC_INFO(RTL_ROM_LMP_8821A, 0xc, 0x8, HCI_USB),
          .config_needed = false,
          .has_rom_version = true,
          .fw_name  = "rtl_bt/rtl8821c_fw.bin",
          .cfg_name = "rtl_bt/rtl8821c_config" },
 
        /* 8761A */
-       { IC_INFO(RTL_ROM_LMP_8761A, 0xa),
+       { IC_INFO(RTL_ROM_LMP_8761A, 0xa, 0x6, HCI_USB),
          .config_needed = false,
          .has_rom_version = true,
          .fw_name  = "rtl_bt/rtl8761a_fw.bin",
          .cfg_name = "rtl_bt/rtl8761a_config" },
 
        /* 8761B */
-       { IC_INFO(RTL_ROM_LMP_8761A, 0xb),
+       { IC_INFO(RTL_ROM_LMP_8761A, 0xb, 0xa, HCI_USB),
          .config_needed = false,
          .has_rom_version = true,
          .fw_name  = "rtl_bt/rtl8761b_fw.bin",
          .cfg_name = "rtl_bt/rtl8761b_config" },
 
        /* 8822C with UART interface */
-       { .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_HCIREV |
-                        IC_MATCH_FL_HCIBUS,
-         .lmp_subver = RTL_ROM_LMP_8822B,
-         .hci_rev = 0x000c,
-         .hci_ver = 0x0a,
-         .hci_bus = HCI_UART,
+       { IC_INFO(RTL_ROM_LMP_8822B, 0xc, 0xa, HCI_UART),
          .config_needed = true,
          .has_rom_version = true,
          .fw_name  = "rtl_bt/rtl8822cs_fw.bin",
          .cfg_name = "rtl_bt/rtl8822cs_config" },
 
        /* 8822C with USB interface */
-       { IC_INFO(RTL_ROM_LMP_8822B, 0xc),
+       { IC_INFO(RTL_ROM_LMP_8822B, 0xc, 0xa, HCI_USB),
          .config_needed = false,
          .has_rom_version = true,
          .fw_name  = "rtl_bt/rtl8822cu_fw.bin",
          .cfg_name = "rtl_bt/rtl8822cu_config" },
 
        /* 8822B */
-       { IC_INFO(RTL_ROM_LMP_8822B, 0xb),
+       { IC_INFO(RTL_ROM_LMP_8822B, 0xb, 0x7, HCI_USB),
          .config_needed = true,
          .has_rom_version = true,
          .fw_name  = "rtl_bt/rtl8822b_fw.bin",
@@ -654,7 +628,6 @@ int btrtl_download_firmware(struct hci_dev *hdev,
 
        switch (btrtl_dev->ic_info->lmp_subver) {
        case RTL_ROM_LMP_8723A:
-       case RTL_ROM_LMP_3499:
                return btrtl_setup_rtl8723a(hdev, btrtl_dev);
        case RTL_ROM_LMP_8723B:
        case RTL_ROM_LMP_8821A: