298 lines · c
1/* SPDX-License-Identifier: ISC */2/* Copyright (C) 2021 MediaTek Inc. */3 4#define FIRMWARE_MT7622 "mediatek/mt7622pr2h.bin"5#define FIRMWARE_MT7663 "mediatek/mt7663pr2h.bin"6#define FIRMWARE_MT7668 "mediatek/mt7668pr2h.bin"7#define FIRMWARE_MT7922 "mediatek/BT_RAM_CODE_MT7922_1_1_hdr.bin"8#define FIRMWARE_MT7961 "mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin"9#define FIRMWARE_MT7925 "mediatek/mt7925/BT_RAM_CODE_MT7925_1_1_hdr.bin"10 11#define HCI_EV_WMT 0xe412#define HCI_WMT_MAX_EVENT_SIZE 6413 14#define BTMTK_WMT_REG_WRITE 0x115#define BTMTK_WMT_REG_READ 0x216 17#define MT7921_BTSYS_RST 0x7000261018#define MT7921_BTSYS_RST_WITH_GPIO BIT(7)19 20#define MT7921_PINMUX_0 0x7000505021#define MT7921_PINMUX_1 0x7000505422 23#define MT7921_DLSTATUS 0x7c053c1024#define BT_DL_STATE BIT(1)25 26#define MTK_COREDUMP_SIZE (1024 * 1000)27#define MTK_COREDUMP_END "coredump end"28#define MTK_COREDUMP_END_LEN (sizeof(MTK_COREDUMP_END))29#define MTK_COREDUMP_NUM 25530 31/* UHW CR mapping */32#define MTK_BT_MISC 0x7000251033#define MTK_BT_SUBSYS_RST 0x7000261034#define MTK_UDMA_INT_STA_BT 0x7400002435#define MTK_UDMA_INT_STA_BT1 0x7400030836#define MTK_BT_WDT_STATUS 0x740003A037#define MTK_EP_RST_OPT 0x7401189038#define MTK_EP_RST_IN_OUT_OPT 0x0001000139#define MTK_BT_RST_DONE 0x0000010040#define MTK_BT_RESET_REG_CONNV3 0x7002861041#define MTK_BT_READ_DEV_ID 0x7001020042 43/* MediaTek ISO Interface */44#define MTK_ISO_IFNUM 245 46enum {47 BTMTK_WMT_PATCH_DWNLD = 0x1,48 BTMTK_WMT_TEST = 0x2,49 BTMTK_WMT_WAKEUP = 0x3,50 BTMTK_WMT_HIF = 0x4,51 BTMTK_WMT_FUNC_CTRL = 0x6,52 BTMTK_WMT_RST = 0x7,53 BTMTK_WMT_REGISTER = 0x8,54 BTMTK_WMT_SEMAPHORE = 0x17,55};56 57enum {58 BTMTK_WMT_INVALID,59 BTMTK_WMT_PATCH_UNDONE,60 BTMTK_WMT_PATCH_PROGRESS,61 BTMTK_WMT_PATCH_DONE,62 BTMTK_WMT_ON_UNDONE,63 BTMTK_WMT_ON_DONE,64 BTMTK_WMT_ON_PROGRESS,65};66 67struct btmtk_wmt_hdr {68 u8 dir;69 u8 op;70 __le16 dlen;71 u8 flag;72} __packed;73 74struct btmtk_hci_wmt_cmd {75 struct btmtk_wmt_hdr hdr;76 u8 data[];77} __packed;78 79struct btmtk_hci_wmt_evt {80 struct hci_event_hdr hhdr;81 struct btmtk_wmt_hdr whdr;82} __packed;83 84struct btmtk_hci_wmt_evt_funcc {85 struct btmtk_hci_wmt_evt hwhdr;86 __be16 status;87} __packed;88 89struct btmtk_hci_wmt_evt_reg {90 struct btmtk_hci_wmt_evt hwhdr;91 u8 rsv[2];92 u8 num;93 __le32 addr;94 __le32 val;95} __packed;96 97struct btmtk_tci_sleep {98 u8 mode;99 __le16 duration;100 __le16 host_duration;101 u8 host_wakeup_pin;102 u8 time_compensation;103} __packed;104 105struct btmtk_wakeon {106 u8 mode;107 u8 gpo;108 u8 active_high;109 __le16 enable_delay;110 __le16 wakeup_delay;111} __packed;112 113struct btmtk_sco {114 u8 clock_config;115 u8 transmit_format_config;116 u8 channel_format_config;117 u8 channel_select_config;118} __packed;119 120struct reg_read_cmd {121 u8 type;122 u8 rsv;123 u8 num;124 __le32 addr;125} __packed;126 127struct reg_write_cmd {128 u8 type;129 u8 rsv;130 u8 num;131 __le32 addr;132 __le32 data;133 __le32 mask;134} __packed;135 136struct btmtk_hci_wmt_params {137 u8 op;138 u8 flag;139 u16 dlen;140 const void *data;141 u32 *status;142};143 144enum {145 BTMTK_TX_WAIT_VND_EVT,146 BTMTK_FIRMWARE_LOADED,147 BTMTK_HW_RESET_ACTIVE,148 BTMTK_ISOPKT_OVER_INTR,149 BTMTK_ISOPKT_RUNNING,150};151 152typedef int (*btmtk_reset_sync_func_t)(struct hci_dev *, void *);153 154struct btmtk_coredump_info {155 const char *driver_name;156 u32 fw_version;157 u16 cnt;158 int state;159};160 161struct btmtk_data {162 const char *drv_name;163 unsigned long flags;164 u32 dev_id;165 btmtk_reset_sync_func_t reset_sync;166 struct btmtk_coredump_info cd_info;167 168 struct usb_device *udev;169 struct usb_interface *intf;170 struct usb_anchor *ctrl_anchor;171 struct sk_buff *evt_skb;172 struct usb_endpoint_descriptor *isopkt_tx_ep;173 struct usb_endpoint_descriptor *isopkt_rx_ep;174 struct usb_interface *isopkt_intf;175 struct usb_anchor isopkt_anchor;176 struct sk_buff *isopkt_skb;177 178 /* spinlock for ISO data transmission */179 spinlock_t isorxlock;180};181 182typedef int (*wmt_cmd_sync_func_t)(struct hci_dev *,183 struct btmtk_hci_wmt_params *);184 185#if IS_ENABLED(CONFIG_BT_MTK)186 187int btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);188 189int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname,190 wmt_cmd_sync_func_t wmt_cmd_sync);191 192int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname,193 wmt_cmd_sync_func_t wmt_cmd_sync);194 195void btmtk_reset_sync(struct hci_dev *hdev);196 197int btmtk_register_coredump(struct hci_dev *hdev, const char *name,198 u32 fw_version);199 200int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb);201 202void btmtk_fw_get_filename(char *buf, size_t size, u32 dev_id, u32 fw_ver,203 u32 fw_flavor);204 205int btmtk_usb_subsys_reset(struct hci_dev *hdev, u32 dev_id);206 207int btmtk_usb_recv_acl(struct hci_dev *hdev, struct sk_buff *skb);208 209struct urb *alloc_mtk_intr_urb(struct hci_dev *hdev, struct sk_buff *skb,210 usb_complete_t tx_complete);211 212int btmtk_usb_resume(struct hci_dev *hdev);213 214int btmtk_usb_suspend(struct hci_dev *hdev);215 216int btmtk_usb_setup(struct hci_dev *hdev);217 218int btmtk_usb_shutdown(struct hci_dev *hdev);219#else220 221static inline int btmtk_set_bdaddr(struct hci_dev *hdev,222 const bdaddr_t *bdaddr)223{224 return -EOPNOTSUPP;225}226 227static inline int btmtk_setup_firmware_79xx(struct hci_dev *hdev,228 const char *fwname,229 wmt_cmd_sync_func_t wmt_cmd_sync)230{231 return -EOPNOTSUPP;232}233 234static inline int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname,235 wmt_cmd_sync_func_t wmt_cmd_sync)236{237 return -EOPNOTSUPP;238}239 240static inline void btmtk_reset_sync(struct hci_dev *hdev)241{242}243 244static inline int btmtk_register_coredump(struct hci_dev *hdev,245 const char *name, u32 fw_version)246{247 return -EOPNOTSUPP;248}249 250static inline int btmtk_process_coredump(struct hci_dev *hdev,251 struct sk_buff *skb)252{253 return -EOPNOTSUPP;254}255 256static inline void btmtk_fw_get_filename(char *buf, size_t size, u32 dev_id,257 u32 fw_ver, u32 fw_flavor)258{259}260 261static inline int btmtk_usb_subsys_reset(struct hci_dev *hdev, u32 dev_id)262{263 return -EOPNOTSUPP;264}265 266static inline int btmtk_usb_recv_acl(struct hci_dev *hdev, struct sk_buff *skb)267{268 return -EOPNOTSUPP;269}270 271static inline struct urb *alloc_mtk_intr_urb(struct hci_dev *hdev,272 struct sk_buff *skb,273 usb_complete_t tx_complete)274{275 return ERR_PTR(-EOPNOTSUPP);276}277 278static inline int btmtk_usb_resume(struct hci_dev *hdev)279{280 return -EOPNOTSUPP;281}282 283static inline int btmtk_usb_suspend(struct hci_dev *hdev)284{285 return -EOPNOTSUPP;286}287 288static inline int btmtk_usb_setup(struct hci_dev *hdev)289{290 return -EOPNOTSUPP;291}292 293static inline int btmtk_usb_shutdown(struct hci_dev *hdev)294{295 return -EOPNOTSUPP;296}297#endif298