linux/drivers/bluetooth/btmrvl_sdio.c
<<
>>
Prefs
   1/**
   2 * Marvell BT-over-SDIO driver: SDIO interface related functions.
   3 *
   4 * Copyright (C) 2009, Marvell International Ltd.
   5 *
   6 * This software file (the "File") is distributed by Marvell International
   7 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
   8 * (the "License").  You may use, redistribute and/or modify this File in
   9 * accordance with the terms and conditions of the License, a copy of which
  10 * is available by writing to the Free Software Foundation, Inc.,
  11 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
  12 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
  13 *
  14 *
  15 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
  16 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
  17 * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
  18 * this warranty disclaimer.
  19 **/
  20
  21#include <linux/firmware.h>
  22#include <linux/slab.h>
  23
  24#include <linux/mmc/sdio_ids.h>
  25#include <linux/mmc/sdio_func.h>
  26#include <linux/module.h>
  27#include <linux/devcoredump.h>
  28
  29#include <net/bluetooth/bluetooth.h>
  30#include <net/bluetooth/hci_core.h>
  31
  32#include "btmrvl_drv.h"
  33#include "btmrvl_sdio.h"
  34
  35#define VERSION "1.0"
  36
  37static struct memory_type_mapping mem_type_mapping_tbl[] = {
  38        {"ITCM", NULL, 0, 0xF0},
  39        {"DTCM", NULL, 0, 0xF1},
  40        {"SQRAM", NULL, 0, 0xF2},
  41        {"APU", NULL, 0, 0xF3},
  42        {"CIU", NULL, 0, 0xF4},
  43        {"ICU", NULL, 0, 0xF5},
  44        {"MAC", NULL, 0, 0xF6},
  45        {"EXT7", NULL, 0, 0xF7},
  46        {"EXT8", NULL, 0, 0xF8},
  47        {"EXT9", NULL, 0, 0xF9},
  48        {"EXT10", NULL, 0, 0xFA},
  49        {"EXT11", NULL, 0, 0xFB},
  50        {"EXT12", NULL, 0, 0xFC},
  51        {"EXT13", NULL, 0, 0xFD},
  52        {"EXTLAST", NULL, 0, 0xFE},
  53};
  54
  55static const struct of_device_id btmrvl_sdio_of_match_table[] = {
  56        { .compatible = "marvell,sd8897-bt" },
  57        { .compatible = "marvell,sd8997-bt" },
  58        { }
  59};
  60
  61static 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 */
  79static 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 */
 131static u8 user_rmmod;
 132static u8 sdio_ireg;
 133
 134static 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};
 150static 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
 168static 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
 188static 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
 211static 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
 234static 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
 243static 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
 252static 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
 261static 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
 270static 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
 279static 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
 288static 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
 314MODULE_DEVICE_TABLE(sdio, btmrvl_sdio_ids);
 315
 316static 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
 328static 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
 348static 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
 360static 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
 374static 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
 395static 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
 413failed:
 414        BT_ERR("FAILED! ret=%d", ret);
 415
 416        return ret;
 417}
 418
 419static 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
 442static 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
 534done:
 535        kfree(tmphlprbuf);
 536        release_firmware(fw_helper);
 537        return ret;
 538}
 539
 540static 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
 677done:
 678        kfree(tmpfwbuf);
 679        release_firmware(fw_firmware);
 680        return ret;
 681}
 682
 683static 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
 797exit:
 798        if (ret) {
 799                hdev->stat.err_rx++;
 800                kfree_skb(skb);
 801        }
 802
 803        return ret;
 804}
 805
 806static 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
 834static 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
 851static 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
 881static 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
 916static 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
1009release_irq:
1010        sdio_release_irq(func);
1011
1012disable_func:
1013        sdio_disable_func(func);
1014
1015release_host:
1016        sdio_release_host(func);
1017
1018failed:
1019        return ret;
1020}
1021
1022static 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
1035static 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
1053static 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
1069static 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
1117exit:
1118        sdio_release_host(card->func);
1119        kfree(tmpbuf);
1120
1121        return ret;
1122}
1123
1124static 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
1185done:
1186        sdio_release_host(card->func);
1187        return ret;
1188}
1189
1190static 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
1211static 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 */
1261static enum
1262rdwr_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 */
1311static 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
1441done:
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
1487static 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
1555disable_host_int:
1556        btmrvl_sdio_disable_host_int(card);
1557unreg_dev:
1558        btmrvl_sdio_unregister_dev(card);
1559        return ret;
1560}
1561
1562static 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
1585static 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
1646static 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
1692static const struct dev_pm_ops btmrvl_sdio_pm_ops = {
1693        .suspend        = btmrvl_sdio_suspend,
1694        .resume         = btmrvl_sdio_resume,
1695};
1696
1697static 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
1708static 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
1721static 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
1729module_init(btmrvl_sdio_init_module);
1730module_exit(btmrvl_sdio_exit_module);
1731
1732MODULE_AUTHOR("Marvell International Ltd.");
1733MODULE_DESCRIPTION("Marvell BT-over-SDIO driver ver " VERSION);
1734MODULE_VERSION(VERSION);
1735MODULE_LICENSE("GPL v2");
1736MODULE_FIRMWARE("mrvl/sd8688_helper.bin");
1737MODULE_FIRMWARE("mrvl/sd8688.bin");
1738MODULE_FIRMWARE("mrvl/sd8787_uapsta.bin");
1739MODULE_FIRMWARE("mrvl/sd8797_uapsta.bin");
1740MODULE_FIRMWARE("mrvl/sd8887_uapsta.bin");
1741MODULE_FIRMWARE("mrvl/sd8897_uapsta.bin");
1742MODULE_FIRMWARE("mrvl/sd8997_uapsta.bin");
1743