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