1/**
2 * Marvell BT-over-SDIO driver: SDIO interface related functions.
3 *
4 * Copyright (C) 2009, Marvell International Ltd.
5 *
6 * This software file (the "File") is distributed by Marvell International
7 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
8 * (the "License").  You may use, redistribute and/or modify this File in
9 * accordance with the terms and conditions of the License, a copy of which
10 * is available by writing to the Free Software Foundation, Inc.,
11 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
12 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
13 *
14 *
15 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
17 * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
18 * this warranty disclaimer.
19 **/
20
21#include <linux/firmware.h>
22#include <linux/slab.h>
23
24#include <linux/mmc/sdio_ids.h>
25#include <linux/mmc/sdio_func.h>
26#include <linux/module.h>
27#include <linux/devcoredump.h>
28
29#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/hci_core.h>
31
32#include "btmrvl_drv.h"
33#include "btmrvl_sdio.h"
34
35#define VERSION "1.0"
36
37static struct memory_type_mapping mem_type_mapping_tbl[] = {
38	{"ITCM", NULL, 0, 0xF0},
39	{"DTCM", NULL, 0, 0xF1},
40	{"SQRAM", NULL, 0, 0xF2},
41	{"APU", NULL, 0, 0xF3},
42	{"CIU", NULL, 0, 0xF4},
43	{"ICU", NULL, 0, 0xF5},
44	{"MAC", NULL, 0, 0xF6},
45	{"EXT7", NULL, 0, 0xF7},
46	{"EXT8", NULL, 0, 0xF8},
47	{"EXT9", NULL, 0, 0xF9},
48	{"EXT10", NULL, 0, 0xFA},
49	{"EXT11", NULL, 0, 0xFB},
50	{"EXT12", NULL, 0, 0xFC},
51	{"EXT13", NULL, 0, 0xFD},
52	{"EXTLAST", NULL, 0, 0xFE},
53};
54
55/* The btmrvl_sdio_remove() callback function is called
56 * when user removes this module from kernel space or ejects
57 * the card from the slot. The driver handles these 2 cases
58 * differently.
59 * If the user is removing the module, a MODULE_SHUTDOWN_REQ
60 * command is sent to firmware and interrupt will be disabled.
61 * If the card is removed, there is no need to send command
62 * or disable interrupt.
63 *
64 * The variable 'user_rmmod' is used to distinguish these two
65 * scenarios. This flag is initialized as FALSE in case the card
66 * is removed, and will be set to TRUE for module removal when
67 * module_exit function is called.
68 */
69static u8 user_rmmod;
70static u8 sdio_ireg;
71
72static const struct btmrvl_sdio_card_reg btmrvl_reg_8688 = {
73	.cfg = 0x03,
74	.host_int_mask = 0x04,
75	.host_intstatus = 0x05,
76	.card_status = 0x20,
77	.sq_read_base_addr_a0 = 0x10,
78	.sq_read_base_addr_a1 = 0x11,
79	.card_fw_status0 = 0x40,
80	.card_fw_status1 = 0x41,
81	.card_rx_len = 0x42,
82	.card_rx_unit = 0x43,
83	.io_port_0 = 0x00,
84	.io_port_1 = 0x01,
85	.io_port_2 = 0x02,
86	.int_read_to_clear = false,
87};
88static const struct btmrvl_sdio_card_reg btmrvl_reg_87xx = {
89	.cfg = 0x00,
90	.host_int_mask = 0x02,
91	.host_intstatus = 0x03,
92	.card_status = 0x30,
93	.sq_read_base_addr_a0 = 0x40,
94	.sq_read_base_addr_a1 = 0x41,
95	.card_revision = 0x5c,
96	.card_fw_status0 = 0x60,
97	.card_fw_status1 = 0x61,
98	.card_rx_len = 0x62,
99	.card_rx_unit = 0x63,
100	.io_port_0 = 0x78,
101	.io_port_1 = 0x79,
102	.io_port_2 = 0x7a,
103	.int_read_to_clear = false,
104};
105
106static const struct btmrvl_sdio_card_reg btmrvl_reg_8887 = {
107	.cfg = 0x00,
108	.host_int_mask = 0x08,
109	.host_intstatus = 0x0C,
110	.card_status = 0x5C,
111	.sq_read_base_addr_a0 = 0x6C,
112	.sq_read_base_addr_a1 = 0x6D,
113	.card_revision = 0xC8,
114	.card_fw_status0 = 0x88,
115	.card_fw_status1 = 0x89,
116	.card_rx_len = 0x8A,
117	.card_rx_unit = 0x8B,
118	.io_port_0 = 0xE4,
119	.io_port_1 = 0xE5,
120	.io_port_2 = 0xE6,
121	.int_read_to_clear = true,
122	.host_int_rsr = 0x04,
123	.card_misc_cfg = 0xD8,
124};
125
126static const struct btmrvl_sdio_card_reg btmrvl_reg_8897 = {
127	.cfg = 0x00,
128	.host_int_mask = 0x02,
129	.host_intstatus = 0x03,
130	.card_status = 0x50,
131	.sq_read_base_addr_a0 = 0x60,
132	.sq_read_base_addr_a1 = 0x61,
133	.card_revision = 0xbc,
134	.card_fw_status0 = 0xc0,
135	.card_fw_status1 = 0xc1,
136	.card_rx_len = 0xc2,
137	.card_rx_unit = 0xc3,
138	.io_port_0 = 0xd8,
139	.io_port_1 = 0xd9,
140	.io_port_2 = 0xda,
141	.int_read_to_clear = true,
142	.host_int_rsr = 0x01,
143	.card_misc_cfg = 0xcc,
144	.fw_dump_ctrl = 0xe2,
145	.fw_dump_start = 0xe3,
146	.fw_dump_end = 0xea,
147};
148
149static const struct btmrvl_sdio_card_reg btmrvl_reg_8997 = {
150	.cfg = 0x00,
151	.host_int_mask = 0x08,
152	.host_intstatus = 0x0c,
153	.card_status = 0x5c,
154	.sq_read_base_addr_a0 = 0xf8,
155	.sq_read_base_addr_a1 = 0xf9,
156	.card_revision = 0xc8,
157	.card_fw_status0 = 0xe8,
158	.card_fw_status1 = 0xe9,
159	.card_rx_len = 0xea,
160	.card_rx_unit = 0xeb,
161	.io_port_0 = 0xe4,
162	.io_port_1 = 0xe5,
163	.io_port_2 = 0xe6,
164	.int_read_to_clear = true,
165	.host_int_rsr = 0x04,
166	.card_misc_cfg = 0xD8,
167	.fw_dump_ctrl = 0xf0,
168	.fw_dump_start = 0xf1,
169	.fw_dump_end = 0xf8,
170};
171
172static const struct btmrvl_sdio_device btmrvl_sdio_sd8688 = {
173	.helper		= "mrvl/sd8688_helper.bin",
174	.firmware	= "mrvl/sd8688.bin",
175	.reg		= &btmrvl_reg_8688,
176	.support_pscan_win_report = false,
177	.sd_blksz_fw_dl	= 64,
178	.supports_fw_dump = false,
179};
180
181static const struct btmrvl_sdio_device btmrvl_sdio_sd8787 = {
182	.helper		= NULL,
183	.firmware	= "mrvl/sd8787_uapsta.bin",
184	.reg		= &btmrvl_reg_87xx,
185	.support_pscan_win_report = false,
186	.sd_blksz_fw_dl	= 256,
187	.supports_fw_dump = false,
188};
189
190static const struct btmrvl_sdio_device btmrvl_sdio_sd8797 = {
191	.helper		= NULL,
192	.firmware	= "mrvl/sd8797_uapsta.bin",
193	.reg		= &btmrvl_reg_87xx,
194	.support_pscan_win_report = false,
195	.sd_blksz_fw_dl	= 256,
196	.supports_fw_dump = false,
197};
198
199static const struct btmrvl_sdio_device btmrvl_sdio_sd8887 = {
200	.helper		= NULL,
201	.firmware	= "mrvl/sd8887_uapsta.bin",
202	.reg		= &btmrvl_reg_8887,
203	.support_pscan_win_report = true,
204	.sd_blksz_fw_dl	= 256,
205	.supports_fw_dump = false,
206};
207
208static const struct btmrvl_sdio_device btmrvl_sdio_sd8897 = {
209	.helper		= NULL,
210	.firmware	= "mrvl/sd8897_uapsta.bin",
211	.reg		= &btmrvl_reg_8897,
212	.support_pscan_win_report = true,
213	.sd_blksz_fw_dl	= 256,
214	.supports_fw_dump = true,
215};
216
217static const struct btmrvl_sdio_device btmrvl_sdio_sd8997 = {
218	.helper         = NULL,
219	.firmware       = "mrvl/sd8997_uapsta.bin",
220	.reg            = &btmrvl_reg_8997,
221	.support_pscan_win_report = true,
222	.sd_blksz_fw_dl = 256,
223	.supports_fw_dump = true,
224};
225
226static const struct sdio_device_id btmrvl_sdio_ids[] = {
227	/* Marvell SD8688 Bluetooth device */
228	{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x9105),
229			.driver_data = (unsigned long)&btmrvl_sdio_sd8688 },
230	/* Marvell SD8787 Bluetooth device */
231	{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x911A),
232			.driver_data = (unsigned long)&btmrvl_sdio_sd8787 },
233	/* Marvell SD8787 Bluetooth AMP device */
234	{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x911B),
235			.driver_data = (unsigned long)&btmrvl_sdio_sd8787 },
236	/* Marvell SD8797 Bluetooth device */
237	{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912A),
238			.driver_data = (unsigned long)&btmrvl_sdio_sd8797 },
239	/* Marvell SD8887 Bluetooth device */
240	{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x9136),
241			.driver_data = (unsigned long)&btmrvl_sdio_sd8887 },
242	/* Marvell SD8897 Bluetooth device */
243	{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912E),
244			.driver_data = (unsigned long)&btmrvl_sdio_sd8897 },
245	/* Marvell SD8997 Bluetooth device */
246	{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x9142),
247			.driver_data = (unsigned long)&btmrvl_sdio_sd8997 },
248
249	{ }	/* Terminating entry */
250};
251
252MODULE_DEVICE_TABLE(sdio, btmrvl_sdio_ids);
253
254static int btmrvl_sdio_get_rx_unit(struct btmrvl_sdio_card *card)
255{
256	u8 reg;
257	int ret;
258
259	reg = sdio_readb(card->func, card->reg->card_rx_unit, &ret);
260	if (!ret)
261		card->rx_unit = reg;
262
263	return ret;
264}
265
266static int btmrvl_sdio_read_fw_status(struct btmrvl_sdio_card *card, u16 *dat)
267{
268	u8 fws0, fws1;
269	int ret;
270
271	*dat = 0;
272
273	fws0 = sdio_readb(card->func, card->reg->card_fw_status0, &ret);
274	if (ret)
275		return -EIO;
276
277	fws1 = sdio_readb(card->func, card->reg->card_fw_status1, &ret);
278	if (ret)
279		return -EIO;
280
281	*dat = (((u16) fws1) << 8) | fws0;
282
283	return 0;
284}
285
286static int btmrvl_sdio_read_rx_len(struct btmrvl_sdio_card *card, u16 *dat)
287{
288	u8 reg;
289	int ret;
290
291	reg = sdio_readb(card->func, card->reg->card_rx_len, &ret);
292	if (!ret)
293		*dat = (u16) reg << card->rx_unit;
294
295	return ret;
296}
297
298static int btmrvl_sdio_enable_host_int_mask(struct btmrvl_sdio_card *card,
299								u8 mask)
300{
301	int ret;
302
303	sdio_writeb(card->func, mask, card->reg->host_int_mask, &ret);
304	if (ret) {
305		BT_ERR("Unable to enable the host interrupt!");
306		ret = -EIO;
307	}
308
309	return ret;
310}
311
312static int btmrvl_sdio_disable_host_int_mask(struct btmrvl_sdio_card *card,
313								u8 mask)
314{
315	u8 host_int_mask;
316	int ret;
317
318	host_int_mask = sdio_readb(card->func, card->reg->host_int_mask, &ret);
319	if (ret)
320		return -EIO;
321
322	host_int_mask &= ~mask;
323
324	sdio_writeb(card->func, host_int_mask, card->reg->host_int_mask, &ret);
325	if (ret < 0) {
326		BT_ERR("Unable to disable the host interrupt!");
327		return -EIO;
328	}
329
330	return 0;
331}
332
333static int btmrvl_sdio_poll_card_status(struct btmrvl_sdio_card *card, u8 bits)
334{
335	unsigned int tries;
336	u8 status;
337	int ret;
338
339	for (tries = 0; tries < MAX_POLL_TRIES * 1000; tries++) {
340		status = sdio_readb(card->func, card->reg->card_status,	&ret);
341		if (ret)
342			goto failed;
343		if ((status & bits) == bits)
344			return ret;
345
346		udelay(1);
347	}
348
349	ret = -ETIMEDOUT;
350
351failed:
352	BT_ERR("FAILED! ret=%d", ret);
353
354	return ret;
355}
356
357static int btmrvl_sdio_verify_fw_download(struct btmrvl_sdio_card *card,
358								int pollnum)
359{
360	u16 firmwarestat;
361	int tries, ret;
362
363	 /* Wait for firmware to become ready */
364	for (tries = 0; tries < pollnum; tries++) {
365		sdio_claim_host(card->func);
366		ret = btmrvl_sdio_read_fw_status(card, &firmwarestat);
367		sdio_release_host(card->func);
368		if (ret < 0)
369			continue;
370
371		if (firmwarestat == FIRMWARE_READY)
372			return 0;
373
374		msleep(10);
375	}
376
377	return -ETIMEDOUT;
378}
379
380static int btmrvl_sdio_download_helper(struct btmrvl_sdio_card *card)
381{
382	const struct firmware *fw_helper = NULL;
383	const u8 *helper = NULL;
384	int ret;
385	void *tmphlprbuf = NULL;
386	int tmphlprbufsz, hlprblknow, helperlen;
387	u8 *helperbuf;
388	u32 tx_len;
389
390	ret = request_firmware(&fw_helper, card->helper,
391						&card->func->dev);
392	if ((ret < 0) || !fw_helper) {
393		BT_ERR("request_firmware(helper) failed, error code = %d",
394									ret);
395		ret = -ENOENT;
396		goto done;
397	}
398
399	helper = fw_helper->data;
400	helperlen = fw_helper->size;
401
402	BT_DBG("Downloading helper image (%d bytes), block size %d bytes",
403						helperlen, SDIO_BLOCK_SIZE);
404
405	tmphlprbufsz = ALIGN_SZ(BTM_UPLD_SIZE, BTSDIO_DMA_ALIGN);
406
407	tmphlprbuf = kzalloc(tmphlprbufsz, GFP_KERNEL);
408	if (!tmphlprbuf) {
409		BT_ERR("Unable to allocate buffer for helper."
410			" Terminating download");
411		ret = -ENOMEM;
412		goto done;
413	}
414
415	helperbuf = (u8 *) ALIGN_ADDR(tmphlprbuf, BTSDIO_DMA_ALIGN);
416
417	/* Perform helper data transfer */
418	tx_len = (FIRMWARE_TRANSFER_NBLOCK * SDIO_BLOCK_SIZE)
419			- SDIO_HEADER_LEN;
420	hlprblknow = 0;
421
422	do {
423		ret = btmrvl_sdio_poll_card_status(card,
424					    CARD_IO_READY | DN_LD_CARD_RDY);
425		if (ret < 0) {
426			BT_ERR("Helper download poll status timeout @ %d",
427				hlprblknow);
428			goto done;
429		}
430
431		/* Check if there is more data? */
432		if (hlprblknow >= helperlen)
433			break;
434
435		if (helperlen - hlprblknow < tx_len)
436			tx_len = helperlen - hlprblknow;
437
438		/* Little-endian */
439		helperbuf[0] = ((tx_len & 0x000000ff) >> 0);
440		helperbuf[1] = ((tx_len & 0x0000ff00) >> 8);
441		helperbuf[2] = ((tx_len & 0x00ff0000) >> 16);
442		helperbuf[3] = ((tx_len & 0xff000000) >> 24);
443
444		memcpy(&helperbuf[SDIO_HEADER_LEN], &helper[hlprblknow],
445				tx_len);
446
447		/* Now send the data */
448		ret = sdio_writesb(card->func, card->ioport, helperbuf,
449				FIRMWARE_TRANSFER_NBLOCK * SDIO_BLOCK_SIZE);
450		if (ret < 0) {
451			BT_ERR("IO error during helper download @ %d",
452				hlprblknow);
453			goto done;
454		}
455
456		hlprblknow += tx_len;
457	} while (true);
458
459	BT_DBG("Transferring helper image EOF block");
460
461	memset(helperbuf, 0x0, SDIO_BLOCK_SIZE);
462
463	ret = sdio_writesb(card->func, card->ioport, helperbuf,
464							SDIO_BLOCK_SIZE);
465	if (ret < 0) {
466		BT_ERR("IO error in writing helper image EOF block");
467		goto done;
468	}
469
470	ret = 0;
471
472done:
473	kfree(tmphlprbuf);
474	release_firmware(fw_helper);
475	return ret;
476}
477
478static int btmrvl_sdio_download_fw_w_helper(struct btmrvl_sdio_card *card)
479{
480	const struct firmware *fw_firmware = NULL;
481	const u8 *firmware = NULL;
482	int firmwarelen, tmpfwbufsz, ret;
483	unsigned int tries, offset;
484	u8 base0, base1;
485	void *tmpfwbuf = NULL;
486	u8 *fwbuf;
487	u16 len, blksz_dl = card->sd_blksz_fw_dl;
488	int txlen = 0, tx_blocks = 0, count = 0;
489
490	ret = request_firmware(&fw_firmware, card->firmware,
491							&card->func->dev);
492	if ((ret < 0) || !fw_firmware) {
493		BT_ERR("request_firmware(firmware) failed, error code = %d",
494									ret);
495		ret = -ENOENT;
496		goto done;
497	}
498
499	firmware = fw_firmware->data;
500	firmwarelen = fw_firmware->size;
501
502	BT_DBG("Downloading FW image (%d bytes)", firmwarelen);
503
504	tmpfwbufsz = ALIGN_SZ(BTM_UPLD_SIZE, BTSDIO_DMA_ALIGN);
505	tmpfwbuf = kzalloc(tmpfwbufsz, GFP_KERNEL);
506	if (!tmpfwbuf) {
507		BT_ERR("Unable to allocate buffer for firmware."
508		       " Terminating download");
509		ret = -ENOMEM;
510		goto done;
511	}
512
513	/* Ensure aligned firmware buffer */
514	fwbuf = (u8 *) ALIGN_ADDR(tmpfwbuf, BTSDIO_DMA_ALIGN);
515
516	/* Perform firmware data transfer */
517	offset = 0;
518	do {
519		ret = btmrvl_sdio_poll_card_status(card,
520					CARD_IO_READY | DN_LD_CARD_RDY);
521		if (ret < 0) {
522			BT_ERR("FW download with helper poll status"
523						" timeout @ %d", offset);
524			goto done;
525		}
526
527		/* Check if there is more data ? */
528		if (offset >= firmwarelen)
529			break;
530
531		for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
532			base0 = sdio_readb(card->func,
533					card->reg->sq_read_base_addr_a0, &ret);
534			if (ret) {
535				BT_ERR("BASE0 register read failed:"
536					" base0 = 0x%04X(%d)."
537					" Terminating download",
538					base0, base0);
539				ret = -EIO;
540				goto done;
541			}
542			base1 = sdio_readb(card->func,
543					card->reg->sq_read_base_addr_a1, &ret);
544			if (ret) {
545				BT_ERR("BASE1 register read failed:"
546					" base1 = 0x%04X(%d)."
547					" Terminating download",
548					base1, base1);
549				ret = -EIO;
550				goto done;
551			}
552
553			len = (((u16) base1) << 8) | base0;
554			if (len)
555				break;
556
557			udelay(10);
558		}
559
560		if (!len)
561			break;
562		else if (len > BTM_UPLD_SIZE) {
563			BT_ERR("FW download failure @%d, invalid length %d",
564								offset, len);
565			ret = -EINVAL;
566			goto done;
567		}
568
569		txlen = len;
570
571		if (len & BIT(0)) {
572			count++;
573			if (count > MAX_WRITE_IOMEM_RETRY) {
574				BT_ERR("FW download failure @%d, "
575					"over max retry count", offset);
576				ret = -EIO;
577				goto done;
578			}
579			BT_ERR("FW CRC error indicated by the helper: "
580				"len = 0x%04X, txlen = %d", len, txlen);
581			len &= ~BIT(0);
582			/* Set txlen to 0 so as to resend from same offset */
583			txlen = 0;
584		} else {
585			count = 0;
586
587			/* Last block ? */
588			if (firmwarelen - offset < txlen)
589				txlen = firmwarelen - offset;
590
591			tx_blocks = DIV_ROUND_UP(txlen, blksz_dl);
592
593			memcpy(fwbuf, &firmware[offset], txlen);
594		}
595
596		ret = sdio_writesb(card->func, card->ioport, fwbuf,
597						tx_blocks * blksz_dl);
598
599		if (ret < 0) {
600			BT_ERR("FW download, writesb(%d) failed @%d",
601							count, offset);
602			sdio_writeb(card->func, HOST_CMD53_FIN,
603						card->reg->cfg, &ret);
604			if (ret)
605				BT_ERR("writeb failed (CFG)");
606		}
607
608		offset += txlen;
609	} while (true);
610
611	BT_INFO("FW download over, size %d bytes", offset);
612
613	ret = 0;
614
615done:
616	kfree(tmpfwbuf);
617	release_firmware(fw_firmware);
618	return ret;
619}
620
621static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv)
622{
623	u16 buf_len = 0;
624	int ret, num_blocks, blksz;
625	struct sk_buff *skb = NULL;
626	u32 type;
627	u8 *payload = NULL;
628	struct hci_dev *hdev = priv->btmrvl_dev.hcidev;
629	struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
630
631	if (!card || !card->func) {
632		BT_ERR("card or function is NULL!");
633		ret = -EINVAL;
634		goto exit;
635	}
636
637	/* Read the length of data to be transferred */
638	ret = btmrvl_sdio_read_rx_len(card, &buf_len);
639	if (ret < 0) {
640		BT_ERR("read rx_len failed");
641		ret = -EIO;
642		goto exit;
643	}
644
645	blksz = SDIO_BLOCK_SIZE;
646	num_blocks = DIV_ROUND_UP(buf_len, blksz);
647
648	if (buf_len <= SDIO_HEADER_LEN
649	    || (num_blocks * blksz) > ALLOC_BUF_SIZE) {
650		BT_ERR("invalid packet length: %d", buf_len);
651		ret = -EINVAL;
652		goto exit;
653	}
654
655	/* Allocate buffer */
656	skb = bt_skb_alloc(num_blocks * blksz + BTSDIO_DMA_ALIGN, GFP_ATOMIC);
657	if (!skb) {
658		BT_ERR("No free skb");
659		ret = -ENOMEM;
660		goto exit;
661	}
662
663	if ((unsigned long) skb->data & (BTSDIO_DMA_ALIGN - 1)) {
664		skb_put(skb, (unsigned long) skb->data &
665					(BTSDIO_DMA_ALIGN - 1));
666		skb_pull(skb, (unsigned long) skb->data &
667					(BTSDIO_DMA_ALIGN - 1));
668	}
669
670	payload = skb->data;
671
672	ret = sdio_readsb(card->func, payload, card->ioport,
673			  num_blocks * blksz);
674	if (ret < 0) {
675		BT_ERR("readsb failed: %d", ret);
676		ret = -EIO;
677		goto exit;
678	}
679
680	/* This is SDIO specific header length: byte[2][1][0], type: byte[3]
681	 * (HCI_COMMAND = 1, ACL_DATA = 2, SCO_DATA = 3, 0xFE = Vendor)
682	 */
683
684	buf_len = payload[0];
685	buf_len |= payload[1] << 8;
686	buf_len |= payload[2] << 16;
687
688	if (buf_len > blksz * num_blocks) {
689		BT_ERR("Skip incorrect packet: hdrlen %d buffer %d",
690		       buf_len, blksz * num_blocks);
691		ret = -EIO;
692		goto exit;
693	}
694
695	type = payload[3];
696
697	switch (type) {
698	case HCI_ACLDATA_PKT:
699	case HCI_SCODATA_PKT:
700	case HCI_EVENT_PKT:
701		bt_cb(skb)->pkt_type = type;
702		skb_put(skb, buf_len);
703		skb_pull(skb, SDIO_HEADER_LEN);
704
705		if (type == HCI_EVENT_PKT) {
706			if (btmrvl_check_evtpkt(priv, skb))
707				hci_recv_frame(hdev, skb);
708		} else {
709			hci_recv_frame(hdev, skb);
710		}
711
712		hdev->stat.byte_rx += buf_len;
713		break;
714
715	case MRVL_VENDOR_PKT:
716		bt_cb(skb)->pkt_type = HCI_VENDOR_PKT;
717		skb_put(skb, buf_len);
718		skb_pull(skb, SDIO_HEADER_LEN);
719
720		if (btmrvl_process_event(priv, skb))
721			hci_recv_frame(hdev, skb);
722
723		hdev->stat.byte_rx += buf_len;
724		break;
725
726	default:
727		BT_ERR("Unknown packet type:%d", type);
728		BT_ERR("hex: %*ph", blksz * num_blocks, payload);
729
730		kfree_skb(skb);
731		skb = NULL;
732		break;
733	}
734
735exit:
736	if (ret) {
737		hdev->stat.err_rx++;
738		kfree_skb(skb);
739	}
740
741	return ret;
742}
743
744static int btmrvl_sdio_process_int_status(struct btmrvl_private *priv)
745{
746	ulong flags;
747	u8 ireg;
748	struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
749
750	spin_lock_irqsave(&priv->driver_lock, flags);
751	ireg = sdio_ireg;
752	sdio_ireg = 0;
753	spin_unlock_irqrestore(&priv->driver_lock, flags);
754
755	sdio_claim_host(card->func);
756	if (ireg & DN_LD_HOST_INT_STATUS) {
757		if (priv->btmrvl_dev.tx_dnld_rdy)
758			BT_DBG("tx_done already received: "
759				" int_status=0x%x", ireg);
760		else
761			priv->btmrvl_dev.tx_dnld_rdy = true;
762	}
763
764	if (ireg & UP_LD_HOST_INT_STATUS)
765		btmrvl_sdio_card_to_host(priv);
766
767	sdio_release_host(card->func);
768
769	return 0;
770}
771
772static int btmrvl_sdio_read_to_clear(struct btmrvl_sdio_card *card, u8 *ireg)
773{
774	struct btmrvl_adapter *adapter = card->priv->adapter;
775	int ret;
776
777	ret = sdio_readsb(card->func, adapter->hw_regs, 0, SDIO_BLOCK_SIZE);
778	if (ret) {
779		BT_ERR("sdio_readsb: read int hw_regs failed: %d", ret);
780		return ret;
781	}
782
783	*ireg = adapter->hw_regs[card->reg->host_intstatus];
784	BT_DBG("hw_regs[%#x]=%#x", card->reg->host_intstatus, *ireg);
785
786	return 0;
787}
788
789static int btmrvl_sdio_write_to_clear(struct btmrvl_sdio_card *card, u8 *ireg)
790{
791	int ret;
792
793	*ireg = sdio_readb(card->func, card->reg->host_intstatus, &ret);
794	if (ret) {
795		BT_ERR("sdio_readb: read int status failed: %d", ret);
796		return ret;
797	}
798
799	if (*ireg) {
800		/*
801		 * DN_LD_HOST_INT_STATUS and/or UP_LD_HOST_INT_STATUS
802		 * Clear the interrupt status register and re-enable the
803		 * interrupt.
804		 */
805		BT_DBG("int_status = 0x%x", *ireg);
806
807		sdio_writeb(card->func, ~(*ireg) & (DN_LD_HOST_INT_STATUS |
808						    UP_LD_HOST_INT_STATUS),
809			    card->reg->host_intstatus, &ret);
810		if (ret) {
811			BT_ERR("sdio_writeb: clear int status failed: %d", ret);
812			return ret;
813		}
814	}
815
816	return 0;
817}
818
819static void btmrvl_sdio_interrupt(struct sdio_func *func)
820{
821	struct btmrvl_private *priv;
822	struct btmrvl_sdio_card *card;
823	ulong flags;
824	u8 ireg = 0;
825	int ret;
826
827	card = sdio_get_drvdata(func);
828	if (!card || !card->priv) {
829		BT_ERR("sbi_interrupt(%p) card or priv is NULL, card=%p",
830		       func, card);
831		return;
832	}
833
834	priv = card->priv;
835
836	if (priv->surprise_removed)
837		return;
838
839	if (card->reg->int_read_to_clear)
840		ret = btmrvl_sdio_read_to_clear(card, &ireg);
841	else
842		ret = btmrvl_sdio_write_to_clear(card, &ireg);
843
844	if (ret)
845		return;
846
847	spin_lock_irqsave(&priv->driver_lock, flags);
848	sdio_ireg |= ireg;
849	spin_unlock_irqrestore(&priv->driver_lock, flags);
850
851	btmrvl_interrupt(priv);
852}
853
854static int btmrvl_sdio_register_dev(struct btmrvl_sdio_card *card)
855{
856	struct sdio_func *func;
857	u8 reg;
858	int ret = 0;
859
860	if (!card || !card->func) {
861		BT_ERR("Error: card or function is NULL!");
862		ret = -EINVAL;
863		goto failed;
864	}
865
866	func = card->func;
867
868	sdio_claim_host(func);
869
870	ret = sdio_enable_func(func);
871	if (ret) {
872		BT_ERR("sdio_enable_func() failed: ret=%d", ret);
873		ret = -EIO;
874		goto release_host;
875	}
876
877	ret = sdio_claim_irq(func, btmrvl_sdio_interrupt);
878	if (ret) {
879		BT_ERR("sdio_claim_irq failed: ret=%d", ret);
880		ret = -EIO;
881		goto disable_func;
882	}
883
884	ret = sdio_set_block_size(card->func, SDIO_BLOCK_SIZE);
885	if (ret) {
886		BT_ERR("cannot set SDIO block size");
887		ret = -EIO;
888		goto release_irq;
889	}
890
891	reg = sdio_readb(func, card->reg->io_port_0, &ret);
892	if (ret < 0) {
893		ret = -EIO;
894		goto release_irq;
895	}
896
897	card->ioport = reg;
898
899	reg = sdio_readb(func, card->reg->io_port_1, &ret);
900	if (ret < 0) {
901		ret = -EIO;
902		goto release_irq;
903	}
904
905	card->ioport |= (reg << 8);
906
907	reg = sdio_readb(func, card->reg->io_port_2, &ret);
908	if (ret < 0) {
909		ret = -EIO;
910		goto release_irq;
911	}
912
913	card->ioport |= (reg << 16);
914
915	BT_DBG("SDIO FUNC%d IO port: 0x%x", func->num, card->ioport);
916
917	if (card->reg->int_read_to_clear) {
918		reg = sdio_readb(func, card->reg->host_int_rsr, &ret);
919		if (ret < 0) {
920			ret = -EIO;
921			goto release_irq;
922		}
923		sdio_writeb(func, reg | 0x3f, card->reg->host_int_rsr, &ret);
924		if (ret < 0) {
925			ret = -EIO;
926			goto release_irq;
927		}
928
929		reg = sdio_readb(func, card->reg->card_misc_cfg, &ret);
930		if (ret < 0) {
931			ret = -EIO;
932			goto release_irq;
933		}
934		sdio_writeb(func, reg | 0x10, card->reg->card_misc_cfg, &ret);
935		if (ret < 0) {
936			ret = -EIO;
937			goto release_irq;
938		}
939	}
940
941	sdio_set_drvdata(func, card);
942
943	sdio_release_host(func);
944
945	return 0;
946
947release_irq:
948	sdio_release_irq(func);
949
950disable_func:
951	sdio_disable_func(func);
952
953release_host:
954	sdio_release_host(func);
955
956failed:
957	return ret;
958}
959
960static int btmrvl_sdio_unregister_dev(struct btmrvl_sdio_card *card)
961{
962	if (card && card->func) {
963		sdio_claim_host(card->func);
964		sdio_release_irq(card->func);
965		sdio_disable_func(card->func);
966		sdio_release_host(card->func);
967		sdio_set_drvdata(card->func, NULL);
968	}
969
970	return 0;
971}
972
973static int btmrvl_sdio_enable_host_int(struct btmrvl_sdio_card *card)
974{
975	int ret;
976
977	if (!card || !card->func)
978		return -EINVAL;
979
980	sdio_claim_host(card->func);
981
982	ret = btmrvl_sdio_enable_host_int_mask(card, HIM_ENABLE);
983
984	btmrvl_sdio_get_rx_unit(card);
985
986	sdio_release_host(card->func);
987
988	return ret;
989}
990
991static int btmrvl_sdio_disable_host_int(struct btmrvl_sdio_card *card)
992{
993	int ret;
994
995	if (!card || !card->func)
996		return -EINVAL;
997
998	sdio_claim_host(card->func);
999
1000	ret = btmrvl_sdio_disable_host_int_mask(card, HIM_DISABLE);
1001
1002	sdio_release_host(card->func);
1003
1004	return ret;
1005}
1006
1007static int btmrvl_sdio_host_to_card(struct btmrvl_private *priv,
1008				u8 *payload, u16 nb)
1009{
1010	struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
1011	int ret = 0;
1012	int buf_block_len;
1013	int blksz;
1014	int i = 0;
1015	u8 *buf = NULL;
1016	void *tmpbuf = NULL;
1017	int tmpbufsz;
1018
1019	if (!card || !card->func) {
1020		BT_ERR("card or function is NULL!");
1021		return -EINVAL;
1022	}
1023
1024	buf = payload;
1025	if ((unsigned long) payload & (BTSDIO_DMA_ALIGN - 1)) {
1026		tmpbufsz = ALIGN_SZ(nb, BTSDIO_DMA_ALIGN);
1027		tmpbuf = kzalloc(tmpbufsz, GFP_KERNEL);
1028		if (!tmpbuf)
1029			return -ENOMEM;
1030		buf = (u8 *) ALIGN_ADDR(tmpbuf, BTSDIO_DMA_ALIGN);
1031		memcpy(buf, payload, nb);
1032	}
1033
1034	blksz = SDIO_BLOCK_SIZE;
1035	buf_block_len = DIV_ROUND_UP(nb, blksz);
1036
1037	sdio_claim_host(card->func);
1038
1039	do {
1040		/* Transfer data to card */
1041		ret = sdio_writesb(card->func, card->ioport, buf,
1042				   buf_block_len * blksz);
1043		if (ret < 0) {
1044			i++;
1045			BT_ERR("i=%d writesb failed: %d", i, ret);
1046			BT_ERR("hex: %*ph", nb, payload);
1047			ret = -EIO;
1048			if (i > MAX_WRITE_IOMEM_RETRY)
1049				goto exit;
1050		}
1051	} while (ret);
1052
1053	priv->btmrvl_dev.tx_dnld_rdy = false;
1054
1055exit:
1056	sdio_release_host(card->func);
1057	kfree(tmpbuf);
1058
1059	return ret;
1060}
1061
1062static int btmrvl_sdio_download_fw(struct btmrvl_sdio_card *card)
1063{
1064	int ret;
1065	u8 fws0;
1066	int pollnum = MAX_POLL_TRIES;
1067
1068	if (!card || !card->func) {
1069		BT_ERR("card or function is NULL!");
1070		return -EINVAL;
1071	}
1072
1073	if (!btmrvl_sdio_verify_fw_download(card, 1)) {
1074		BT_DBG("Firmware already downloaded!");
1075		return 0;
1076	}
1077
1078	sdio_claim_host(card->func);
1079
1080	/* Check if other function driver is downloading the firmware */
1081	fws0 = sdio_readb(card->func, card->reg->card_fw_status0, &ret);
1082	if (ret) {
1083		BT_ERR("Failed to read FW downloading status!");
1084		ret = -EIO;
1085		goto done;
1086	}
1087	if (fws0) {
1088		BT_DBG("BT not the winner (%#x). Skip FW downloading", fws0);
1089
1090		/* Give other function more time to download the firmware */
1091		pollnum *= 10;
1092	} else {
1093		if (card->helper) {
1094			ret = btmrvl_sdio_download_helper(card);
1095			if (ret) {
1096				BT_ERR("Failed to download helper!");
1097				ret = -EIO;
1098				goto done;
1099			}
1100		}
1101
1102		if (btmrvl_sdio_download_fw_w_helper(card)) {
1103			BT_ERR("Failed to download firmware!");
1104			ret = -EIO;
1105			goto done;
1106		}
1107	}
1108
1109	/*
1110	 * winner or not, with this test the FW synchronizes when the
1111	 * module can continue its initialization
1112	 */
1113	if (btmrvl_sdio_verify_fw_download(card, pollnum)) {
1114		BT_ERR("FW failed to be active in time!");
1115		return -ETIMEDOUT;
1116	}
1117
1118	sdio_release_host(card->func);
1119
1120	return 0;
1121
1122done:
1123	sdio_release_host(card->func);
1124	return ret;
1125}
1126
1127static int btmrvl_sdio_wakeup_fw(struct btmrvl_private *priv)
1128{
1129	struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
1130	int ret = 0;
1131
1132	if (!card || !card->func) {
1133		BT_ERR("card or function is NULL!");
1134		return -EINVAL;
1135	}
1136
1137	sdio_claim_host(card->func);
1138
1139	sdio_writeb(card->func, HOST_POWER_UP, card->reg->cfg, &ret);
1140
1141	sdio_release_host(card->func);
1142
1143	BT_DBG("wake up firmware");
1144
1145	return ret;
1146}
1147
1148static void btmrvl_sdio_dump_regs(struct btmrvl_private *priv)
1149{
1150	struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
1151	int ret = 0;
1152	unsigned int reg, reg_start, reg_end;
1153	char buf[256], *ptr;
1154	u8 loop, func, data;
1155	int MAX_LOOP = 2;
1156
1157	btmrvl_sdio_wakeup_fw(priv);
1158	sdio_claim_host(card->func);
1159
1160	for (loop = 0; loop < MAX_LOOP; loop++) {
1161		memset(buf, 0, sizeof(buf));
1162		ptr = buf;
1163
1164		if (loop == 0) {
1165			/* Read the registers of SDIO function0 */
1166			func = loop;
1167			reg_start = 0;
1168			reg_end = 9;
1169		} else {
1170			func = 2;
1171			reg_start = 0;
1172			reg_end = 0x09;
1173		}
1174
1175		ptr += sprintf(ptr, "SDIO Func%d (%#x-%#x): ",
1176			       func, reg_start, reg_end);
1177		for (reg = reg_start; reg <= reg_end; reg++) {
1178			if (func == 0)
1179				data = sdio_f0_readb(card->func, reg, &ret);
1180			else
1181				data = sdio_readb(card->func, reg, &ret);
1182
1183			if (!ret) {
1184				ptr += sprintf(ptr, "%02x ", data);
1185			} else {
1186				ptr += sprintf(ptr, "ERR");
1187				break;
1188			}
1189		}
1190
1191		BT_INFO("%s", buf);
1192	}
1193
1194	sdio_release_host(card->func);
1195}
1196
1197/* This function read/write firmware */
1198static enum
1199rdwr_status btmrvl_sdio_rdwr_firmware(struct btmrvl_private *priv,
1200				      u8 doneflag)
1201{
1202	struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
1203	int ret, tries;
1204	u8 ctrl_data = 0;
1205
1206	sdio_writeb(card->func, FW_DUMP_HOST_READY, card->reg->fw_dump_ctrl,
1207		    &ret);
1208
1209	if (ret) {
1210		BT_ERR("SDIO write err");
1211		return RDWR_STATUS_FAILURE;
1212	}
1213
1214	for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
1215		ctrl_data = sdio_readb(card->func, card->reg->fw_dump_ctrl,
1216				       &ret);
1217
1218		if (ret) {
1219			BT_ERR("SDIO read err");
1220			return RDWR_STATUS_FAILURE;
1221		}
1222
1223		if (ctrl_data == FW_DUMP_DONE)
1224			break;
1225		if (doneflag && ctrl_data == doneflag)
1226			return RDWR_STATUS_DONE;
1227		if (ctrl_data != FW_DUMP_HOST_READY) {
1228			BT_INFO("The ctrl reg was changed, re-try again!");
1229			sdio_writeb(card->func, FW_DUMP_HOST_READY,
1230				    card->reg->fw_dump_ctrl, &ret);
1231			if (ret) {
1232				BT_ERR("SDIO write err");
1233				return RDWR_STATUS_FAILURE;
1234			}
1235		}
1236		usleep_range(100, 200);
1237	}
1238
1239	if (ctrl_data == FW_DUMP_HOST_READY) {
1240		BT_ERR("Fail to pull ctrl_data");
1241		return RDWR_STATUS_FAILURE;
1242	}
1243
1244	return RDWR_STATUS_SUCCESS;
1245}
1246
1247/* This function dump sdio register and memory data */
1248static void btmrvl_sdio_dump_firmware(struct btmrvl_private *priv)
1249{
1250	struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
1251	int ret = 0;
1252	unsigned int reg, reg_start, reg_end;
1253	enum rdwr_status stat;
1254	u8 *dbg_ptr, *end_ptr, *fw_dump_data, *fw_dump_ptr;
1255	u8 dump_num = 0, idx, i, read_reg, doneflag = 0;
1256	u32 memory_size, fw_dump_len = 0;
1257
1258	/* dump sdio register first */
1259	btmrvl_sdio_dump_regs(priv);
1260
1261	if (!card->supports_fw_dump) {
1262		BT_ERR("Firmware dump not supported for this card!");
1263		return;
1264	}
1265
1266	for (idx = 0; idx < ARRAY_SIZE(mem_type_mapping_tbl); idx++) {
1267		struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
1268
1269		if (entry->mem_ptr) {
1270			vfree(entry->mem_ptr);
1271			entry->mem_ptr = NULL;
1272		}
1273		entry->mem_size = 0;
1274	}
1275
1276	btmrvl_sdio_wakeup_fw(priv);
1277	sdio_claim_host(card->func);
1278
1279	BT_INFO("== btmrvl firmware dump start ==");
1280
1281	stat = btmrvl_sdio_rdwr_firmware(priv, doneflag);
1282	if (stat == RDWR_STATUS_FAILURE)
1283		goto done;
1284
1285	reg = card->reg->fw_dump_start;
1286	/* Read the number of the memories which will dump */
1287	dump_num = sdio_readb(card->func, reg, &ret);
1288
1289	if (ret) {
1290		BT_ERR("SDIO read memory length err");
1291		goto done;
1292	}
1293
1294	/* Read the length of every memory which will dump */
1295	for (idx = 0; idx < dump_num; idx++) {
1296		struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
1297
1298		stat = btmrvl_sdio_rdwr_firmware(priv, doneflag);
1299		if (stat == RDWR_STATUS_FAILURE)
1300			goto done;
1301
1302		memory_size = 0;
1303		reg = card->reg->fw_dump_start;
1304		for (i = 0; i < 4; i++) {
1305			read_reg = sdio_readb(card->func, reg, &ret);
1306			if (ret) {
1307				BT_ERR("SDIO read err");
1308				goto done;
1309			}
1310			memory_size |= (read_reg << i*8);
1311			reg++;
1312		}
1313
1314		if (memory_size == 0) {
1315			BT_INFO("Firmware dump finished!");
1316			sdio_writeb(card->func, FW_DUMP_READ_DONE,
1317				    card->reg->fw_dump_ctrl, &ret);
1318			if (ret) {
1319				BT_ERR("SDIO Write MEMDUMP_FINISH ERR");
1320				goto done;
1321			}
1322			break;
1323		}
1324
1325		BT_INFO("%s_SIZE=0x%x", entry->mem_name, memory_size);
1326		entry->mem_ptr = vzalloc(memory_size + 1);
1327		entry->mem_size = memory_size;
1328		if (!entry->mem_ptr) {
1329			BT_ERR("Vzalloc %s failed", entry->mem_name);
1330			goto done;
1331		}
1332
1333		fw_dump_len += (strlen("========Start dump ") +
1334				strlen(entry->mem_name) +
1335				strlen("========\n") +
1336				(memory_size + 1) +
1337				strlen("\n========End dump========\n"));
1338
1339		dbg_ptr = entry->mem_ptr;
1340		end_ptr = dbg_ptr + memory_size;
1341
1342		doneflag = entry->done_flag;
1343		BT_INFO("Start %s output, please wait...",
1344			entry->mem_name);
1345
1346		do {
1347			stat = btmrvl_sdio_rdwr_firmware(priv, doneflag);
1348			if (stat == RDWR_STATUS_FAILURE)
1349				goto done;
1350
1351			reg_start = card->reg->fw_dump_start;
1352			reg_end = card->reg->fw_dump_end;
1353			for (reg = reg_start; reg <= reg_end; reg++) {
1354				*dbg_ptr = sdio_readb(card->func, reg, &ret);
1355				if (ret) {
1356					BT_ERR("SDIO read err");
1357					goto done;
1358				}
1359				if (dbg_ptr < end_ptr)
1360					dbg_ptr++;
1361				else
1362					BT_ERR("Allocated buffer not enough");
1363			}
1364
1365			if (stat != RDWR_STATUS_DONE) {
1366				continue;
1367			} else {
1368				BT_INFO("%s done: size=0x%tx",
1369					entry->mem_name,
1370					dbg_ptr - entry->mem_ptr);
1371				break;
1372			}
1373		} while (1);
1374	}
1375
1376	BT_INFO("== btmrvl firmware dump end ==");
1377
1378done:
1379	sdio_release_host(card->func);
1380
1381	if (fw_dump_len == 0)
1382		return;
1383
1384	fw_dump_data = vzalloc(fw_dump_len+1);
1385	if (!fw_dump_data) {
1386		BT_ERR("Vzalloc fw_dump_data fail!");
1387		return;
1388	}
1389	fw_dump_ptr = fw_dump_data;
1390
1391	/* Dump all the memory data into single file, a userspace script will
1392	   be used to split all the memory data to multiple files*/
1393	BT_INFO("== btmrvl firmware dump to /sys/class/devcoredump start");
1394	for (idx = 0; idx < dump_num; idx++) {
1395		struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
1396
1397		if (entry->mem_ptr) {
1398			strcpy(fw_dump_ptr, "========Start dump ");
1399			fw_dump_ptr += strlen("========Start dump ");
1400
1401			strcpy(fw_dump_ptr, entry->mem_name);
1402			fw_dump_ptr += strlen(entry->mem_name);
1403
1404			strcpy(fw_dump_ptr, "========\n");
1405			fw_dump_ptr += strlen("========\n");
1406
1407			memcpy(fw_dump_ptr, entry->mem_ptr, entry->mem_size);
1408			fw_dump_ptr += entry->mem_size;
1409
1410			strcpy(fw_dump_ptr, "\n========End dump========\n");
1411			fw_dump_ptr += strlen("\n========End dump========\n");
1412
1413			vfree(mem_type_mapping_tbl[idx].mem_ptr);
1414			mem_type_mapping_tbl[idx].mem_ptr = NULL;
1415		}
1416	}
1417
1418	/* fw_dump_data will be free in device coredump release function
1419	   after 5 min*/
1420	dev_coredumpv(&card->func->dev, fw_dump_data, fw_dump_len, GFP_KERNEL);
1421	BT_INFO("== btmrvl firmware dump to /sys/class/devcoredump end");
1422}
1423
1424static int btmrvl_sdio_probe(struct sdio_func *func,
1425					const struct sdio_device_id *id)
1426{
1427	int ret = 0;
1428	struct btmrvl_private *priv = NULL;
1429	struct btmrvl_sdio_card *card = NULL;
1430
1431	BT_INFO("vendor=0x%x, device=0x%x, class=%d, fn=%d",
1432			id->vendor, id->device, id->class, func->num);
1433
1434	card = devm_kzalloc(&func->dev, sizeof(*card), GFP_KERNEL);
1435	if (!card)
1436		return -ENOMEM;
1437
1438	card->func = func;
1439
1440	if (id->driver_data) {
1441		struct btmrvl_sdio_device *data = (void *) id->driver_data;
1442		card->helper = data->helper;
1443		card->firmware = data->firmware;
1444		card->reg = data->reg;
1445		card->sd_blksz_fw_dl = data->sd_blksz_fw_dl;
1446		card->support_pscan_win_report = data->support_pscan_win_report;
1447		card->supports_fw_dump = data->supports_fw_dump;
1448	}
1449
1450	if (btmrvl_sdio_register_dev(card) < 0) {
1451		BT_ERR("Failed to register BT device!");
1452		return -ENODEV;
1453	}
1454
1455	/* Disable the interrupts on the card */
1456	btmrvl_sdio_disable_host_int(card);
1457
1458	if (btmrvl_sdio_download_fw(card)) {
1459		BT_ERR("Downloading firmware failed!");
1460		ret = -ENODEV;
1461		goto unreg_dev;
1462	}
1463
1464	btmrvl_sdio_enable_host_int(card);
1465
1466	priv = btmrvl_add_card(card);
1467	if (!priv) {
1468		BT_ERR("Initializing card failed!");
1469		ret = -ENODEV;
1470		goto disable_host_int;
1471	}
1472
1473	card->priv = priv;
1474
1475	/* Initialize the interface specific function pointers */
1476	priv->hw_host_to_card = btmrvl_sdio_host_to_card;
1477	priv->hw_wakeup_firmware = btmrvl_sdio_wakeup_fw;
1478	priv->hw_process_int_status = btmrvl_sdio_process_int_status;
1479	priv->firmware_dump = btmrvl_sdio_dump_firmware;
1480
1481	if (btmrvl_register_hdev(priv)) {
1482		BT_ERR("Register hdev failed!");
1483		ret = -ENODEV;
1484		goto disable_host_int;
1485	}
1486
1487	return 0;
1488
1489disable_host_int:
1490	btmrvl_sdio_disable_host_int(card);
1491unreg_dev:
1492	btmrvl_sdio_unregister_dev(card);
1493	return ret;
1494}
1495
1496static void btmrvl_sdio_remove(struct sdio_func *func)
1497{
1498	struct btmrvl_sdio_card *card;
1499
1500	if (func) {
1501		card = sdio_get_drvdata(func);
1502		if (card) {
1503			/* Send SHUTDOWN command & disable interrupt
1504			 * if user removes the module.
1505			 */
1506			if (user_rmmod) {
1507				btmrvl_send_module_cfg_cmd(card->priv,
1508							MODULE_SHUTDOWN_REQ);
1509				btmrvl_sdio_disable_host_int(card);
1510			}
1511			BT_DBG("unregester dev");
1512			card->priv->surprise_removed = true;
1513			btmrvl_sdio_unregister_dev(card);
1514			btmrvl_remove_card(card->priv);
1515		}
1516	}
1517}
1518
1519static int btmrvl_sdio_suspend(struct device *dev)
1520{
1521	struct sdio_func *func = dev_to_sdio_func(dev);
1522	struct btmrvl_sdio_card *card;
1523	struct btmrvl_private *priv;
1524	mmc_pm_flag_t pm_flags;
1525	struct hci_dev *hcidev;
1526
1527	if (func) {
1528		pm_flags = sdio_get_host_pm_caps(func);
1529		BT_DBG("%s: suspend: PM flags = 0x%x", sdio_func_id(func),
1530		       pm_flags);
1531		if (!(pm_flags & MMC_PM_KEEP_POWER)) {
1532			BT_ERR("%s: cannot remain alive while suspended",
1533			       sdio_func_id(func));
1534			return -ENOSYS;
1535		}
1536		card = sdio_get_drvdata(func);
1537		if (!card || !card->priv) {
1538			BT_ERR("card or priv structure is not valid");
1539			return 0;
1540		}
1541	} else {
1542		BT_ERR("sdio_func is not specified");
1543		return 0;
1544	}
1545
1546	priv = card->priv;
1547	hcidev = priv->btmrvl_dev.hcidev;
1548	BT_DBG("%s: SDIO suspend", hcidev->name);
1549	hci_suspend_dev(hcidev);
1550	skb_queue_purge(&priv->adapter->tx_queue);
1551
1552	if (priv->adapter->hs_state != HS_ACTIVATED) {
1553		if (btmrvl_enable_hs(priv)) {
1554			BT_ERR("HS not actived, suspend failed!");
1555			return -EBUSY;
1556		}
1557	}
1558
1559	priv->adapter->is_suspended = true;
1560
1561	/* We will keep the power when hs enabled successfully */
1562	if (priv->adapter->hs_state == HS_ACTIVATED) {
1563		BT_DBG("suspend with MMC_PM_KEEP_POWER");
1564		return sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
1565	} else {
1566		BT_DBG("suspend without MMC_PM_KEEP_POWER");
1567		return 0;
1568	}
1569}
1570
1571static int btmrvl_sdio_resume(struct device *dev)
1572{
1573	struct sdio_func *func = dev_to_sdio_func(dev);
1574	struct btmrvl_sdio_card *card;
1575	struct btmrvl_private *priv;
1576	mmc_pm_flag_t pm_flags;
1577	struct hci_dev *hcidev;
1578
1579	if (func) {
1580		pm_flags = sdio_get_host_pm_caps(func);
1581		BT_DBG("%s: resume: PM flags = 0x%x", sdio_func_id(func),
1582		       pm_flags);
1583		card = sdio_get_drvdata(func);
1584		if (!card || !card->priv) {
1585			BT_ERR("card or priv structure is not valid");
1586			return 0;
1587		}
1588	} else {
1589		BT_ERR("sdio_func is not specified");
1590		return 0;
1591	}
1592	priv = card->priv;
1593
1594	if (!priv->adapter->is_suspended) {
1595		BT_DBG("device already resumed");
1596		return 0;
1597	}
1598
1599	priv->hw_wakeup_firmware(priv);
1600	priv->adapter->hs_state = HS_DEACTIVATED;
1601	hcidev = priv->btmrvl_dev.hcidev;
1602	BT_DBG("%s: HS DEACTIVATED in resume!", hcidev->name);
1603	priv->adapter->is_suspended = false;
1604	BT_DBG("%s: SDIO resume", hcidev->name);
1605	hci_resume_dev(hcidev);
1606
1607	return 0;
1608}
1609
1610static const struct dev_pm_ops btmrvl_sdio_pm_ops = {
1611	.suspend	= btmrvl_sdio_suspend,
1612	.resume		= btmrvl_sdio_resume,
1613};
1614
1615static struct sdio_driver bt_mrvl_sdio = {
1616	.name		= "btmrvl_sdio",
1617	.id_table	= btmrvl_sdio_ids,
1618	.probe		= btmrvl_sdio_probe,
1619	.remove		= btmrvl_sdio_remove,
1620	.drv = {
1621		.owner = THIS_MODULE,
1622		.pm = &btmrvl_sdio_pm_ops,
1623	}
1624};
1625
1626static int __init btmrvl_sdio_init_module(void)
1627{
1628	if (sdio_register_driver(&bt_mrvl_sdio) != 0) {
1629		BT_ERR("SDIO Driver Registration Failed");
1630		return -ENODEV;
1631	}
1632
1633	/* Clear the flag in case user removes the card. */
1634	user_rmmod = 0;
1635
1636	return 0;
1637}
1638
1639static void __exit btmrvl_sdio_exit_module(void)
1640{
1641	/* Set the flag as user is removing this module. */
1642	user_rmmod = 1;
1643
1644	sdio_unregister_driver(&bt_mrvl_sdio);
1645}
1646
1647module_init(btmrvl_sdio_init_module);
1648module_exit(btmrvl_sdio_exit_module);
1649
1650MODULE_AUTHOR("Marvell International Ltd.");
1651MODULE_DESCRIPTION("Marvell BT-over-SDIO driver ver " VERSION);
1652MODULE_VERSION(VERSION);
1653MODULE_LICENSE("GPL v2");
1654MODULE_FIRMWARE("mrvl/sd8688_helper.bin");
1655MODULE_FIRMWARE("mrvl/sd8688.bin");
1656MODULE_FIRMWARE("mrvl/sd8787_uapsta.bin");
1657MODULE_FIRMWARE("mrvl/sd8797_uapsta.bin");
1658MODULE_FIRMWARE("mrvl/sd8887_uapsta.bin");
1659MODULE_FIRMWARE("mrvl/sd8897_uapsta.bin");
1660MODULE_FIRMWARE("mrvl/sd8997_uapsta.bin");
1661