2021-10-19 05:30:12 +08:00
/* SPDX-License-Identifier: ISC */
/* Copyright (C) 2021 MediaTek Inc. */
2022-03-09 08:03:52 +08:00
# define FIRMWARE_MT7622 "mediatek / mt7622pr2h.bin"
2021-10-19 05:30:12 +08:00
# define FIRMWARE_MT7663 "mediatek / mt7663pr2h.bin"
# define FIRMWARE_MT7668 "mediatek / mt7668pr2h.bin"
# define FIRMWARE_MT7961 "mediatek / BT_RAM_CODE_MT7961_1_2_hdr.bin"
2023-06-20 16:27:50 +08:00
# define FIRMWARE_MT7925 "mediatek / mt7925 / BT_RAM_CODE_MT7925_1_1_hdr.bin"
2021-10-19 05:30:12 +08:00
2022-02-09 02:17:41 +08:00
# define HCI_EV_WMT 0xe4
2021-10-19 05:30:12 +08:00
# define HCI_WMT_MAX_EVENT_SIZE 64
2022-01-10 03:23:59 +08:00
# define BTMTK_WMT_REG_WRITE 0x1
2021-10-19 05:30:21 +08:00
# define BTMTK_WMT_REG_READ 0x2
2022-02-09 02:17:40 +08:00
# define MT7921_BTSYS_RST 0x70002610
# define MT7921_BTSYS_RST_WITH_GPIO BIT(7)
2022-01-10 03:23:59 +08:00
# define MT7921_PINMUX_0 0x70005050
# define MT7921_PINMUX_1 0x70005054
2022-02-09 02:17:40 +08:00
# define MT7921_DLSTATUS 0x7c053c10
# define BT_DL_STATE BIT(1)
2023-06-29 06:54:57 +08:00
# define MTK_COREDUMP_SIZE (1024 * 1000)
# define MTK_COREDUMP_END "coredump end"
2023-07-13 15:11:06 +08:00
# define MTK_COREDUMP_END_LEN (sizeof(MTK_COREDUMP_END))
2023-06-29 06:54:57 +08:00
# define MTK_COREDUMP_NUM 255
2021-10-19 05:30:12 +08:00
enum {
BTMTK_WMT_PATCH_DWNLD = 0x1 ,
2021-10-19 05:30:13 +08:00
BTMTK_WMT_TEST = 0x2 ,
BTMTK_WMT_WAKEUP = 0x3 ,
BTMTK_WMT_HIF = 0x4 ,
2021-10-19 05:30:12 +08:00
BTMTK_WMT_FUNC_CTRL = 0x6 ,
BTMTK_WMT_RST = 0x7 ,
2021-10-19 05:30:21 +08:00
BTMTK_WMT_REGISTER = 0x8 ,
2021-10-19 05:30:12 +08:00
BTMTK_WMT_SEMAPHORE = 0x17 ,
} ;
enum {
BTMTK_WMT_INVALID ,
BTMTK_WMT_PATCH_UNDONE ,
BTMTK_WMT_PATCH_PROGRESS ,
BTMTK_WMT_PATCH_DONE ,
BTMTK_WMT_ON_UNDONE ,
BTMTK_WMT_ON_DONE ,
BTMTK_WMT_ON_PROGRESS ,
} ;
struct btmtk_wmt_hdr {
u8 dir ;
u8 op ;
__le16 dlen ;
u8 flag ;
} __packed ;
struct btmtk_hci_wmt_cmd {
struct btmtk_wmt_hdr hdr ;
u8 data [ ] ;
} __packed ;
struct btmtk_hci_wmt_evt {
struct hci_event_hdr hhdr ;
struct btmtk_wmt_hdr whdr ;
} __packed ;
struct btmtk_hci_wmt_evt_funcc {
struct btmtk_hci_wmt_evt hwhdr ;
__be16 status ;
} __packed ;
2021-10-19 05:30:21 +08:00
struct btmtk_hci_wmt_evt_reg {
struct btmtk_hci_wmt_evt hwhdr ;
u8 rsv [ 2 ] ;
u8 num ;
__le32 addr ;
__le32 val ;
} __packed ;
2021-10-19 05:30:12 +08:00
struct btmtk_tci_sleep {
u8 mode ;
__le16 duration ;
__le16 host_duration ;
u8 host_wakeup_pin ;
u8 time_compensation ;
} __packed ;
2022-01-10 03:23:58 +08:00
struct btmtk_wakeon {
u8 mode ;
u8 gpo ;
u8 active_high ;
__le16 enable_delay ;
__le16 wakeup_delay ;
} __packed ;
2022-01-10 03:23:59 +08:00
struct btmtk_sco {
u8 clock_config ;
u8 transmit_format_config ;
u8 channel_format_config ;
u8 channel_select_config ;
} __packed ;
2022-01-10 03:24:00 +08:00
struct reg_read_cmd {
u8 type ;
u8 rsv ;
u8 num ;
__le32 addr ;
} __packed ;
2022-01-10 03:23:59 +08:00
struct reg_write_cmd {
u8 type ;
u8 rsv ;
u8 num ;
__le32 addr ;
__le32 data ;
__le32 mask ;
} __packed ;
2021-10-19 05:30:12 +08:00
struct btmtk_hci_wmt_params {
u8 op ;
u8 flag ;
u16 dlen ;
const void * data ;
u32 * status ;
} ;
2023-06-29 06:54:56 +08:00
typedef int ( * btmtk_reset_sync_func_t ) ( struct hci_dev * , void * ) ;
2023-06-29 06:54:57 +08:00
struct btmtk_coredump_info {
const char * driver_name ;
u32 fw_version ;
u16 cnt ;
int state ;
} ;
2023-06-20 16:27:50 +08:00
struct btmediatek_data {
u32 dev_id ;
2023-06-29 06:54:56 +08:00
btmtk_reset_sync_func_t reset_sync ;
2023-06-29 06:54:57 +08:00
struct btmtk_coredump_info cd_info ;
2023-06-20 16:27:50 +08:00
} ;
2021-10-19 05:30:12 +08:00
typedef int ( * wmt_cmd_sync_func_t ) ( struct hci_dev * ,
struct btmtk_hci_wmt_params * ) ;
# if IS_ENABLED(CONFIG_BT_MTK)
int btmtk_set_bdaddr ( struct hci_dev * hdev , const bdaddr_t * bdaddr ) ;
int btmtk_setup_firmware_79xx ( struct hci_dev * hdev , const char * fwname ,
wmt_cmd_sync_func_t wmt_cmd_sync ) ;
int btmtk_setup_firmware ( struct hci_dev * hdev , const char * fwname ,
wmt_cmd_sync_func_t wmt_cmd_sync ) ;
2023-06-29 06:54:56 +08:00
void btmtk_reset_sync ( struct hci_dev * hdev ) ;
2023-06-29 06:54:57 +08:00
int btmtk_register_coredump ( struct hci_dev * hdev , const char * name ,
u32 fw_version ) ;
int btmtk_process_coredump ( struct hci_dev * hdev , struct sk_buff * skb ) ;
2021-10-19 05:30:12 +08:00
# else
static inline int btmtk_set_bdaddr ( struct hci_dev * hdev ,
const bdaddr_t * bdaddr )
{
return - EOPNOTSUPP ;
}
static int btmtk_setup_firmware_79xx ( struct hci_dev * hdev , const char * fwname ,
wmt_cmd_sync_func_t wmt_cmd_sync )
{
return - EOPNOTSUPP ;
}
static int btmtk_setup_firmware ( struct hci_dev * hdev , const char * fwname ,
wmt_cmd_sync_func_t wmt_cmd_sync )
{
return - EOPNOTSUPP ;
}
2023-06-29 06:54:56 +08:00
static void btmtk_reset_sync ( struct hci_dev * hdev )
{
}
2023-06-29 06:54:57 +08:00
static int btmtk_register_coredump ( struct hci_dev * hdev , const char * name ,
u32 fw_version )
{
return - EOPNOTSUPP ;
}
static int btmtk_process_coredump ( struct hci_dev * hdev , struct sk_buff * skb )
{
return - EOPNOTSUPP ;
}
2021-10-19 05:30:12 +08:00
# endif