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