summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Wang <sean.wang@mediatek.com>2019-03-07 20:15:44 -0500
committerMarcel Holtmann <marcel@holtmann.org>2019-04-23 12:09:07 -0400
commit9aebfd4a2200ab8075e44379c758bccefdc589bb (patch)
treeb159de906f241bf6ccebf0d330846f77aa04aa36
parent756e161993824961fad4ba62c40045d9ab65bdb8 (diff)
Bluetooth: mediatek: add support for MediaTek MT7663S and MT7668S SDIO devices
This adds the support of enabling MT7663S and MT7668S SDIO-based Bluetooth function. There are quite many differences between MT766[3,8]S and standard Bluetooth SDIO devices such as Type-A and Type-B devices. For example, MT766[3,8]S have its own SDIO registers layout, definition, SDIO packet format, and the specific flow should be programmed on them to complete the device initialization and low power control and so on. Currently, there are many independent programming sequences from the transport which are exactly the same as the ones in btusb.c about MediaTek support [1] and btmtkuart.c. We can try to split the transport independent Bluetooth setups on the advance, place them into the common files and allow varous transport drivers to reuse them in the future. [1] http://lists.infradead.org/pipermail/linux-mediatek/2019-January/017074.html Signed-off-by: Sean Wang <sean.wang@mediatek.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--drivers/bluetooth/Kconfig11
-rw-r--r--drivers/bluetooth/Makefile1
-rw-r--r--drivers/bluetooth/btmtksdio.c979
3 files changed, 991 insertions, 0 deletions
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index 7b2e76e7f22f..b0f9a20401d6 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -379,6 +379,17 @@ config BT_WILINK
379 Say Y here to compile support for Texas Instrument's WiLink7 driver 379 Say Y here to compile support for Texas Instrument's WiLink7 driver
380 into the kernel or say M to compile it as module (btwilink). 380 into the kernel or say M to compile it as module (btwilink).
381 381
382config BT_MTKSDIO
383 tristate "MediaTek HCI SDIO driver"
384 depends on MMC
385 help
386 MediaTek Bluetooth HCI SDIO driver.
387 This driver is required if you want to use MediaTek Bluetooth
388 with SDIO interface.
389
390 Say Y here to compile support for MediaTek Bluetooth SDIO devices
391 into the kernel or say M to compile it as module (btmtksdio).
392
382config BT_MTKUART 393config BT_MTKUART
383 tristate "MediaTek HCI UART driver" 394 tristate "MediaTek HCI UART driver"
384 depends on SERIAL_DEV_BUS 395 depends on SERIAL_DEV_BUS
diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
index b7e393cfc1e3..34887b9b3a85 100644
--- a/drivers/bluetooth/Makefile
+++ b/drivers/bluetooth/Makefile
@@ -20,6 +20,7 @@ obj-$(CONFIG_BT_ATH3K) += ath3k.o
20obj-$(CONFIG_BT_MRVL) += btmrvl.o 20obj-$(CONFIG_BT_MRVL) += btmrvl.o
21obj-$(CONFIG_BT_MRVL_SDIO) += btmrvl_sdio.o 21obj-$(CONFIG_BT_MRVL_SDIO) += btmrvl_sdio.o
22obj-$(CONFIG_BT_WILINK) += btwilink.o 22obj-$(CONFIG_BT_WILINK) += btwilink.o
23obj-$(CONFIG_BT_MTKSDIO) += btmtksdio.o
23obj-$(CONFIG_BT_MTKUART) += btmtkuart.o 24obj-$(CONFIG_BT_MTKUART) += btmtkuart.o
24obj-$(CONFIG_BT_QCOMSMD) += btqcomsmd.o 25obj-$(CONFIG_BT_QCOMSMD) += btqcomsmd.o
25obj-$(CONFIG_BT_BCM) += btbcm.o 26obj-$(CONFIG_BT_BCM) += btbcm.o
diff --git a/drivers/bluetooth/btmtksdio.c b/drivers/bluetooth/btmtksdio.c
new file mode 100644
index 000000000000..b4b8320f279e
--- /dev/null
+++ b/drivers/bluetooth/btmtksdio.c
@@ -0,0 +1,979 @@
1// SPDX-License-Identifier: GPL-2.0
2// Copyright (c) 2019 MediaTek Inc.
3
4/*
5 * Bluetooth support for MediaTek SDIO devices
6 *
7 * This file is written based on btsdio.c and btmtkuart.c.
8 *
9 * Author: Sean Wang <sean.wang@mediatek.com>
10 *
11 */
12
13#include <asm/unaligned.h>
14#include <linux/atomic.h>
15#include <linux/firmware.h>
16#include <linux/init.h>
17#include <linux/iopoll.h>
18#include <linux/kernel.h>
19#include <linux/module.h>
20#include <linux/skbuff.h>
21
22#include <linux/mmc/host.h>
23#include <linux/mmc/sdio_ids.h>
24#include <linux/mmc/sdio_func.h>
25
26#include <net/bluetooth/bluetooth.h>
27#include <net/bluetooth/hci_core.h>
28
29#include "h4_recv.h"
30
31#define VERSION "0.1"
32
33#define FIRMWARE_MT7663 "mediatek/mt7663pr2h.bin"
34#define FIRMWARE_MT7668 "mediatek/mt7668pr2h.bin"
35
36struct btmtksdio_data {
37 const char *fwname;
38};
39
40static const struct btmtksdio_data mt7663_data = {
41 .fwname = FIRMWARE_MT7663,
42};
43
44static const struct btmtksdio_data mt7668_data = {
45 .fwname = FIRMWARE_MT7668,
46};
47
48static const struct sdio_device_id btmtksdio_table[] = {
49 {SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, 0x7663),
50 .driver_data = (kernel_ulong_t)&mt7663_data },
51 {SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, 0x7668),
52 .driver_data = (kernel_ulong_t)&mt7668_data },
53 { } /* Terminating entry */
54};
55
56#define MTK_REG_CHLPCR 0x4 /* W1S */
57#define C_INT_EN_SET BIT(0)
58#define C_INT_EN_CLR BIT(1)
59#define C_FW_OWN_REQ_SET BIT(8)
60#define C_FW_OWN_REQ_CLR BIT(9)
61
62#define MTK_REG_CSDIOCSR 0x8
63#define SDIO_RE_INIT_EN BIT(0)
64#define SDIO_INT_CTL BIT(2)
65
66#define MTK_REG_CHCR 0xc
67#define C_INT_CLR_CTRL BIT(1)
68
69/* CHISR have the same bits field definition with CHIER */
70#define MTK_REG_CHISR 0x10
71#define MTK_REG_CHIER 0x14
72#define FW_OWN_BACK_INT BIT(0)
73#define RX_DONE_INT BIT(1)
74#define TX_EMPTY BIT(2)
75#define TX_FIFO_OVERFLOW BIT(8)
76#define RX_PKT_LEN GENMASK(31, 16)
77
78#define MTK_REG_CTDR 0x18
79
80#define MTK_REG_CRDR 0x1c
81
82#define MTK_SDIO_BLOCK_SIZE 256
83
84#define BTMTKSDIO_TX_WAIT_VND_EVT 1
85
86enum {
87 MTK_WMT_PATCH_DWNLD = 0x1,
88 MTK_WMT_TEST = 0x2,
89 MTK_WMT_WAKEUP = 0x3,
90 MTK_WMT_HIF = 0x4,
91 MTK_WMT_FUNC_CTRL = 0x6,
92 MTK_WMT_RST = 0x7,
93 MTK_WMT_SEMAPHORE = 0x17,
94};
95
96enum {
97 BTMTK_WMT_INVALID,
98 BTMTK_WMT_PATCH_UNDONE,
99 BTMTK_WMT_PATCH_DONE,
100 BTMTK_WMT_ON_UNDONE,
101 BTMTK_WMT_ON_DONE,
102 BTMTK_WMT_ON_PROGRESS,
103};
104
105struct mtkbtsdio_hdr {
106 __le16 len;
107 __le16 reserved;
108 u8 bt_type;
109} __packed;
110
111struct mtk_wmt_hdr {
112 u8 dir;
113 u8 op;
114 __le16 dlen;
115 u8 flag;
116} __packed;
117
118struct mtk_hci_wmt_cmd {
119 struct mtk_wmt_hdr hdr;
120 u8 data[256];
121} __packed;
122
123struct btmtk_hci_wmt_evt {
124 struct hci_event_hdr hhdr;
125 struct mtk_wmt_hdr whdr;
126} __packed;
127
128struct btmtk_hci_wmt_evt_funcc {
129 struct btmtk_hci_wmt_evt hwhdr;
130 __be16 status;
131} __packed;
132
133struct btmtk_tci_sleep {
134 u8 mode;
135 __le16 duration;
136 __le16 host_duration;
137 u8 host_wakeup_pin;
138 u8 time_compensation;
139} __packed;
140
141struct btmtk_hci_wmt_params {
142 u8 op;
143 u8 flag;
144 u16 dlen;
145 const void *data;
146 u32 *status;
147};
148
149struct btmtksdio_dev {
150 struct hci_dev *hdev;
151 struct sdio_func *func;
152
153 struct work_struct tx_work;
154 unsigned long tx_state;
155 struct sk_buff_head txq;
156
157 struct sk_buff *evt_skb;
158
159 const struct btmtksdio_data *data;
160};
161
162static int mtk_hci_wmt_sync(struct hci_dev *hdev,
163 struct btmtk_hci_wmt_params *wmt_params)
164{
165 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev);
166 struct btmtk_hci_wmt_evt_funcc *wmt_evt_funcc;
167 u32 hlen, status = BTMTK_WMT_INVALID;
168 struct btmtk_hci_wmt_evt *wmt_evt;
169 struct mtk_hci_wmt_cmd wc;
170 struct mtk_wmt_hdr *hdr;
171 int err;
172
173 hlen = sizeof(*hdr) + wmt_params->dlen;
174 if (hlen > 255)
175 return -EINVAL;
176
177 hdr = (struct mtk_wmt_hdr *)&wc;
178 hdr->dir = 1;
179 hdr->op = wmt_params->op;
180 hdr->dlen = cpu_to_le16(wmt_params->dlen + 1);
181 hdr->flag = wmt_params->flag;
182 memcpy(wc.data, wmt_params->data, wmt_params->dlen);
183
184 set_bit(BTMTKSDIO_TX_WAIT_VND_EVT, &bdev->tx_state);
185
186 err = __hci_cmd_send(hdev, 0xfc6f, hlen, &wc);
187 if (err < 0) {
188 clear_bit(BTMTKSDIO_TX_WAIT_VND_EVT, &bdev->tx_state);
189 return err;
190 }
191
192 /* The vendor specific WMT commands are all answered by a vendor
193 * specific event and will not have the Command Status or Command
194 * Complete as with usual HCI command flow control.
195 *
196 * After sending the command, wait for BTMTKSDIO_TX_WAIT_VND_EVT
197 * state to be cleared. The driver specific event receive routine
198 * will clear that state and with that indicate completion of the
199 * WMT command.
200 */
201 err = wait_on_bit_timeout(&bdev->tx_state, BTMTKSDIO_TX_WAIT_VND_EVT,
202 TASK_INTERRUPTIBLE, HCI_INIT_TIMEOUT);
203 if (err == -EINTR) {
204 bt_dev_err(hdev, "Execution of wmt command interrupted");
205 clear_bit(BTMTKSDIO_TX_WAIT_VND_EVT, &bdev->tx_state);
206 return err;
207 }
208
209 if (err) {
210 bt_dev_err(hdev, "Execution of wmt command timed out");
211 clear_bit(BTMTKSDIO_TX_WAIT_VND_EVT, &bdev->tx_state);
212 return -ETIMEDOUT;
213 }
214
215 /* Parse and handle the return WMT event */
216 wmt_evt = (struct btmtk_hci_wmt_evt *)bdev->evt_skb->data;
217 if (wmt_evt->whdr.op != hdr->op) {
218 bt_dev_err(hdev, "Wrong op received %d expected %d",
219 wmt_evt->whdr.op, hdr->op);
220 err = -EIO;
221 goto err_free_skb;
222 }
223
224 switch (wmt_evt->whdr.op) {
225 case MTK_WMT_SEMAPHORE:
226 if (wmt_evt->whdr.flag == 2)
227 status = BTMTK_WMT_PATCH_UNDONE;
228 else
229 status = BTMTK_WMT_PATCH_DONE;
230 break;
231 case MTK_WMT_FUNC_CTRL:
232 wmt_evt_funcc = (struct btmtk_hci_wmt_evt_funcc *)wmt_evt;
233 if (be16_to_cpu(wmt_evt_funcc->status) == 0x404)
234 status = BTMTK_WMT_ON_DONE;
235 else if (be16_to_cpu(wmt_evt_funcc->status) == 0x420)
236 status = BTMTK_WMT_ON_PROGRESS;
237 else
238 status = BTMTK_WMT_ON_UNDONE;
239 break;
240 }
241
242 if (wmt_params->status)
243 *wmt_params->status = status;
244
245err_free_skb:
246 kfree_skb(bdev->evt_skb);
247 bdev->evt_skb = NULL;
248
249 return err;
250}
251
252static int btmtksdio_tx_packet(struct btmtksdio_dev *bdev,
253 struct sk_buff *skb)
254{
255 struct mtkbtsdio_hdr *sdio_hdr;
256 int err;
257
258 /* Make sure that there are enough rooms for SDIO header */
259 if (unlikely(skb_headroom(skb) < sizeof(*sdio_hdr))) {
260 err = pskb_expand_head(skb, sizeof(*sdio_hdr), 0,
261 GFP_ATOMIC);
262 if (err < 0)
263 return err;
264 }
265
266 /* Prepend MediaTek SDIO Specific Header */
267 skb_push(skb, sizeof(*sdio_hdr));
268
269 sdio_hdr = (void *)skb->data;
270 sdio_hdr->len = cpu_to_le16(skb->len);
271 sdio_hdr->reserved = cpu_to_le16(0);
272 sdio_hdr->bt_type = hci_skb_pkt_type(skb);
273
274 err = sdio_writesb(bdev->func, MTK_REG_CTDR, skb->data,
275 round_up(skb->len, MTK_SDIO_BLOCK_SIZE));
276 if (err < 0)
277 goto err_skb_pull;
278
279 bdev->hdev->stat.byte_tx += skb->len;
280
281 kfree_skb(skb);
282
283 return 0;
284
285err_skb_pull:
286 skb_pull(skb, sizeof(*sdio_hdr));
287
288 return err;
289}
290
291static u32 btmtksdio_drv_own_query(struct btmtksdio_dev *bdev)
292{
293 return sdio_readl(bdev->func, MTK_REG_CHLPCR, NULL);
294}
295
296static void btmtksdio_tx_work(struct work_struct *work)
297{
298 struct btmtksdio_dev *bdev = container_of(work, struct btmtksdio_dev,
299 tx_work);
300 struct sk_buff *skb;
301 int err;
302
303 sdio_claim_host(bdev->func);
304
305 while ((skb = skb_dequeue(&bdev->txq))) {
306 err = btmtksdio_tx_packet(bdev, skb);
307 if (err < 0) {
308 bdev->hdev->stat.err_tx++;
309 skb_queue_head(&bdev->txq, skb);
310 break;
311 }
312 }
313
314 sdio_release_host(bdev->func);
315}
316
317static int btmtksdio_recv_event(struct hci_dev *hdev, struct sk_buff *skb)
318{
319 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev);
320 struct hci_event_hdr *hdr = (void *)skb->data;
321 int err;
322
323 /* Fix up the vendor event id with 0xff for vendor specific instead
324 * of 0xe4 so that event send via monitoring socket can be parsed
325 * properly.
326 */
327 if (hdr->evt == 0xe4)
328 hdr->evt = HCI_EV_VENDOR;
329
330 /* When someone waits for the WMT event, the skb is being cloned
331 * and being processed the events from there then.
332 */
333 if (test_bit(BTMTKSDIO_TX_WAIT_VND_EVT, &bdev->tx_state)) {
334 bdev->evt_skb = skb_clone(skb, GFP_KERNEL);
335 if (!bdev->evt_skb) {
336 err = -ENOMEM;
337 goto err_out;
338 }
339 }
340
341 err = hci_recv_frame(hdev, skb);
342 if (err < 0)
343 goto err_free_skb;
344
345 if (hdr->evt == HCI_EV_VENDOR) {
346 if (test_and_clear_bit(BTMTKSDIO_TX_WAIT_VND_EVT,
347 &bdev->tx_state)) {
348 /* Barrier to sync with other CPUs */
349 smp_mb__after_atomic();
350 wake_up_bit(&bdev->tx_state, BTMTKSDIO_TX_WAIT_VND_EVT);
351 }
352 }
353
354 return 0;
355
356err_free_skb:
357 kfree_skb(bdev->evt_skb);
358 bdev->evt_skb = NULL;
359
360err_out:
361 return err;
362}
363
364static const struct h4_recv_pkt mtk_recv_pkts[] = {
365 { H4_RECV_ACL, .recv = hci_recv_frame },
366 { H4_RECV_SCO, .recv = hci_recv_frame },
367 { H4_RECV_EVENT, .recv = btmtksdio_recv_event },
368};
369
370static int btmtksdio_rx_packet(struct btmtksdio_dev *bdev, u16 rx_size)
371{
372 const struct h4_recv_pkt *pkts = mtk_recv_pkts;
373 int pkts_count = ARRAY_SIZE(mtk_recv_pkts);
374 struct mtkbtsdio_hdr *sdio_hdr;
375 unsigned char *old_data;
376 unsigned int old_len;
377 int err, i, pad_size;
378 struct sk_buff *skb;
379 u16 dlen;
380
381 if (rx_size < sizeof(*sdio_hdr))
382 return -EILSEQ;
383
384 /* A SDIO packet is exactly containing a Bluetooth packet */
385 skb = bt_skb_alloc(rx_size, GFP_KERNEL);
386 if (!skb)
387 return -ENOMEM;
388
389 skb_put(skb, rx_size);
390
391 err = sdio_readsb(bdev->func, skb->data, MTK_REG_CRDR, rx_size);
392 if (err < 0)
393 goto err_kfree_skb;
394
395 /* Keep old data for dump the content in case of some error is
396 * caught in the following packet parsing.
397 */
398 old_data = skb->data;
399 old_len = skb->len;
400
401 bdev->hdev->stat.byte_rx += rx_size;
402
403 sdio_hdr = (void *)skb->data;
404
405 /* We assume the default error as -EILSEQ simply to make the error path
406 * be cleaner.
407 */
408 err = -EILSEQ;
409
410 if (rx_size != le16_to_cpu(sdio_hdr->len)) {
411 bt_dev_err(bdev->hdev, "Rx size in sdio header is mismatched ");
412 goto err_kfree_skb;
413 }
414
415 hci_skb_pkt_type(skb) = sdio_hdr->bt_type;
416
417 /* Remove MediaTek SDIO header */
418 skb_pull(skb, sizeof(*sdio_hdr));
419
420 /* We have to dig into the packet to get payload size and then know how
421 * many padding bytes at the tail, these padding bytes should be removed
422 * before the packet is indicated to the core layer.
423 */
424 for (i = 0; i < pkts_count; i++) {
425 if (sdio_hdr->bt_type == (&pkts[i])->type)
426 break;
427 }
428
429 if (i >= pkts_count) {
430 bt_dev_err(bdev->hdev, "Invalid bt type 0x%02x",
431 sdio_hdr->bt_type);
432 goto err_kfree_skb;
433 }
434
435 /* Remaining bytes cannot hold a header*/
436 if (skb->len < (&pkts[i])->hlen) {
437 bt_dev_err(bdev->hdev, "The size of bt header is mismatched");
438 goto err_kfree_skb;
439 }
440
441 switch ((&pkts[i])->lsize) {
442 case 1:
443 dlen = skb->data[(&pkts[i])->loff];
444 break;
445 case 2:
446 dlen = get_unaligned_le16(skb->data +
447 (&pkts[i])->loff);
448 break;
449 default:
450 goto err_kfree_skb;
451 }
452
453 pad_size = skb->len - (&pkts[i])->hlen - dlen;
454
455 /* Remaining bytes cannot hold a payload */
456 if (pad_size < 0) {
457 bt_dev_err(bdev->hdev, "The size of bt payload is mismatched");
458 goto err_kfree_skb;
459 }
460
461 /* Remove padding bytes */
462 skb_trim(skb, skb->len - pad_size);
463
464 /* Complete frame */
465 (&pkts[i])->recv(bdev->hdev, skb);
466
467 return 0;
468
469err_kfree_skb:
470 print_hex_dump(KERN_ERR, "err sdio rx: ", DUMP_PREFIX_NONE, 4, 1,
471 old_data, old_len, true);
472 kfree_skb(skb);
473
474 return err;
475}
476
477static void btmtksdio_interrupt(struct sdio_func *func)
478{
479 struct btmtksdio_dev *bdev = sdio_get_drvdata(func);
480 u32 int_status;
481 u16 rx_size;
482
483 /* Disable interrupt */
484 sdio_writel(func, C_INT_EN_CLR, MTK_REG_CHLPCR, 0);
485
486 int_status = sdio_readl(func, MTK_REG_CHISR, NULL);
487
488 /* Ack an interrupt as soon as possible before any operation on
489 * hardware.
490 *
491 * Note that we don't ack any status during operations to avoid race
492 * condition between the host and the device such as it's possible to
493 * mistakenly ack RX_DONE for the next packet and then cause interrupts
494 * not be raised again but there is still pending data in the hardware
495 * FIFO.
496 */
497 sdio_writel(func, int_status, MTK_REG_CHISR, NULL);
498
499 if (unlikely(!int_status))
500 bt_dev_err(bdev->hdev, "CHISR is 0\n");
501
502 if (int_status & FW_OWN_BACK_INT)
503 bt_dev_dbg(bdev->hdev, "Get fw own back\n");
504
505 if (int_status & TX_EMPTY)
506 schedule_work(&bdev->tx_work);
507 else if (unlikely(int_status & TX_FIFO_OVERFLOW))
508 bt_dev_warn(bdev->hdev, "Tx fifo overflow\n");
509
510 if (int_status & RX_DONE_INT) {
511 rx_size = (int_status & RX_PKT_LEN) >> 16;
512
513 if (btmtksdio_rx_packet(bdev, rx_size) < 0)
514 bdev->hdev->stat.err_rx++;
515 }
516
517 /* Enable interrupt */
518 sdio_writel(func, C_INT_EN_SET, MTK_REG_CHLPCR, 0);
519}
520
521static int btmtksdio_open(struct hci_dev *hdev)
522{
523 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev);
524 int err;
525 u32 status;
526
527 sdio_claim_host(bdev->func);
528
529 err = sdio_enable_func(bdev->func);
530 if (err < 0)
531 goto err_release_host;
532
533 /* Get ownership from the device */
534 sdio_writel(bdev->func, C_FW_OWN_REQ_CLR, MTK_REG_CHLPCR, &err);
535 if (err < 0)
536 goto err_disable_func;
537
538 err = readx_poll_timeout(btmtksdio_drv_own_query, bdev, status,
539 status & C_FW_OWN_REQ_SET, 2000, 1000000);
540 if (err < 0) {
541 bt_dev_err(bdev->hdev, "Cannot get ownership from device");
542 goto err_disable_func;
543 }
544
545 /* Disable interrupt & mask out all interrupt sources */
546 sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, &err);
547 if (err < 0)
548 goto err_disable_func;
549
550 sdio_writel(bdev->func, 0, MTK_REG_CHIER, &err);
551 if (err < 0)
552 goto err_disable_func;
553
554 err = sdio_claim_irq(bdev->func, btmtksdio_interrupt);
555 if (err < 0)
556 goto err_disable_func;
557
558 err = sdio_set_block_size(bdev->func, MTK_SDIO_BLOCK_SIZE);
559 if (err < 0)
560 goto err_release_irq;
561
562 /* SDIO CMD 5 allows the SDIO device back to idle state an
563 * synchronous interrupt is supported in SDIO 4-bit mode
564 */
565 sdio_writel(bdev->func, SDIO_INT_CTL | SDIO_RE_INIT_EN,
566 MTK_REG_CSDIOCSR, &err);
567 if (err < 0)
568 goto err_release_irq;
569
570 /* Setup write-1-clear for CHISR register */
571 sdio_writel(bdev->func, C_INT_CLR_CTRL, MTK_REG_CHCR, &err);
572 if (err < 0)
573 goto err_release_irq;
574
575 /* Setup interrupt sources */
576 sdio_writel(bdev->func, RX_DONE_INT | TX_EMPTY | TX_FIFO_OVERFLOW,
577 MTK_REG_CHIER, &err);
578 if (err < 0)
579 goto err_release_irq;
580
581 /* Enable interrupt */
582 sdio_writel(bdev->func, C_INT_EN_SET, MTK_REG_CHLPCR, &err);
583 if (err < 0)
584 goto err_release_irq;
585
586 sdio_release_host(bdev->func);
587
588 return 0;
589
590err_release_irq:
591 sdio_release_irq(bdev->func);
592
593err_disable_func:
594 sdio_disable_func(bdev->func);
595
596err_release_host:
597 sdio_release_host(bdev->func);
598
599 return err;
600}
601
602static int btmtksdio_close(struct hci_dev *hdev)
603{
604 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev);
605 u32 status;
606 int err;
607
608 sdio_claim_host(bdev->func);
609
610 /* Disable interrupt */
611 sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL);
612
613 sdio_release_irq(bdev->func);
614
615 /* Return ownership to the device */
616 sdio_writel(bdev->func, C_FW_OWN_REQ_SET, MTK_REG_CHLPCR, NULL);
617
618 err = readx_poll_timeout(btmtksdio_drv_own_query, bdev, status,
619 !(status & C_FW_OWN_REQ_SET), 2000, 1000000);
620 if (err < 0)
621 bt_dev_err(bdev->hdev, "Cannot return ownership to device");
622
623 sdio_disable_func(bdev->func);
624
625 sdio_release_host(bdev->func);
626
627 return 0;
628}
629
630static int btmtksdio_flush(struct hci_dev *hdev)
631{
632 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev);
633
634 skb_queue_purge(&bdev->txq);
635
636 cancel_work_sync(&bdev->tx_work);
637
638 return 0;
639}
640
641static int btmtksdio_func_query(struct hci_dev *hdev)
642{
643 struct btmtk_hci_wmt_params wmt_params;
644 int status, err;
645 u8 param = 0;
646
647 /* Query whether the function is enabled */
648 wmt_params.op = MTK_WMT_FUNC_CTRL;
649 wmt_params.flag = 4;
650 wmt_params.dlen = sizeof(param);
651 wmt_params.data = &param;
652 wmt_params.status = &status;
653
654 err = mtk_hci_wmt_sync(hdev, &wmt_params);
655 if (err < 0) {
656 bt_dev_err(hdev, "Failed to query function status (%d)", err);
657 return err;
658 }
659
660 return status;
661}
662
663static int mtk_setup_firmware(struct hci_dev *hdev, const char *fwname)
664{
665 struct btmtk_hci_wmt_params wmt_params;
666 const struct firmware *fw;
667 const u8 *fw_ptr;
668 size_t fw_size;
669 int err, dlen;
670 u8 flag;
671
672 err = request_firmware(&fw, fwname, &hdev->dev);
673 if (err < 0) {
674 bt_dev_err(hdev, "Failed to load firmware file (%d)", err);
675 return err;
676 }
677
678 fw_ptr = fw->data;
679 fw_size = fw->size;
680
681 /* The size of patch header is 30 bytes, should be skip */
682 if (fw_size < 30) {
683 err = -EINVAL;
684 goto free_fw;
685 }
686
687 fw_size -= 30;
688 fw_ptr += 30;
689 flag = 1;
690
691 wmt_params.op = MTK_WMT_PATCH_DWNLD;
692 wmt_params.status = NULL;
693
694 while (fw_size > 0) {
695 dlen = min_t(int, 250, fw_size);
696
697 /* Tell device the position in sequence */
698 if (fw_size - dlen <= 0)
699 flag = 3;
700 else if (fw_size < fw->size - 30)
701 flag = 2;
702
703 wmt_params.flag = flag;
704 wmt_params.dlen = dlen;
705 wmt_params.data = fw_ptr;
706
707 err = mtk_hci_wmt_sync(hdev, &wmt_params);
708 if (err < 0) {
709 bt_dev_err(hdev, "Failed to send wmt patch dwnld (%d)",
710 err);
711 goto free_fw;
712 }
713
714 fw_size -= dlen;
715 fw_ptr += dlen;
716 }
717
718 wmt_params.op = MTK_WMT_RST;
719 wmt_params.flag = 4;
720 wmt_params.dlen = 0;
721 wmt_params.data = NULL;
722 wmt_params.status = NULL;
723
724 /* Activate funciton the firmware providing to */
725 err = mtk_hci_wmt_sync(hdev, &wmt_params);
726 if (err < 0) {
727 bt_dev_err(hdev, "Failed to send wmt rst (%d)", err);
728 goto free_fw;
729 }
730
731 /* Wait a few moments for firmware activation done */
732 usleep_range(10000, 12000);
733
734free_fw:
735 release_firmware(fw);
736 return err;
737}
738
739static int btmtksdio_setup(struct hci_dev *hdev)
740{
741 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev);
742 struct btmtk_hci_wmt_params wmt_params;
743 ktime_t calltime, delta, rettime;
744 struct btmtk_tci_sleep tci_sleep;
745 unsigned long long duration;
746 struct sk_buff *skb;
747 int err, status;
748 u8 param = 0x1;
749
750 calltime = ktime_get();
751
752 /* Query whether the firmware is already download */
753 wmt_params.op = MTK_WMT_SEMAPHORE;
754 wmt_params.flag = 1;
755 wmt_params.dlen = 0;
756 wmt_params.data = NULL;
757 wmt_params.status = &status;
758
759 err = mtk_hci_wmt_sync(hdev, &wmt_params);
760 if (err < 0) {
761 bt_dev_err(hdev, "Failed to query firmware status (%d)", err);
762 return err;
763 }
764
765 if (status == BTMTK_WMT_PATCH_DONE) {
766 bt_dev_info(hdev, "Firmware already downloaded");
767 goto ignore_setup_fw;
768 }
769
770 /* Setup a firmware which the device definitely requires */
771 err = mtk_setup_firmware(hdev, bdev->data->fwname);
772 if (err < 0)
773 return err;
774
775ignore_setup_fw:
776 /* Query whether the device is already enabled */
777 err = readx_poll_timeout(btmtksdio_func_query, hdev, status,
778 status < 0 || status != BTMTK_WMT_ON_PROGRESS,
779 2000, 5000000);
780 /* -ETIMEDOUT happens */
781 if (err < 0)
782 return err;
783
784 /* The other errors happen in btusb_mtk_func_query */
785 if (status < 0)
786 return status;
787
788 if (status == BTMTK_WMT_ON_DONE) {
789 bt_dev_info(hdev, "function already on");
790 goto ignore_func_on;
791 }
792
793 /* Enable Bluetooth protocol */
794 wmt_params.op = MTK_WMT_FUNC_CTRL;
795 wmt_params.flag = 0;
796 wmt_params.dlen = sizeof(param);
797 wmt_params.data = &param;
798 wmt_params.status = NULL;
799
800 err = mtk_hci_wmt_sync(hdev, &wmt_params);
801 if (err < 0) {
802 bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err);
803 return err;
804 }
805
806ignore_func_on:
807 /* Apply the low power environment setup */
808 tci_sleep.mode = 0x5;
809 tci_sleep.duration = cpu_to_le16(0x640);
810 tci_sleep.host_duration = cpu_to_le16(0x640);
811 tci_sleep.host_wakeup_pin = 0;
812 tci_sleep.time_compensation = 0;
813
814 skb = __hci_cmd_sync(hdev, 0xfc7a, sizeof(tci_sleep), &tci_sleep,
815 HCI_INIT_TIMEOUT);
816 if (IS_ERR(skb)) {
817 err = PTR_ERR(skb);
818 bt_dev_err(hdev, "Failed to apply low power setting (%d)", err);
819 return err;
820 }
821 kfree_skb(skb);
822
823 rettime = ktime_get();
824 delta = ktime_sub(rettime, calltime);
825 duration = (unsigned long long)ktime_to_ns(delta) >> 10;
826
827 bt_dev_info(hdev, "Device setup in %llu usecs", duration);
828
829 return 0;
830}
831
832static int btmtksdio_shutdown(struct hci_dev *hdev)
833{
834 struct btmtk_hci_wmt_params wmt_params;
835 u8 param = 0x0;
836 int err;
837
838 /* Disable the device */
839 wmt_params.op = MTK_WMT_FUNC_CTRL;
840 wmt_params.flag = 0;
841 wmt_params.dlen = sizeof(param);
842 wmt_params.data = &param;
843 wmt_params.status = NULL;
844
845 err = mtk_hci_wmt_sync(hdev, &wmt_params);
846 if (err < 0) {
847 bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err);
848 return err;
849 }
850
851 return 0;
852}
853
854static int btmtksdio_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
855{
856 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev);
857
858 switch (hci_skb_pkt_type(skb)) {
859 case HCI_COMMAND_PKT:
860 hdev->stat.cmd_tx++;
861 break;
862
863 case HCI_ACLDATA_PKT:
864 hdev->stat.acl_tx++;
865 break;
866
867 case HCI_SCODATA_PKT:
868 hdev->stat.sco_tx++;
869 break;
870
871 default:
872 return -EILSEQ;
873 }
874
875 skb_queue_tail(&bdev->txq, skb);
876
877 schedule_work(&bdev->tx_work);
878
879 return 0;
880}
881
882static int btmtksdio_probe(struct sdio_func *func,
883 const struct sdio_device_id *id)
884{
885 struct btmtksdio_dev *bdev;
886 struct hci_dev *hdev;
887 int err;
888
889 bdev = devm_kzalloc(&func->dev, sizeof(*bdev), GFP_KERNEL);
890 if (!bdev)
891 return -ENOMEM;
892
893 bdev->data = (void *)id->driver_data;
894 if (!bdev->data)
895 return -ENODEV;
896
897 bdev->func = func;
898
899 INIT_WORK(&bdev->tx_work, btmtksdio_tx_work);
900 skb_queue_head_init(&bdev->txq);
901
902 /* Initialize and register HCI device */
903 hdev = hci_alloc_dev();
904 if (!hdev) {
905 dev_err(&func->dev, "Can't allocate HCI device\n");
906 return -ENOMEM;
907 }
908
909 bdev->hdev = hdev;
910
911 hdev->bus = HCI_SDIO;
912 hci_set_drvdata(hdev, bdev);
913
914 hdev->open = btmtksdio_open;
915 hdev->close = btmtksdio_close;
916 hdev->flush = btmtksdio_flush;
917 hdev->setup = btmtksdio_setup;
918 hdev->shutdown = btmtksdio_shutdown;
919 hdev->send = btmtksdio_send_frame;
920 SET_HCIDEV_DEV(hdev, &func->dev);
921
922 hdev->manufacturer = 70;
923 set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
924
925 err = hci_register_dev(hdev);
926 if (err < 0) {
927 dev_err(&func->dev, "Can't register HCI device\n");
928 hci_free_dev(hdev);
929 return err;
930 }
931
932 sdio_set_drvdata(func, bdev);
933
934 return 0;
935}
936
937static void btmtksdio_remove(struct sdio_func *func)
938{
939 struct btmtksdio_dev *bdev = sdio_get_drvdata(func);
940 struct hci_dev *hdev;
941
942 if (!bdev)
943 return;
944
945 hdev = bdev->hdev;
946
947 sdio_set_drvdata(func, NULL);
948 hci_unregister_dev(hdev);
949 hci_free_dev(hdev);
950}
951
952static struct sdio_driver btmtksdio_driver = {
953 .name = "btmtksdio",
954 .probe = btmtksdio_probe,
955 .remove = btmtksdio_remove,
956 .id_table = btmtksdio_table,
957};
958
959static int __init btmtksdio_init(void)
960{
961 BT_INFO("MediaTek Bluetooth SDIO driver ver %s", VERSION);
962
963 return sdio_register_driver(&btmtksdio_driver);
964}
965
966static void __exit btmtksdio_exit(void)
967{
968 sdio_unregister_driver(&btmtksdio_driver);
969}
970
971module_init(btmtksdio_init);
972module_exit(btmtksdio_exit);
973
974MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
975MODULE_DESCRIPTION("MediaTek Bluetooth SDIO driver ver " VERSION);
976MODULE_VERSION(VERSION);
977MODULE_LICENSE("GPL");
978MODULE_FIRMWARE(FIRMWARE_MT7663);
979MODULE_FIRMWARE(FIRMWARE_MT7668);