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