Version:  2.0.40 2.2.26 2.4.37 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8

Linux/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");
1743 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us