1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * NXP Wireless LAN device driver: PCIE specific handling 4 * 5 * Copyright 2011-2020 NXP 6 */ 7 8 #include <linux/iopoll.h> 9 #include <linux/firmware.h> 10 11 #include "decl.h" 12 #include "ioctl.h" 13 #include "util.h" 14 #include "fw.h" 15 #include "main.h" 16 #include "wmm.h" 17 #include "11n.h" 18 #include "pcie.h" 19 #include "pcie_quirks.h" 20 21 #define PCIE_VERSION "1.0" 22 #define DRV_NAME "Marvell mwifiex PCIe" 23 24 static struct mwifiex_if_ops pcie_ops; 25 26 static const struct mwifiex_pcie_card_reg mwifiex_reg_8766 = { 27 .cmd_addr_lo = PCIE_SCRATCH_0_REG, 28 .cmd_addr_hi = PCIE_SCRATCH_1_REG, 29 .cmd_size = PCIE_SCRATCH_2_REG, 30 .fw_status = PCIE_SCRATCH_3_REG, 31 .cmdrsp_addr_lo = PCIE_SCRATCH_4_REG, 32 .cmdrsp_addr_hi = PCIE_SCRATCH_5_REG, 33 .tx_rdptr = PCIE_SCRATCH_6_REG, 34 .tx_wrptr = PCIE_SCRATCH_7_REG, 35 .rx_rdptr = PCIE_SCRATCH_8_REG, 36 .rx_wrptr = PCIE_SCRATCH_9_REG, 37 .evt_rdptr = PCIE_SCRATCH_10_REG, 38 .evt_wrptr = PCIE_SCRATCH_11_REG, 39 .drv_rdy = PCIE_SCRATCH_12_REG, 40 .tx_start_ptr = 0, 41 .tx_mask = MWIFIEX_TXBD_MASK, 42 .tx_wrap_mask = 0, 43 .rx_mask = MWIFIEX_RXBD_MASK, 44 .rx_wrap_mask = 0, 45 .tx_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND, 46 .rx_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND, 47 .evt_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND, 48 .ring_flag_sop = 0, 49 .ring_flag_eop = 0, 50 .ring_flag_xs_sop = 0, 51 .ring_flag_xs_eop = 0, 52 .ring_tx_start_ptr = 0, 53 .pfu_enabled = 0, 54 .sleep_cookie = 1, 55 .msix_support = 0, 56 }; 57 58 static const struct mwifiex_pcie_card_reg mwifiex_reg_8897 = { 59 .cmd_addr_lo = PCIE_SCRATCH_0_REG, 60 .cmd_addr_hi = PCIE_SCRATCH_1_REG, 61 .cmd_size = PCIE_SCRATCH_2_REG, 62 .fw_status = PCIE_SCRATCH_3_REG, 63 .cmdrsp_addr_lo = PCIE_SCRATCH_4_REG, 64 .cmdrsp_addr_hi = PCIE_SCRATCH_5_REG, 65 .tx_rdptr = PCIE_RD_DATA_PTR_Q0_Q1, 66 .tx_wrptr = PCIE_WR_DATA_PTR_Q0_Q1, 67 .rx_rdptr = PCIE_WR_DATA_PTR_Q0_Q1, 68 .rx_wrptr = PCIE_RD_DATA_PTR_Q0_Q1, 69 .evt_rdptr = PCIE_SCRATCH_10_REG, 70 .evt_wrptr = PCIE_SCRATCH_11_REG, 71 .drv_rdy = PCIE_SCRATCH_12_REG, 72 .tx_start_ptr = 16, 73 .tx_mask = 0x03FF0000, 74 .tx_wrap_mask = 0x07FF0000, 75 .rx_mask = 0x000003FF, 76 .rx_wrap_mask = 0x000007FF, 77 .tx_rollover_ind = MWIFIEX_BD_FLAG_TX_ROLLOVER_IND, 78 .rx_rollover_ind = MWIFIEX_BD_FLAG_RX_ROLLOVER_IND, 79 .evt_rollover_ind = MWIFIEX_BD_FLAG_EVT_ROLLOVER_IND, 80 .ring_flag_sop = MWIFIEX_BD_FLAG_SOP, 81 .ring_flag_eop = MWIFIEX_BD_FLAG_EOP, 82 .ring_flag_xs_sop = MWIFIEX_BD_FLAG_XS_SOP, 83 .ring_flag_xs_eop = MWIFIEX_BD_FLAG_XS_EOP, 84 .ring_tx_start_ptr = MWIFIEX_BD_FLAG_TX_START_PTR, 85 .pfu_enabled = 1, 86 .sleep_cookie = 0, 87 .fw_dump_ctrl = PCIE_SCRATCH_13_REG, 88 .fw_dump_start = PCIE_SCRATCH_14_REG, 89 .fw_dump_end = 0xcff, 90 .fw_dump_host_ready = 0xee, 91 .fw_dump_read_done = 0xfe, 92 .msix_support = 0, 93 }; 94 95 static const struct mwifiex_pcie_card_reg mwifiex_reg_8997 = { 96 .cmd_addr_lo = PCIE_SCRATCH_0_REG, 97 .cmd_addr_hi = PCIE_SCRATCH_1_REG, 98 .cmd_size = PCIE_SCRATCH_2_REG, 99 .fw_status = PCIE_SCRATCH_3_REG, 100 .cmdrsp_addr_lo = PCIE_SCRATCH_4_REG, 101 .cmdrsp_addr_hi = PCIE_SCRATCH_5_REG, 102 .tx_rdptr = 0xC1A4, 103 .tx_wrptr = 0xC174, 104 .rx_rdptr = 0xC174, 105 .rx_wrptr = 0xC1A4, 106 .evt_rdptr = PCIE_SCRATCH_10_REG, 107 .evt_wrptr = PCIE_SCRATCH_11_REG, 108 .drv_rdy = PCIE_SCRATCH_12_REG, 109 .tx_start_ptr = 16, 110 .tx_mask = 0x0FFF0000, 111 .tx_wrap_mask = 0x1FFF0000, 112 .rx_mask = 0x00000FFF, 113 .rx_wrap_mask = 0x00001FFF, 114 .tx_rollover_ind = BIT(28), 115 .rx_rollover_ind = BIT(12), 116 .evt_rollover_ind = MWIFIEX_BD_FLAG_EVT_ROLLOVER_IND, 117 .ring_flag_sop = MWIFIEX_BD_FLAG_SOP, 118 .ring_flag_eop = MWIFIEX_BD_FLAG_EOP, 119 .ring_flag_xs_sop = MWIFIEX_BD_FLAG_XS_SOP, 120 .ring_flag_xs_eop = MWIFIEX_BD_FLAG_XS_EOP, 121 .ring_tx_start_ptr = MWIFIEX_BD_FLAG_TX_START_PTR, 122 .pfu_enabled = 1, 123 .sleep_cookie = 0, 124 .fw_dump_ctrl = PCIE_SCRATCH_13_REG, 125 .fw_dump_start = PCIE_SCRATCH_14_REG, 126 .fw_dump_end = 0xcff, 127 .fw_dump_host_ready = 0xcc, 128 .fw_dump_read_done = 0xdd, 129 .msix_support = 0, 130 }; 131 132 static struct memory_type_mapping mem_type_mapping_tbl_w8897[] = { 133 {"ITCM", NULL, 0, 0xF0}, 134 {"DTCM", NULL, 0, 0xF1}, 135 {"SQRAM", NULL, 0, 0xF2}, 136 {"IRAM", NULL, 0, 0xF3}, 137 {"APU", NULL, 0, 0xF4}, 138 {"CIU", NULL, 0, 0xF5}, 139 {"ICU", NULL, 0, 0xF6}, 140 {"MAC", NULL, 0, 0xF7}, 141 }; 142 143 static struct memory_type_mapping mem_type_mapping_tbl_w8997[] = { 144 {"DUMP", NULL, 0, 0xDD}, 145 }; 146 147 static const struct mwifiex_pcie_device mwifiex_pcie8766 = { 148 .reg = &mwifiex_reg_8766, 149 .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD, 150 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K, 151 .can_dump_fw = false, 152 .can_ext_scan = true, 153 }; 154 155 static const struct mwifiex_pcie_device mwifiex_pcie8897 = { 156 .reg = &mwifiex_reg_8897, 157 .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD, 158 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K, 159 .can_dump_fw = true, 160 .mem_type_mapping_tbl = mem_type_mapping_tbl_w8897, 161 .num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl_w8897), 162 .can_ext_scan = true, 163 }; 164 165 static const struct mwifiex_pcie_device mwifiex_pcie8997 = { 166 .reg = &mwifiex_reg_8997, 167 .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD, 168 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K, 169 .can_dump_fw = true, 170 .mem_type_mapping_tbl = mem_type_mapping_tbl_w8997, 171 .num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl_w8997), 172 .can_ext_scan = true, 173 }; 174 175 static const struct of_device_id mwifiex_pcie_of_match_table[] __maybe_unused = { 176 { .compatible = "pci11ab,2b42" }, 177 { .compatible = "pci1b4b,2b42" }, 178 { } 179 }; 180 181 static int mwifiex_pcie_probe_of(struct device *dev) 182 { 183 if (!of_match_node(mwifiex_pcie_of_match_table, dev->of_node)) { 184 dev_err(dev, "required compatible string missing\n"); 185 return -EINVAL; 186 } 187 188 return 0; 189 } 190 191 static void mwifiex_pcie_work(struct work_struct *work); 192 193 static int 194 mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb, 195 size_t size, int flags) 196 { 197 struct pcie_service_card *card = adapter->card; 198 struct mwifiex_dma_mapping mapping; 199 200 mapping.addr = dma_map_single(&card->dev->dev, skb->data, size, flags); 201 if (dma_mapping_error(&card->dev->dev, mapping.addr)) { 202 mwifiex_dbg(adapter, ERROR, "failed to map pci memory!\n"); 203 return -1; 204 } 205 mapping.len = size; 206 mwifiex_store_mapping(skb, &mapping); 207 return 0; 208 } 209 210 static void mwifiex_unmap_pci_memory(struct mwifiex_adapter *adapter, 211 struct sk_buff *skb, int flags) 212 { 213 struct pcie_service_card *card = adapter->card; 214 struct mwifiex_dma_mapping mapping; 215 216 mwifiex_get_mapping(skb, &mapping); 217 dma_unmap_single(&card->dev->dev, mapping.addr, mapping.len, flags); 218 } 219 220 /* 221 * This function writes data into PCIE card register. 222 */ 223 static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data) 224 { 225 struct pcie_service_card *card = adapter->card; 226 227 iowrite32(data, card->pci_mmap1 + reg); 228 229 return 0; 230 } 231 232 /* This function reads data from PCIE card register. 233 */ 234 static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data) 235 { 236 struct pcie_service_card *card = adapter->card; 237 238 *data = ioread32(card->pci_mmap1 + reg); 239 if (*data == 0xffffffff) 240 return 0xffffffff; 241 242 return 0; 243 } 244 245 /* This function reads u8 data from PCIE card register. */ 246 static int mwifiex_read_reg_byte(struct mwifiex_adapter *adapter, 247 int reg, u8 *data) 248 { 249 struct pcie_service_card *card = adapter->card; 250 251 *data = ioread8(card->pci_mmap1 + reg); 252 253 return 0; 254 } 255 256 /* 257 * This function reads sleep cookie and checks if FW is ready 258 */ 259 static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter) 260 { 261 u32 cookie_value; 262 struct pcie_service_card *card = adapter->card; 263 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 264 265 if (!reg->sleep_cookie) 266 return true; 267 268 if (card->sleep_cookie_vbase) { 269 cookie_value = get_unaligned_le32(card->sleep_cookie_vbase); 270 mwifiex_dbg(adapter, INFO, 271 "info: ACCESS_HW: sleep cookie=0x%x\n", 272 cookie_value); 273 if (cookie_value == FW_AWAKE_COOKIE) 274 return true; 275 } 276 277 return false; 278 } 279 280 #ifdef CONFIG_PM_SLEEP 281 /* 282 * Kernel needs to suspend all functions separately. Therefore all 283 * registered functions must have drivers with suspend and resume 284 * methods. Failing that the kernel simply removes the whole card. 285 * 286 * If already not suspended, this function allocates and sends a host 287 * sleep activate request to the firmware and turns off the traffic. 288 */ 289 static int mwifiex_pcie_suspend(struct device *dev) 290 { 291 struct mwifiex_adapter *adapter; 292 struct pcie_service_card *card = dev_get_drvdata(dev); 293 294 295 /* Might still be loading firmware */ 296 wait_for_completion(&card->fw_done); 297 298 adapter = card->adapter; 299 if (!adapter) { 300 dev_err(dev, "adapter is not valid\n"); 301 return 0; 302 } 303 304 mwifiex_enable_wake(adapter); 305 306 /* Enable the Host Sleep */ 307 if (!mwifiex_enable_hs(adapter)) { 308 mwifiex_dbg(adapter, ERROR, 309 "cmd: failed to suspend\n"); 310 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags); 311 mwifiex_disable_wake(adapter); 312 return -EFAULT; 313 } 314 315 flush_workqueue(adapter->workqueue); 316 317 /* Indicate device suspended */ 318 set_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags); 319 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags); 320 321 return 0; 322 } 323 324 /* 325 * Kernel needs to suspend all functions separately. Therefore all 326 * registered functions must have drivers with suspend and resume 327 * methods. Failing that the kernel simply removes the whole card. 328 * 329 * If already not resumed, this function turns on the traffic and 330 * sends a host sleep cancel request to the firmware. 331 */ 332 static int mwifiex_pcie_resume(struct device *dev) 333 { 334 struct mwifiex_adapter *adapter; 335 struct pcie_service_card *card = dev_get_drvdata(dev); 336 337 338 if (!card->adapter) { 339 dev_err(dev, "adapter structure is not valid\n"); 340 return 0; 341 } 342 343 adapter = card->adapter; 344 345 if (!test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) { 346 mwifiex_dbg(adapter, WARN, 347 "Device already resumed\n"); 348 return 0; 349 } 350 351 clear_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags); 352 353 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA), 354 MWIFIEX_ASYNC_CMD); 355 mwifiex_disable_wake(adapter); 356 357 return 0; 358 } 359 #endif 360 361 /* 362 * This function probes an mwifiex device and registers it. It allocates 363 * the card structure, enables PCIE function number and initiates the 364 * device registration and initialization procedure by adding a logical 365 * interface. 366 */ 367 static int mwifiex_pcie_probe(struct pci_dev *pdev, 368 const struct pci_device_id *ent) 369 { 370 struct pcie_service_card *card; 371 int ret; 372 373 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n", 374 pdev->vendor, pdev->device, pdev->revision); 375 376 card = devm_kzalloc(&pdev->dev, sizeof(*card), GFP_KERNEL); 377 if (!card) 378 return -ENOMEM; 379 380 init_completion(&card->fw_done); 381 382 card->dev = pdev; 383 384 if (ent->driver_data) { 385 struct mwifiex_pcie_device *data = (void *)ent->driver_data; 386 card->pcie.reg = data->reg; 387 card->pcie.blksz_fw_dl = data->blksz_fw_dl; 388 card->pcie.tx_buf_size = data->tx_buf_size; 389 card->pcie.can_dump_fw = data->can_dump_fw; 390 card->pcie.mem_type_mapping_tbl = data->mem_type_mapping_tbl; 391 card->pcie.num_mem_types = data->num_mem_types; 392 card->pcie.can_ext_scan = data->can_ext_scan; 393 INIT_WORK(&card->work, mwifiex_pcie_work); 394 } 395 396 /* device tree node parsing and platform specific configuration*/ 397 if (pdev->dev.of_node) { 398 ret = mwifiex_pcie_probe_of(&pdev->dev); 399 if (ret) 400 return ret; 401 } 402 403 /* check quirks */ 404 mwifiex_initialize_quirks(card); 405 406 if (mwifiex_add_card(card, &card->fw_done, &pcie_ops, 407 MWIFIEX_PCIE, &pdev->dev)) { 408 pr_err("%s failed\n", __func__); 409 return -1; 410 } 411 412 return 0; 413 } 414 415 /* 416 * This function removes the interface and frees up the card structure. 417 */ 418 static void mwifiex_pcie_remove(struct pci_dev *pdev) 419 { 420 struct pcie_service_card *card; 421 struct mwifiex_adapter *adapter; 422 struct mwifiex_private *priv; 423 const struct mwifiex_pcie_card_reg *reg; 424 u32 fw_status; 425 426 card = pci_get_drvdata(pdev); 427 428 wait_for_completion(&card->fw_done); 429 430 adapter = card->adapter; 431 if (!adapter || !adapter->priv_num) 432 return; 433 434 reg = card->pcie.reg; 435 if (reg) 436 mwifiex_read_reg(adapter, reg->fw_status, &fw_status); 437 else 438 fw_status = -1; 439 440 if (fw_status == FIRMWARE_READY_PCIE && !adapter->mfg_mode) { 441 mwifiex_deauthenticate_all(adapter); 442 443 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY); 444 445 mwifiex_disable_auto_ds(priv); 446 447 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN); 448 } 449 450 mwifiex_remove_card(adapter); 451 } 452 453 static void mwifiex_pcie_shutdown(struct pci_dev *pdev) 454 { 455 mwifiex_pcie_remove(pdev); 456 457 return; 458 } 459 460 static void mwifiex_pcie_coredump(struct device *dev) 461 { 462 struct pci_dev *pdev; 463 struct pcie_service_card *card; 464 465 pdev = container_of(dev, struct pci_dev, dev); 466 card = pci_get_drvdata(pdev); 467 468 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, 469 &card->work_flags)) 470 schedule_work(&card->work); 471 } 472 473 static const struct pci_device_id mwifiex_ids[] = { 474 { 475 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P, 476 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 477 .driver_data = (unsigned long)&mwifiex_pcie8766, 478 }, 479 { 480 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897, 481 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 482 .driver_data = (unsigned long)&mwifiex_pcie8897, 483 }, 484 { 485 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997, 486 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 487 .driver_data = (unsigned long)&mwifiex_pcie8997, 488 }, 489 { 490 PCIE_VENDOR_ID_V2_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997, 491 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 492 .driver_data = (unsigned long)&mwifiex_pcie8997, 493 }, 494 {}, 495 }; 496 497 MODULE_DEVICE_TABLE(pci, mwifiex_ids); 498 499 /* 500 * Cleanup all software without cleaning anything related to PCIe and HW. 501 */ 502 static void mwifiex_pcie_reset_prepare(struct pci_dev *pdev) 503 { 504 struct pcie_service_card *card = pci_get_drvdata(pdev); 505 struct mwifiex_adapter *adapter = card->adapter; 506 507 if (!adapter) { 508 dev_err(&pdev->dev, "%s: adapter structure is not valid\n", 509 __func__); 510 return; 511 } 512 513 mwifiex_dbg(adapter, INFO, 514 "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Pre-FLR\n", 515 __func__, pdev->vendor, pdev->device, pdev->revision); 516 517 mwifiex_shutdown_sw(adapter); 518 clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags); 519 clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags); 520 521 /* On MS Surface gen4+ devices FLR isn't effective to recover from 522 * hangups, so we power-cycle the card instead. 523 */ 524 if (card->quirks & QUIRK_FW_RST_D3COLD) 525 mwifiex_pcie_reset_d3cold_quirk(pdev); 526 527 mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__); 528 529 card->pci_reset_ongoing = true; 530 } 531 532 /* 533 * Kernel stores and restores PCIe function context before and after performing 534 * FLR respectively. Reconfigure the software and firmware including firmware 535 * redownload. 536 */ 537 static void mwifiex_pcie_reset_done(struct pci_dev *pdev) 538 { 539 struct pcie_service_card *card = pci_get_drvdata(pdev); 540 struct mwifiex_adapter *adapter = card->adapter; 541 int ret; 542 543 if (!adapter) { 544 dev_err(&pdev->dev, "%s: adapter structure is not valid\n", 545 __func__); 546 return; 547 } 548 549 mwifiex_dbg(adapter, INFO, 550 "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Post-FLR\n", 551 __func__, pdev->vendor, pdev->device, pdev->revision); 552 553 ret = mwifiex_reinit_sw(adapter); 554 if (ret) 555 dev_err(&pdev->dev, "reinit failed: %d\n", ret); 556 else 557 mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__); 558 559 card->pci_reset_ongoing = false; 560 } 561 562 static const struct pci_error_handlers mwifiex_pcie_err_handler = { 563 .reset_prepare = mwifiex_pcie_reset_prepare, 564 .reset_done = mwifiex_pcie_reset_done, 565 }; 566 567 #ifdef CONFIG_PM_SLEEP 568 /* Power Management Hooks */ 569 static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend, 570 mwifiex_pcie_resume); 571 #endif 572 573 /* PCI Device Driver */ 574 static struct pci_driver mwifiex_pcie = { 575 .name = "mwifiex_pcie", 576 .id_table = mwifiex_ids, 577 .probe = mwifiex_pcie_probe, 578 .remove = mwifiex_pcie_remove, 579 .driver = { 580 .coredump = mwifiex_pcie_coredump, 581 #ifdef CONFIG_PM_SLEEP 582 .pm = &mwifiex_pcie_pm_ops, 583 #endif 584 }, 585 .shutdown = mwifiex_pcie_shutdown, 586 .err_handler = &mwifiex_pcie_err_handler, 587 }; 588 589 /* 590 * This function adds delay loop to ensure FW is awake before proceeding. 591 */ 592 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter) 593 { 594 int i = 0; 595 596 while (mwifiex_pcie_ok_to_access_hw(adapter)) { 597 i++; 598 usleep_range(10, 20); 599 /* 50ms max wait */ 600 if (i == 5000) 601 break; 602 } 603 604 return; 605 } 606 607 static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter, 608 u32 max_delay_loop_cnt) 609 { 610 struct pcie_service_card *card = adapter->card; 611 u8 *buffer; 612 u32 sleep_cookie, count; 613 struct sk_buff *cmdrsp = card->cmdrsp_buf; 614 615 for (count = 0; count < max_delay_loop_cnt; count++) { 616 dma_sync_single_for_cpu(&card->dev->dev, 617 MWIFIEX_SKB_DMA_ADDR(cmdrsp), 618 sizeof(sleep_cookie), DMA_FROM_DEVICE); 619 buffer = cmdrsp->data; 620 sleep_cookie = get_unaligned_le32(buffer); 621 622 if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) { 623 mwifiex_dbg(adapter, INFO, 624 "sleep cookie found at count %d\n", count); 625 break; 626 } 627 dma_sync_single_for_device(&card->dev->dev, 628 MWIFIEX_SKB_DMA_ADDR(cmdrsp), 629 sizeof(sleep_cookie), 630 DMA_FROM_DEVICE); 631 usleep_range(20, 30); 632 } 633 634 if (count >= max_delay_loop_cnt) 635 mwifiex_dbg(adapter, INFO, 636 "max count reached while accessing sleep cookie\n"); 637 } 638 639 #define N_WAKEUP_TRIES_SHORT_INTERVAL 15 640 #define N_WAKEUP_TRIES_LONG_INTERVAL 35 641 642 /* This function wakes up the card by reading fw_status register. */ 643 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter) 644 { 645 struct pcie_service_card *card = adapter->card; 646 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 647 int retval __maybe_unused; 648 649 mwifiex_dbg(adapter, EVENT, 650 "event: Wakeup device...\n"); 651 652 if (reg->sleep_cookie) 653 mwifiex_pcie_dev_wakeup_delay(adapter); 654 655 /* The 88W8897 PCIe+USB firmware (latest version 15.68.19.p21) sometimes 656 * appears to ignore or miss our wakeup request, so we continue trying 657 * until we receive an interrupt from the card. 658 */ 659 if (read_poll_timeout(mwifiex_write_reg, retval, 660 READ_ONCE(adapter->int_status) != 0, 661 500, 500 * N_WAKEUP_TRIES_SHORT_INTERVAL, 662 false, 663 adapter, reg->fw_status, FIRMWARE_READY_PCIE)) { 664 if (read_poll_timeout(mwifiex_write_reg, retval, 665 READ_ONCE(adapter->int_status) != 0, 666 10000, 10000 * N_WAKEUP_TRIES_LONG_INTERVAL, 667 false, 668 adapter, reg->fw_status, FIRMWARE_READY_PCIE)) { 669 mwifiex_dbg(adapter, ERROR, 670 "Firmware didn't wake up\n"); 671 return -EIO; 672 } 673 } 674 675 if (reg->sleep_cookie) { 676 mwifiex_pcie_dev_wakeup_delay(adapter); 677 mwifiex_dbg(adapter, INFO, 678 "PCIE wakeup: Setting PS_STATE_AWAKE\n"); 679 adapter->ps_state = PS_STATE_AWAKE; 680 } 681 682 return 0; 683 } 684 685 /* 686 * This function is called after the card has woken up. 687 * 688 * The card configuration register is reset. 689 */ 690 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter) 691 { 692 mwifiex_dbg(adapter, CMD, 693 "cmd: Wakeup device completed\n"); 694 695 return 0; 696 } 697 698 /* 699 * This function disables the host interrupt. 700 * 701 * The host interrupt mask is read, the disable bit is reset and 702 * written back to the card host interrupt mask register. 703 */ 704 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter) 705 { 706 if (mwifiex_pcie_ok_to_access_hw(adapter)) { 707 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK, 708 0x00000000)) { 709 mwifiex_dbg(adapter, ERROR, 710 "Disable host interrupt failed\n"); 711 return -1; 712 } 713 } 714 715 atomic_set(&adapter->tx_hw_pending, 0); 716 return 0; 717 } 718 719 static void mwifiex_pcie_disable_host_int_noerr(struct mwifiex_adapter *adapter) 720 { 721 WARN_ON(mwifiex_pcie_disable_host_int(adapter)); 722 } 723 724 /* 725 * This function enables the host interrupt. 726 * 727 * The host interrupt enable mask is written to the card 728 * host interrupt mask register. 729 */ 730 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter) 731 { 732 if (mwifiex_pcie_ok_to_access_hw(adapter)) { 733 /* Simply write the mask to the register */ 734 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK, 735 HOST_INTR_MASK)) { 736 mwifiex_dbg(adapter, ERROR, 737 "Enable host interrupt failed\n"); 738 return -1; 739 } 740 } 741 742 return 0; 743 } 744 745 /* 746 * This function initializes TX buffer ring descriptors 747 */ 748 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter) 749 { 750 struct pcie_service_card *card = adapter->card; 751 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 752 struct mwifiex_pcie_buf_desc *desc; 753 struct mwifiex_pfu_buf_desc *desc2; 754 int i; 755 756 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) { 757 card->tx_buf_list[i] = NULL; 758 if (reg->pfu_enabled) { 759 card->txbd_ring[i] = (void *)card->txbd_ring_vbase + 760 (sizeof(*desc2) * i); 761 desc2 = card->txbd_ring[i]; 762 memset(desc2, 0, sizeof(*desc2)); 763 } else { 764 card->txbd_ring[i] = (void *)card->txbd_ring_vbase + 765 (sizeof(*desc) * i); 766 desc = card->txbd_ring[i]; 767 memset(desc, 0, sizeof(*desc)); 768 } 769 } 770 771 return 0; 772 } 773 774 /* This function initializes RX buffer ring descriptors. Each SKB is allocated 775 * here and after mapping PCI memory, its physical address is assigned to 776 * PCIE Rx buffer descriptor's physical address. 777 */ 778 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter) 779 { 780 struct pcie_service_card *card = adapter->card; 781 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 782 struct sk_buff *skb; 783 struct mwifiex_pcie_buf_desc *desc; 784 struct mwifiex_pfu_buf_desc *desc2; 785 dma_addr_t buf_pa; 786 int i; 787 788 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) { 789 /* Allocate skb here so that firmware can DMA data from it */ 790 skb = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE, 791 GFP_KERNEL); 792 if (!skb) { 793 mwifiex_dbg(adapter, ERROR, 794 "Unable to allocate skb for RX ring.\n"); 795 kfree(card->rxbd_ring_vbase); 796 return -ENOMEM; 797 } 798 799 if (mwifiex_map_pci_memory(adapter, skb, 800 MWIFIEX_RX_DATA_BUF_SIZE, 801 DMA_FROM_DEVICE)) 802 return -1; 803 804 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb); 805 806 mwifiex_dbg(adapter, INFO, 807 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n", 808 skb, skb->len, skb->data, (u32)buf_pa, 809 (u32)((u64)buf_pa >> 32)); 810 811 card->rx_buf_list[i] = skb; 812 if (reg->pfu_enabled) { 813 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase + 814 (sizeof(*desc2) * i); 815 desc2 = card->rxbd_ring[i]; 816 desc2->paddr = buf_pa; 817 desc2->len = (u16)skb->len; 818 desc2->frag_len = (u16)skb->len; 819 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop; 820 desc2->offset = 0; 821 } else { 822 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase + 823 (sizeof(*desc) * i)); 824 desc = card->rxbd_ring[i]; 825 desc->paddr = buf_pa; 826 desc->len = (u16)skb->len; 827 desc->flags = 0; 828 } 829 } 830 831 return 0; 832 } 833 834 /* This function initializes event buffer ring descriptors. Each SKB is 835 * allocated here and after mapping PCI memory, its physical address is assigned 836 * to PCIE Rx buffer descriptor's physical address 837 */ 838 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter) 839 { 840 struct pcie_service_card *card = adapter->card; 841 struct mwifiex_evt_buf_desc *desc; 842 struct sk_buff *skb; 843 dma_addr_t buf_pa; 844 int i; 845 846 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) { 847 /* Allocate skb here so that firmware can DMA data from it */ 848 skb = dev_alloc_skb(MAX_EVENT_SIZE); 849 if (!skb) { 850 mwifiex_dbg(adapter, ERROR, 851 "Unable to allocate skb for EVENT buf.\n"); 852 kfree(card->evtbd_ring_vbase); 853 return -ENOMEM; 854 } 855 skb_put(skb, MAX_EVENT_SIZE); 856 857 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE, 858 DMA_FROM_DEVICE)) { 859 kfree_skb(skb); 860 kfree(card->evtbd_ring_vbase); 861 return -1; 862 } 863 864 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb); 865 866 mwifiex_dbg(adapter, EVENT, 867 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n", 868 skb, skb->len, skb->data, (u32)buf_pa, 869 (u32)((u64)buf_pa >> 32)); 870 871 card->evt_buf_list[i] = skb; 872 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase + 873 (sizeof(*desc) * i)); 874 desc = card->evtbd_ring[i]; 875 desc->paddr = buf_pa; 876 desc->len = (u16)skb->len; 877 desc->flags = 0; 878 } 879 880 return 0; 881 } 882 883 /* This function cleans up TX buffer rings. If any of the buffer list has valid 884 * SKB address, associated SKB is freed. 885 */ 886 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter) 887 { 888 struct pcie_service_card *card = adapter->card; 889 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 890 struct sk_buff *skb; 891 struct mwifiex_pcie_buf_desc *desc; 892 struct mwifiex_pfu_buf_desc *desc2; 893 int i; 894 895 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) { 896 if (reg->pfu_enabled) { 897 desc2 = card->txbd_ring[i]; 898 if (card->tx_buf_list[i]) { 899 skb = card->tx_buf_list[i]; 900 mwifiex_unmap_pci_memory(adapter, skb, 901 DMA_TO_DEVICE); 902 dev_kfree_skb_any(skb); 903 } 904 memset(desc2, 0, sizeof(*desc2)); 905 } else { 906 desc = card->txbd_ring[i]; 907 if (card->tx_buf_list[i]) { 908 skb = card->tx_buf_list[i]; 909 mwifiex_unmap_pci_memory(adapter, skb, 910 DMA_TO_DEVICE); 911 dev_kfree_skb_any(skb); 912 } 913 memset(desc, 0, sizeof(*desc)); 914 } 915 card->tx_buf_list[i] = NULL; 916 } 917 918 atomic_set(&adapter->tx_hw_pending, 0); 919 return; 920 } 921 922 /* This function cleans up RX buffer rings. If any of the buffer list has valid 923 * SKB address, associated SKB is freed. 924 */ 925 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter) 926 { 927 struct pcie_service_card *card = adapter->card; 928 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 929 struct mwifiex_pcie_buf_desc *desc; 930 struct mwifiex_pfu_buf_desc *desc2; 931 struct sk_buff *skb; 932 int i; 933 934 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) { 935 if (reg->pfu_enabled) { 936 desc2 = card->rxbd_ring[i]; 937 if (card->rx_buf_list[i]) { 938 skb = card->rx_buf_list[i]; 939 mwifiex_unmap_pci_memory(adapter, skb, 940 DMA_FROM_DEVICE); 941 dev_kfree_skb_any(skb); 942 } 943 memset(desc2, 0, sizeof(*desc2)); 944 } else { 945 desc = card->rxbd_ring[i]; 946 if (card->rx_buf_list[i]) { 947 skb = card->rx_buf_list[i]; 948 mwifiex_unmap_pci_memory(adapter, skb, 949 DMA_FROM_DEVICE); 950 dev_kfree_skb_any(skb); 951 } 952 memset(desc, 0, sizeof(*desc)); 953 } 954 card->rx_buf_list[i] = NULL; 955 } 956 957 return; 958 } 959 960 /* This function cleans up event buffer rings. If any of the buffer list has 961 * valid SKB address, associated SKB is freed. 962 */ 963 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter) 964 { 965 struct pcie_service_card *card = adapter->card; 966 struct mwifiex_evt_buf_desc *desc; 967 struct sk_buff *skb; 968 int i; 969 970 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) { 971 desc = card->evtbd_ring[i]; 972 if (card->evt_buf_list[i]) { 973 skb = card->evt_buf_list[i]; 974 mwifiex_unmap_pci_memory(adapter, skb, 975 DMA_FROM_DEVICE); 976 dev_kfree_skb_any(skb); 977 } 978 card->evt_buf_list[i] = NULL; 979 memset(desc, 0, sizeof(*desc)); 980 } 981 982 return; 983 } 984 985 /* This function creates buffer descriptor ring for TX 986 */ 987 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter) 988 { 989 struct pcie_service_card *card = adapter->card; 990 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 991 992 /* 993 * driver maintaines the write pointer and firmware maintaines the read 994 * pointer. The write pointer starts at 0 (zero) while the read pointer 995 * starts at zero with rollover bit set 996 */ 997 card->txbd_wrptr = 0; 998 999 if (reg->pfu_enabled) 1000 card->txbd_rdptr = 0; 1001 else 1002 card->txbd_rdptr |= reg->tx_rollover_ind; 1003 1004 /* allocate shared memory for the BD ring and divide the same in to 1005 several descriptors */ 1006 if (reg->pfu_enabled) 1007 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) * 1008 MWIFIEX_MAX_TXRX_BD; 1009 else 1010 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) * 1011 MWIFIEX_MAX_TXRX_BD; 1012 1013 mwifiex_dbg(adapter, INFO, 1014 "info: txbd_ring: Allocating %d bytes\n", 1015 card->txbd_ring_size); 1016 card->txbd_ring_vbase = dma_alloc_coherent(&card->dev->dev, 1017 card->txbd_ring_size, 1018 &card->txbd_ring_pbase, 1019 GFP_KERNEL); 1020 if (!card->txbd_ring_vbase) { 1021 mwifiex_dbg(adapter, ERROR, 1022 "allocate coherent memory (%d bytes) failed!\n", 1023 card->txbd_ring_size); 1024 return -ENOMEM; 1025 } 1026 1027 mwifiex_dbg(adapter, DATA, 1028 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %#x\n", 1029 card->txbd_ring_vbase, (u32)card->txbd_ring_pbase, 1030 (u32)((u64)card->txbd_ring_pbase >> 32), 1031 card->txbd_ring_size); 1032 1033 return mwifiex_init_txq_ring(adapter); 1034 } 1035 1036 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter) 1037 { 1038 struct pcie_service_card *card = adapter->card; 1039 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1040 1041 mwifiex_cleanup_txq_ring(adapter); 1042 1043 if (card->txbd_ring_vbase) 1044 dma_free_coherent(&card->dev->dev, card->txbd_ring_size, 1045 card->txbd_ring_vbase, 1046 card->txbd_ring_pbase); 1047 card->txbd_ring_size = 0; 1048 card->txbd_wrptr = 0; 1049 card->txbd_rdptr = 0 | reg->tx_rollover_ind; 1050 card->txbd_ring_vbase = NULL; 1051 card->txbd_ring_pbase = 0; 1052 1053 return 0; 1054 } 1055 1056 /* 1057 * This function creates buffer descriptor ring for RX 1058 */ 1059 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter) 1060 { 1061 struct pcie_service_card *card = adapter->card; 1062 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1063 1064 /* 1065 * driver maintaines the read pointer and firmware maintaines the write 1066 * pointer. The write pointer starts at 0 (zero) while the read pointer 1067 * starts at zero with rollover bit set 1068 */ 1069 card->rxbd_wrptr = 0; 1070 card->rxbd_rdptr = reg->rx_rollover_ind; 1071 1072 if (reg->pfu_enabled) 1073 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) * 1074 MWIFIEX_MAX_TXRX_BD; 1075 else 1076 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) * 1077 MWIFIEX_MAX_TXRX_BD; 1078 1079 mwifiex_dbg(adapter, INFO, 1080 "info: rxbd_ring: Allocating %d bytes\n", 1081 card->rxbd_ring_size); 1082 card->rxbd_ring_vbase = dma_alloc_coherent(&card->dev->dev, 1083 card->rxbd_ring_size, 1084 &card->rxbd_ring_pbase, 1085 GFP_KERNEL); 1086 if (!card->rxbd_ring_vbase) { 1087 mwifiex_dbg(adapter, ERROR, 1088 "allocate coherent memory (%d bytes) failed!\n", 1089 card->rxbd_ring_size); 1090 return -ENOMEM; 1091 } 1092 1093 mwifiex_dbg(adapter, DATA, 1094 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n", 1095 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase, 1096 (u32)((u64)card->rxbd_ring_pbase >> 32), 1097 card->rxbd_ring_size); 1098 1099 return mwifiex_init_rxq_ring(adapter); 1100 } 1101 1102 /* 1103 * This function deletes Buffer descriptor ring for RX 1104 */ 1105 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter) 1106 { 1107 struct pcie_service_card *card = adapter->card; 1108 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1109 1110 mwifiex_cleanup_rxq_ring(adapter); 1111 1112 if (card->rxbd_ring_vbase) 1113 dma_free_coherent(&card->dev->dev, card->rxbd_ring_size, 1114 card->rxbd_ring_vbase, 1115 card->rxbd_ring_pbase); 1116 card->rxbd_ring_size = 0; 1117 card->rxbd_wrptr = 0; 1118 card->rxbd_rdptr = 0 | reg->rx_rollover_ind; 1119 card->rxbd_ring_vbase = NULL; 1120 card->rxbd_ring_pbase = 0; 1121 1122 return 0; 1123 } 1124 1125 /* 1126 * This function creates buffer descriptor ring for Events 1127 */ 1128 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter) 1129 { 1130 struct pcie_service_card *card = adapter->card; 1131 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1132 1133 /* 1134 * driver maintaines the read pointer and firmware maintaines the write 1135 * pointer. The write pointer starts at 0 (zero) while the read pointer 1136 * starts at zero with rollover bit set 1137 */ 1138 card->evtbd_wrptr = 0; 1139 card->evtbd_rdptr = reg->evt_rollover_ind; 1140 1141 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) * 1142 MWIFIEX_MAX_EVT_BD; 1143 1144 mwifiex_dbg(adapter, INFO, 1145 "info: evtbd_ring: Allocating %d bytes\n", 1146 card->evtbd_ring_size); 1147 card->evtbd_ring_vbase = dma_alloc_coherent(&card->dev->dev, 1148 card->evtbd_ring_size, 1149 &card->evtbd_ring_pbase, 1150 GFP_KERNEL); 1151 if (!card->evtbd_ring_vbase) { 1152 mwifiex_dbg(adapter, ERROR, 1153 "allocate coherent memory (%d bytes) failed!\n", 1154 card->evtbd_ring_size); 1155 return -ENOMEM; 1156 } 1157 1158 mwifiex_dbg(adapter, EVENT, 1159 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n", 1160 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase, 1161 (u32)((u64)card->evtbd_ring_pbase >> 32), 1162 card->evtbd_ring_size); 1163 1164 return mwifiex_pcie_init_evt_ring(adapter); 1165 } 1166 1167 /* 1168 * This function deletes Buffer descriptor ring for Events 1169 */ 1170 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter) 1171 { 1172 struct pcie_service_card *card = adapter->card; 1173 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1174 1175 mwifiex_cleanup_evt_ring(adapter); 1176 1177 if (card->evtbd_ring_vbase) 1178 dma_free_coherent(&card->dev->dev, card->evtbd_ring_size, 1179 card->evtbd_ring_vbase, 1180 card->evtbd_ring_pbase); 1181 card->evtbd_wrptr = 0; 1182 card->evtbd_rdptr = 0 | reg->evt_rollover_ind; 1183 card->evtbd_ring_size = 0; 1184 card->evtbd_ring_vbase = NULL; 1185 card->evtbd_ring_pbase = 0; 1186 1187 return 0; 1188 } 1189 1190 /* 1191 * This function allocates a buffer for CMDRSP 1192 */ 1193 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter) 1194 { 1195 struct pcie_service_card *card = adapter->card; 1196 struct sk_buff *skb; 1197 1198 /* Allocate memory for receiving command response data */ 1199 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE); 1200 if (!skb) { 1201 mwifiex_dbg(adapter, ERROR, 1202 "Unable to allocate skb for command response data.\n"); 1203 return -ENOMEM; 1204 } 1205 skb_put(skb, MWIFIEX_UPLD_SIZE); 1206 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE, 1207 DMA_FROM_DEVICE)) { 1208 kfree_skb(skb); 1209 return -1; 1210 } 1211 1212 card->cmdrsp_buf = skb; 1213 1214 return 0; 1215 } 1216 1217 /* 1218 * This function deletes a buffer for CMDRSP 1219 */ 1220 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter) 1221 { 1222 struct pcie_service_card *card; 1223 1224 if (!adapter) 1225 return 0; 1226 1227 card = adapter->card; 1228 1229 if (card && card->cmdrsp_buf) { 1230 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf, 1231 DMA_FROM_DEVICE); 1232 dev_kfree_skb_any(card->cmdrsp_buf); 1233 card->cmdrsp_buf = NULL; 1234 } 1235 1236 if (card && card->cmd_buf) { 1237 mwifiex_unmap_pci_memory(adapter, card->cmd_buf, 1238 DMA_TO_DEVICE); 1239 dev_kfree_skb_any(card->cmd_buf); 1240 card->cmd_buf = NULL; 1241 } 1242 return 0; 1243 } 1244 1245 /* 1246 * This function allocates a buffer for sleep cookie 1247 */ 1248 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter) 1249 { 1250 struct pcie_service_card *card = adapter->card; 1251 u32 *cookie; 1252 1253 card->sleep_cookie_vbase = dma_alloc_coherent(&card->dev->dev, 1254 sizeof(u32), 1255 &card->sleep_cookie_pbase, 1256 GFP_KERNEL); 1257 if (!card->sleep_cookie_vbase) { 1258 mwifiex_dbg(adapter, ERROR, 1259 "dma_alloc_coherent failed!\n"); 1260 return -ENOMEM; 1261 } 1262 cookie = (u32 *)card->sleep_cookie_vbase; 1263 /* Init val of Sleep Cookie */ 1264 *cookie = FW_AWAKE_COOKIE; 1265 1266 mwifiex_dbg(adapter, INFO, "alloc_scook: sleep cookie=0x%x\n", *cookie); 1267 1268 return 0; 1269 } 1270 1271 /* 1272 * This function deletes buffer for sleep cookie 1273 */ 1274 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter) 1275 { 1276 struct pcie_service_card *card; 1277 1278 if (!adapter) 1279 return 0; 1280 1281 card = adapter->card; 1282 1283 if (card && card->sleep_cookie_vbase) { 1284 dma_free_coherent(&card->dev->dev, sizeof(u32), 1285 card->sleep_cookie_vbase, 1286 card->sleep_cookie_pbase); 1287 card->sleep_cookie_vbase = NULL; 1288 } 1289 1290 return 0; 1291 } 1292 1293 /* This function flushes the TX buffer descriptor ring 1294 * This function defined as handler is also called while cleaning TXRX 1295 * during disconnect/ bss stop. 1296 */ 1297 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter) 1298 { 1299 struct pcie_service_card *card = adapter->card; 1300 1301 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) { 1302 card->txbd_flush = 1; 1303 /* write pointer already set at last send 1304 * send dnld-rdy intr again, wait for completion. 1305 */ 1306 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT, 1307 CPU_INTR_DNLD_RDY)) { 1308 mwifiex_dbg(adapter, ERROR, 1309 "failed to assert dnld-rdy interrupt.\n"); 1310 return -1; 1311 } 1312 } 1313 return 0; 1314 } 1315 1316 /* 1317 * This function unmaps and frees downloaded data buffer 1318 */ 1319 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter) 1320 { 1321 struct sk_buff *skb; 1322 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0; 1323 struct mwifiex_pcie_buf_desc *desc; 1324 struct mwifiex_pfu_buf_desc *desc2; 1325 struct pcie_service_card *card = adapter->card; 1326 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1327 1328 if (!mwifiex_pcie_ok_to_access_hw(adapter)) 1329 mwifiex_pm_wakeup_card(adapter); 1330 1331 /* Read the TX ring read pointer set by firmware */ 1332 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) { 1333 mwifiex_dbg(adapter, ERROR, 1334 "SEND COMP: failed to read reg->tx_rdptr\n"); 1335 return -1; 1336 } 1337 1338 mwifiex_dbg(adapter, DATA, 1339 "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n", 1340 card->txbd_rdptr, rdptr); 1341 1342 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr; 1343 /* free from previous txbd_rdptr to current txbd_rdptr */ 1344 while (((card->txbd_rdptr & reg->tx_mask) != 1345 (rdptr & reg->tx_mask)) || 1346 ((card->txbd_rdptr & reg->tx_rollover_ind) != 1347 (rdptr & reg->tx_rollover_ind))) { 1348 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >> 1349 reg->tx_start_ptr; 1350 1351 skb = card->tx_buf_list[wrdoneidx]; 1352 1353 if (skb) { 1354 mwifiex_dbg(adapter, DATA, 1355 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n", 1356 skb, wrdoneidx); 1357 mwifiex_unmap_pci_memory(adapter, skb, 1358 DMA_TO_DEVICE); 1359 1360 unmap_count++; 1361 1362 if (card->txbd_flush) 1363 mwifiex_write_data_complete(adapter, skb, 0, 1364 -1); 1365 else 1366 mwifiex_write_data_complete(adapter, skb, 0, 0); 1367 atomic_dec(&adapter->tx_hw_pending); 1368 } 1369 1370 card->tx_buf_list[wrdoneidx] = NULL; 1371 1372 if (reg->pfu_enabled) { 1373 desc2 = card->txbd_ring[wrdoneidx]; 1374 memset(desc2, 0, sizeof(*desc2)); 1375 } else { 1376 desc = card->txbd_ring[wrdoneidx]; 1377 memset(desc, 0, sizeof(*desc)); 1378 } 1379 switch (card->dev->device) { 1380 case PCIE_DEVICE_ID_MARVELL_88W8766P: 1381 card->txbd_rdptr++; 1382 break; 1383 case PCIE_DEVICE_ID_MARVELL_88W8897: 1384 case PCIE_DEVICE_ID_MARVELL_88W8997: 1385 card->txbd_rdptr += reg->ring_tx_start_ptr; 1386 break; 1387 } 1388 1389 1390 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs) 1391 card->txbd_rdptr = ((card->txbd_rdptr & 1392 reg->tx_rollover_ind) ^ 1393 reg->tx_rollover_ind); 1394 } 1395 1396 if (unmap_count) 1397 adapter->data_sent = false; 1398 1399 if (card->txbd_flush) { 1400 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) 1401 card->txbd_flush = 0; 1402 else 1403 mwifiex_clean_pcie_ring_buf(adapter); 1404 } 1405 1406 return 0; 1407 } 1408 1409 /* This function sends data buffer to device. First 4 bytes of payload 1410 * are filled with payload length and payload type. Then this payload 1411 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly. 1412 * Download ready interrupt to FW is deffered if Tx ring is not full and 1413 * additional payload can be accomodated. 1414 * Caller must ensure tx_param parameter to this function is not NULL. 1415 */ 1416 static int 1417 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb, 1418 struct mwifiex_tx_param *tx_param) 1419 { 1420 struct pcie_service_card *card = adapter->card; 1421 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1422 u32 wrindx, num_tx_buffs, rx_val; 1423 int ret; 1424 dma_addr_t buf_pa; 1425 struct mwifiex_pcie_buf_desc *desc = NULL; 1426 struct mwifiex_pfu_buf_desc *desc2 = NULL; 1427 1428 if (!(skb->data && skb->len)) { 1429 mwifiex_dbg(adapter, ERROR, 1430 "%s(): invalid parameter <%p, %#x>\n", 1431 __func__, skb->data, skb->len); 1432 return -1; 1433 } 1434 1435 if (!mwifiex_pcie_ok_to_access_hw(adapter)) 1436 mwifiex_pm_wakeup_card(adapter); 1437 1438 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr; 1439 mwifiex_dbg(adapter, DATA, 1440 "info: SEND DATA: <Rd: %#x, Wr: %#x>\n", 1441 card->txbd_rdptr, card->txbd_wrptr); 1442 if (mwifiex_pcie_txbd_not_full(card)) { 1443 u8 *payload; 1444 1445 adapter->data_sent = true; 1446 payload = skb->data; 1447 put_unaligned_le16((u16)skb->len, payload + 0); 1448 put_unaligned_le16(MWIFIEX_TYPE_DATA, payload + 2); 1449 1450 if (mwifiex_map_pci_memory(adapter, skb, skb->len, 1451 DMA_TO_DEVICE)) 1452 return -1; 1453 1454 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr; 1455 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb); 1456 card->tx_buf_list[wrindx] = skb; 1457 atomic_inc(&adapter->tx_hw_pending); 1458 1459 if (reg->pfu_enabled) { 1460 desc2 = card->txbd_ring[wrindx]; 1461 desc2->paddr = buf_pa; 1462 desc2->len = (u16)skb->len; 1463 desc2->frag_len = (u16)skb->len; 1464 desc2->offset = 0; 1465 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC | 1466 MWIFIEX_BD_FLAG_LAST_DESC; 1467 } else { 1468 desc = card->txbd_ring[wrindx]; 1469 desc->paddr = buf_pa; 1470 desc->len = (u16)skb->len; 1471 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC | 1472 MWIFIEX_BD_FLAG_LAST_DESC; 1473 } 1474 1475 switch (card->dev->device) { 1476 case PCIE_DEVICE_ID_MARVELL_88W8766P: 1477 card->txbd_wrptr++; 1478 break; 1479 case PCIE_DEVICE_ID_MARVELL_88W8897: 1480 case PCIE_DEVICE_ID_MARVELL_88W8997: 1481 card->txbd_wrptr += reg->ring_tx_start_ptr; 1482 break; 1483 } 1484 1485 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs) 1486 card->txbd_wrptr = ((card->txbd_wrptr & 1487 reg->tx_rollover_ind) ^ 1488 reg->tx_rollover_ind); 1489 1490 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask; 1491 /* Write the TX ring write pointer in to reg->tx_wrptr */ 1492 if (mwifiex_write_reg(adapter, reg->tx_wrptr, 1493 card->txbd_wrptr | rx_val)) { 1494 mwifiex_dbg(adapter, ERROR, 1495 "SEND DATA: failed to write reg->tx_wrptr\n"); 1496 ret = -1; 1497 goto done_unmap; 1498 } 1499 1500 /* The firmware (latest version 15.68.19.p21) of the 88W8897 PCIe+USB card 1501 * seems to crash randomly after setting the TX ring write pointer when 1502 * ASPM powersaving is enabled. A workaround seems to be keeping the bus 1503 * busy by reading a random register afterwards. 1504 */ 1505 mwifiex_read_reg(adapter, PCI_VENDOR_ID, &rx_val); 1506 1507 if ((mwifiex_pcie_txbd_not_full(card)) && 1508 tx_param->next_pkt_len) { 1509 /* have more packets and TxBD still can hold more */ 1510 mwifiex_dbg(adapter, DATA, 1511 "SEND DATA: delay dnld-rdy interrupt.\n"); 1512 adapter->data_sent = false; 1513 } else { 1514 /* Send the TX ready interrupt */ 1515 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT, 1516 CPU_INTR_DNLD_RDY)) { 1517 mwifiex_dbg(adapter, ERROR, 1518 "SEND DATA: failed to assert dnld-rdy interrupt.\n"); 1519 ret = -1; 1520 goto done_unmap; 1521 } 1522 } 1523 mwifiex_dbg(adapter, DATA, 1524 "info: SEND DATA: Updated <Rd: %#x, Wr:\t" 1525 "%#x> and sent packet to firmware successfully\n", 1526 card->txbd_rdptr, card->txbd_wrptr); 1527 } else { 1528 mwifiex_dbg(adapter, DATA, 1529 "info: TX Ring full, can't send packets to fw\n"); 1530 adapter->data_sent = true; 1531 /* Send the TX ready interrupt */ 1532 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT, 1533 CPU_INTR_DNLD_RDY)) 1534 mwifiex_dbg(adapter, ERROR, 1535 "SEND DATA: failed to assert door-bell intr\n"); 1536 return -EBUSY; 1537 } 1538 1539 return -EINPROGRESS; 1540 done_unmap: 1541 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE); 1542 card->tx_buf_list[wrindx] = NULL; 1543 atomic_dec(&adapter->tx_hw_pending); 1544 if (reg->pfu_enabled) 1545 memset(desc2, 0, sizeof(*desc2)); 1546 else 1547 memset(desc, 0, sizeof(*desc)); 1548 1549 return ret; 1550 } 1551 1552 /* 1553 * This function handles received buffer ring and 1554 * dispatches packets to upper 1555 */ 1556 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter) 1557 { 1558 struct pcie_service_card *card = adapter->card; 1559 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1560 u32 wrptr, rd_index, tx_val; 1561 dma_addr_t buf_pa; 1562 int ret = 0; 1563 struct sk_buff *skb_tmp = NULL; 1564 struct mwifiex_pcie_buf_desc *desc; 1565 struct mwifiex_pfu_buf_desc *desc2; 1566 1567 if (!mwifiex_pcie_ok_to_access_hw(adapter)) 1568 mwifiex_pm_wakeup_card(adapter); 1569 1570 /* Read the RX ring Write pointer set by firmware */ 1571 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) { 1572 mwifiex_dbg(adapter, ERROR, 1573 "RECV DATA: failed to read reg->rx_wrptr\n"); 1574 ret = -1; 1575 goto done; 1576 } 1577 card->rxbd_wrptr = wrptr; 1578 1579 while (((wrptr & reg->rx_mask) != 1580 (card->rxbd_rdptr & reg->rx_mask)) || 1581 ((wrptr & reg->rx_rollover_ind) == 1582 (card->rxbd_rdptr & reg->rx_rollover_ind))) { 1583 struct sk_buff *skb_data; 1584 u16 rx_len; 1585 1586 rd_index = card->rxbd_rdptr & reg->rx_mask; 1587 skb_data = card->rx_buf_list[rd_index]; 1588 1589 /* If skb allocation was failed earlier for Rx packet, 1590 * rx_buf_list[rd_index] would have been left with a NULL. 1591 */ 1592 if (!skb_data) 1593 return -ENOMEM; 1594 1595 mwifiex_unmap_pci_memory(adapter, skb_data, DMA_FROM_DEVICE); 1596 card->rx_buf_list[rd_index] = NULL; 1597 1598 /* Get data length from interface header - 1599 * first 2 bytes for len, next 2 bytes is for type 1600 */ 1601 rx_len = get_unaligned_le16(skb_data->data); 1602 if (WARN_ON(rx_len <= adapter->intf_hdr_len || 1603 rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) { 1604 mwifiex_dbg(adapter, ERROR, 1605 "Invalid RX len %d, Rd=%#x, Wr=%#x\n", 1606 rx_len, card->rxbd_rdptr, wrptr); 1607 dev_kfree_skb_any(skb_data); 1608 } else { 1609 skb_put(skb_data, rx_len); 1610 mwifiex_dbg(adapter, DATA, 1611 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n", 1612 card->rxbd_rdptr, wrptr, rx_len); 1613 skb_pull(skb_data, adapter->intf_hdr_len); 1614 if (adapter->rx_work_enabled) { 1615 skb_queue_tail(&adapter->rx_data_q, skb_data); 1616 adapter->data_received = true; 1617 atomic_inc(&adapter->rx_pending); 1618 } else { 1619 mwifiex_handle_rx_packet(adapter, skb_data); 1620 } 1621 } 1622 1623 skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE, 1624 GFP_KERNEL); 1625 if (!skb_tmp) { 1626 mwifiex_dbg(adapter, ERROR, 1627 "Unable to allocate skb.\n"); 1628 return -ENOMEM; 1629 } 1630 1631 if (mwifiex_map_pci_memory(adapter, skb_tmp, 1632 MWIFIEX_RX_DATA_BUF_SIZE, 1633 DMA_FROM_DEVICE)) 1634 return -1; 1635 1636 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp); 1637 1638 mwifiex_dbg(adapter, INFO, 1639 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n", 1640 skb_tmp, rd_index); 1641 card->rx_buf_list[rd_index] = skb_tmp; 1642 1643 if (reg->pfu_enabled) { 1644 desc2 = card->rxbd_ring[rd_index]; 1645 desc2->paddr = buf_pa; 1646 desc2->len = skb_tmp->len; 1647 desc2->frag_len = skb_tmp->len; 1648 desc2->offset = 0; 1649 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop; 1650 } else { 1651 desc = card->rxbd_ring[rd_index]; 1652 desc->paddr = buf_pa; 1653 desc->len = skb_tmp->len; 1654 desc->flags = 0; 1655 } 1656 1657 if ((++card->rxbd_rdptr & reg->rx_mask) == 1658 MWIFIEX_MAX_TXRX_BD) { 1659 card->rxbd_rdptr = ((card->rxbd_rdptr & 1660 reg->rx_rollover_ind) ^ 1661 reg->rx_rollover_ind); 1662 } 1663 mwifiex_dbg(adapter, DATA, 1664 "info: RECV DATA: <Rd: %#x, Wr: %#x>\n", 1665 card->rxbd_rdptr, wrptr); 1666 1667 tx_val = card->txbd_wrptr & reg->tx_wrap_mask; 1668 /* Write the RX ring read pointer in to reg->rx_rdptr */ 1669 if (mwifiex_write_reg(adapter, reg->rx_rdptr, 1670 card->rxbd_rdptr | tx_val)) { 1671 mwifiex_dbg(adapter, DATA, 1672 "RECV DATA: failed to write reg->rx_rdptr\n"); 1673 ret = -1; 1674 goto done; 1675 } 1676 1677 /* Read the RX ring Write pointer set by firmware */ 1678 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) { 1679 mwifiex_dbg(adapter, ERROR, 1680 "RECV DATA: failed to read reg->rx_wrptr\n"); 1681 ret = -1; 1682 goto done; 1683 } 1684 mwifiex_dbg(adapter, DATA, 1685 "info: RECV DATA: Rcvd packet from fw successfully\n"); 1686 card->rxbd_wrptr = wrptr; 1687 } 1688 1689 done: 1690 return ret; 1691 } 1692 1693 /* 1694 * This function downloads the boot command to device 1695 */ 1696 static int 1697 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb) 1698 { 1699 dma_addr_t buf_pa; 1700 struct pcie_service_card *card = adapter->card; 1701 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1702 1703 if (!(skb->data && skb->len)) { 1704 mwifiex_dbg(adapter, ERROR, 1705 "Invalid parameter in %s <%p. len %d>\n", 1706 __func__, skb->data, skb->len); 1707 return -1; 1708 } 1709 1710 if (mwifiex_map_pci_memory(adapter, skb, skb->len, DMA_TO_DEVICE)) 1711 return -1; 1712 1713 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb); 1714 1715 /* Write the lower 32bits of the physical address to low command 1716 * address scratch register 1717 */ 1718 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) { 1719 mwifiex_dbg(adapter, ERROR, 1720 "%s: failed to write download command to boot code.\n", 1721 __func__); 1722 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE); 1723 return -1; 1724 } 1725 1726 /* Write the upper 32bits of the physical address to high command 1727 * address scratch register 1728 */ 1729 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi, 1730 (u32)((u64)buf_pa >> 32))) { 1731 mwifiex_dbg(adapter, ERROR, 1732 "%s: failed to write download command to boot code.\n", 1733 __func__); 1734 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE); 1735 return -1; 1736 } 1737 1738 /* Write the command length to cmd_size scratch register */ 1739 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) { 1740 mwifiex_dbg(adapter, ERROR, 1741 "%s: failed to write command len to cmd_size scratch reg\n", 1742 __func__); 1743 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE); 1744 return -1; 1745 } 1746 1747 /* Ring the door bell */ 1748 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT, 1749 CPU_INTR_DOOR_BELL)) { 1750 mwifiex_dbg(adapter, ERROR, 1751 "%s: failed to assert door-bell intr\n", __func__); 1752 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE); 1753 return -1; 1754 } 1755 1756 return 0; 1757 } 1758 1759 /* This function init rx port in firmware which in turn enables to receive data 1760 * from device before transmitting any packet. 1761 */ 1762 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter) 1763 { 1764 struct pcie_service_card *card = adapter->card; 1765 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1766 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask; 1767 1768 /* Write the RX ring read pointer in to reg->rx_rdptr */ 1769 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr | 1770 tx_wrap)) { 1771 mwifiex_dbg(adapter, ERROR, 1772 "RECV DATA: failed to write reg->rx_rdptr\n"); 1773 return -1; 1774 } 1775 return 0; 1776 } 1777 1778 /* This function downloads commands to the device 1779 */ 1780 static int 1781 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb) 1782 { 1783 struct pcie_service_card *card = adapter->card; 1784 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1785 int ret = 0; 1786 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa; 1787 u8 *payload = (u8 *)skb->data; 1788 1789 if (!(skb->data && skb->len)) { 1790 mwifiex_dbg(adapter, ERROR, 1791 "Invalid parameter in %s <%p, %#x>\n", 1792 __func__, skb->data, skb->len); 1793 return -1; 1794 } 1795 1796 /* Make sure a command response buffer is available */ 1797 if (!card->cmdrsp_buf) { 1798 mwifiex_dbg(adapter, ERROR, 1799 "No response buffer available, send command failed\n"); 1800 return -EBUSY; 1801 } 1802 1803 if (!mwifiex_pcie_ok_to_access_hw(adapter)) 1804 mwifiex_pm_wakeup_card(adapter); 1805 1806 adapter->cmd_sent = true; 1807 1808 put_unaligned_le16((u16)skb->len, &payload[0]); 1809 put_unaligned_le16(MWIFIEX_TYPE_CMD, &payload[2]); 1810 1811 if (mwifiex_map_pci_memory(adapter, skb, skb->len, DMA_TO_DEVICE)) 1812 return -1; 1813 1814 card->cmd_buf = skb; 1815 /* 1816 * Need to keep a reference, since core driver might free up this 1817 * buffer before we've unmapped it. 1818 */ 1819 skb_get(skb); 1820 1821 /* To send a command, the driver will: 1822 1. Write the 64bit physical address of the data buffer to 1823 cmd response address low + cmd response address high 1824 2. Ring the door bell (i.e. set the door bell interrupt) 1825 1826 In response to door bell interrupt, the firmware will perform 1827 the DMA of the command packet (first header to obtain the total 1828 length and then rest of the command). 1829 */ 1830 1831 if (card->cmdrsp_buf) { 1832 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf); 1833 /* Write the lower 32bits of the cmdrsp buffer physical 1834 address */ 1835 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 1836 (u32)cmdrsp_buf_pa)) { 1837 mwifiex_dbg(adapter, ERROR, 1838 "Failed to write download cmd to boot code.\n"); 1839 ret = -1; 1840 goto done; 1841 } 1842 /* Write the upper 32bits of the cmdrsp buffer physical 1843 address */ 1844 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 1845 (u32)((u64)cmdrsp_buf_pa >> 32))) { 1846 mwifiex_dbg(adapter, ERROR, 1847 "Failed to write download cmd to boot code.\n"); 1848 ret = -1; 1849 goto done; 1850 } 1851 } 1852 1853 cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf); 1854 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */ 1855 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, 1856 (u32)cmd_buf_pa)) { 1857 mwifiex_dbg(adapter, ERROR, 1858 "Failed to write download cmd to boot code.\n"); 1859 ret = -1; 1860 goto done; 1861 } 1862 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */ 1863 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi, 1864 (u32)((u64)cmd_buf_pa >> 32))) { 1865 mwifiex_dbg(adapter, ERROR, 1866 "Failed to write download cmd to boot code.\n"); 1867 ret = -1; 1868 goto done; 1869 } 1870 1871 /* Write the command length to reg->cmd_size */ 1872 if (mwifiex_write_reg(adapter, reg->cmd_size, 1873 card->cmd_buf->len)) { 1874 mwifiex_dbg(adapter, ERROR, 1875 "Failed to write cmd len to reg->cmd_size\n"); 1876 ret = -1; 1877 goto done; 1878 } 1879 1880 /* Ring the door bell */ 1881 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT, 1882 CPU_INTR_DOOR_BELL)) { 1883 mwifiex_dbg(adapter, ERROR, 1884 "Failed to assert door-bell intr\n"); 1885 ret = -1; 1886 goto done; 1887 } 1888 1889 done: 1890 if (ret) 1891 adapter->cmd_sent = false; 1892 1893 return 0; 1894 } 1895 1896 /* 1897 * This function handles command complete interrupt 1898 */ 1899 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter) 1900 { 1901 struct pcie_service_card *card = adapter->card; 1902 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1903 struct sk_buff *skb = card->cmdrsp_buf; 1904 int count = 0; 1905 u16 rx_len; 1906 1907 mwifiex_dbg(adapter, CMD, 1908 "info: Rx CMD Response\n"); 1909 1910 if (adapter->curr_cmd) 1911 mwifiex_unmap_pci_memory(adapter, skb, DMA_FROM_DEVICE); 1912 else 1913 dma_sync_single_for_cpu(&card->dev->dev, 1914 MWIFIEX_SKB_DMA_ADDR(skb), 1915 MWIFIEX_UPLD_SIZE, DMA_FROM_DEVICE); 1916 1917 /* Unmap the command as a response has been received. */ 1918 if (card->cmd_buf) { 1919 mwifiex_unmap_pci_memory(adapter, card->cmd_buf, 1920 DMA_TO_DEVICE); 1921 dev_kfree_skb_any(card->cmd_buf); 1922 card->cmd_buf = NULL; 1923 } 1924 1925 rx_len = get_unaligned_le16(skb->data); 1926 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len); 1927 skb_trim(skb, rx_len); 1928 1929 if (!adapter->curr_cmd) { 1930 if (adapter->ps_state == PS_STATE_SLEEP_CFM) { 1931 dma_sync_single_for_device(&card->dev->dev, 1932 MWIFIEX_SKB_DMA_ADDR(skb), 1933 MWIFIEX_SLEEP_COOKIE_SIZE, 1934 DMA_FROM_DEVICE); 1935 if (mwifiex_write_reg(adapter, 1936 PCIE_CPU_INT_EVENT, 1937 CPU_INTR_SLEEP_CFM_DONE)) { 1938 mwifiex_dbg(adapter, ERROR, 1939 "Write register failed\n"); 1940 return -1; 1941 } 1942 mwifiex_delay_for_sleep_cookie(adapter, 1943 MWIFIEX_MAX_DELAY_COUNT); 1944 mwifiex_unmap_pci_memory(adapter, skb, 1945 DMA_FROM_DEVICE); 1946 skb_pull(skb, adapter->intf_hdr_len); 1947 while (reg->sleep_cookie && (count++ < 10) && 1948 mwifiex_pcie_ok_to_access_hw(adapter)) 1949 usleep_range(50, 60); 1950 mwifiex_pcie_enable_host_int(adapter); 1951 mwifiex_process_sleep_confirm_resp(adapter, skb->data, 1952 skb->len); 1953 } else { 1954 mwifiex_dbg(adapter, ERROR, 1955 "There is no command but got cmdrsp\n"); 1956 } 1957 memcpy(adapter->upld_buf, skb->data, 1958 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len)); 1959 skb_push(skb, adapter->intf_hdr_len); 1960 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE, 1961 DMA_FROM_DEVICE)) 1962 return -1; 1963 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) { 1964 skb_pull(skb, adapter->intf_hdr_len); 1965 adapter->curr_cmd->resp_skb = skb; 1966 adapter->cmd_resp_received = true; 1967 /* Take the pointer and set it to CMD node and will 1968 return in the response complete callback */ 1969 card->cmdrsp_buf = NULL; 1970 1971 /* Clear the cmd-rsp buffer address in scratch registers. This 1972 will prevent firmware from writing to the same response 1973 buffer again. */ 1974 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) { 1975 mwifiex_dbg(adapter, ERROR, 1976 "cmd_done: failed to clear cmd_rsp_addr_lo\n"); 1977 return -1; 1978 } 1979 /* Write the upper 32bits of the cmdrsp buffer physical 1980 address */ 1981 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) { 1982 mwifiex_dbg(adapter, ERROR, 1983 "cmd_done: failed to clear cmd_rsp_addr_hi\n"); 1984 return -1; 1985 } 1986 } 1987 1988 return 0; 1989 } 1990 1991 /* 1992 * Command Response processing complete handler 1993 */ 1994 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter, 1995 struct sk_buff *skb) 1996 { 1997 struct pcie_service_card *card = adapter->card; 1998 1999 if (skb) { 2000 card->cmdrsp_buf = skb; 2001 skb_push(card->cmdrsp_buf, adapter->intf_hdr_len); 2002 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE, 2003 DMA_FROM_DEVICE)) 2004 return -1; 2005 } 2006 2007 return 0; 2008 } 2009 2010 /* 2011 * This function handles firmware event ready interrupt 2012 */ 2013 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter) 2014 { 2015 struct pcie_service_card *card = adapter->card; 2016 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 2017 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK; 2018 u32 wrptr, event; 2019 struct mwifiex_evt_buf_desc *desc; 2020 2021 if (!mwifiex_pcie_ok_to_access_hw(adapter)) 2022 mwifiex_pm_wakeup_card(adapter); 2023 2024 if (adapter->event_received) { 2025 mwifiex_dbg(adapter, EVENT, 2026 "info: Event being processed,\t" 2027 "do not process this interrupt just yet\n"); 2028 return 0; 2029 } 2030 2031 if (rdptr >= MWIFIEX_MAX_EVT_BD) { 2032 mwifiex_dbg(adapter, ERROR, 2033 "info: Invalid read pointer...\n"); 2034 return -1; 2035 } 2036 2037 /* Read the event ring write pointer set by firmware */ 2038 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) { 2039 mwifiex_dbg(adapter, ERROR, 2040 "EventReady: failed to read reg->evt_wrptr\n"); 2041 return -1; 2042 } 2043 2044 mwifiex_dbg(adapter, EVENT, 2045 "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>", 2046 card->evtbd_rdptr, wrptr); 2047 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr 2048 & MWIFIEX_EVTBD_MASK)) || 2049 ((wrptr & reg->evt_rollover_ind) == 2050 (card->evtbd_rdptr & reg->evt_rollover_ind))) { 2051 struct sk_buff *skb_cmd; 2052 __le16 data_len = 0; 2053 u16 evt_len; 2054 2055 mwifiex_dbg(adapter, INFO, 2056 "info: Read Index: %d\n", rdptr); 2057 skb_cmd = card->evt_buf_list[rdptr]; 2058 mwifiex_unmap_pci_memory(adapter, skb_cmd, DMA_FROM_DEVICE); 2059 2060 /* Take the pointer and set it to event pointer in adapter 2061 and will return back after event handling callback */ 2062 card->evt_buf_list[rdptr] = NULL; 2063 desc = card->evtbd_ring[rdptr]; 2064 memset(desc, 0, sizeof(*desc)); 2065 2066 event = get_unaligned_le32( 2067 &skb_cmd->data[adapter->intf_hdr_len]); 2068 adapter->event_cause = event; 2069 /* The first 4bytes will be the event transfer header 2070 len is 2 bytes followed by type which is 2 bytes */ 2071 memcpy(&data_len, skb_cmd->data, sizeof(__le16)); 2072 evt_len = le16_to_cpu(data_len); 2073 skb_trim(skb_cmd, evt_len); 2074 skb_pull(skb_cmd, adapter->intf_hdr_len); 2075 mwifiex_dbg(adapter, EVENT, 2076 "info: Event length: %d\n", evt_len); 2077 2078 if (evt_len > MWIFIEX_EVENT_HEADER_LEN && 2079 evt_len < MAX_EVENT_SIZE) 2080 memcpy(adapter->event_body, skb_cmd->data + 2081 MWIFIEX_EVENT_HEADER_LEN, evt_len - 2082 MWIFIEX_EVENT_HEADER_LEN); 2083 2084 adapter->event_received = true; 2085 adapter->event_skb = skb_cmd; 2086 2087 /* Do not update the event read pointer here, wait till the 2088 buffer is released. This is just to make things simpler, 2089 we need to find a better method of managing these buffers. 2090 */ 2091 } else { 2092 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT, 2093 CPU_INTR_EVENT_DONE)) { 2094 mwifiex_dbg(adapter, ERROR, 2095 "Write register failed\n"); 2096 return -1; 2097 } 2098 } 2099 2100 return 0; 2101 } 2102 2103 /* 2104 * Event processing complete handler 2105 */ 2106 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter, 2107 struct sk_buff *skb) 2108 { 2109 struct pcie_service_card *card = adapter->card; 2110 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 2111 int ret = 0; 2112 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK; 2113 u32 wrptr; 2114 struct mwifiex_evt_buf_desc *desc; 2115 2116 if (!skb) 2117 return 0; 2118 2119 if (rdptr >= MWIFIEX_MAX_EVT_BD) { 2120 mwifiex_dbg(adapter, ERROR, 2121 "event_complete: Invalid rdptr 0x%x\n", 2122 rdptr); 2123 return -EINVAL; 2124 } 2125 2126 /* Read the event ring write pointer set by firmware */ 2127 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) { 2128 mwifiex_dbg(adapter, ERROR, 2129 "event_complete: failed to read reg->evt_wrptr\n"); 2130 return -1; 2131 } 2132 2133 if (!card->evt_buf_list[rdptr]) { 2134 skb_push(skb, adapter->intf_hdr_len); 2135 skb_put(skb, MAX_EVENT_SIZE - skb->len); 2136 if (mwifiex_map_pci_memory(adapter, skb, 2137 MAX_EVENT_SIZE, 2138 DMA_FROM_DEVICE)) 2139 return -1; 2140 card->evt_buf_list[rdptr] = skb; 2141 desc = card->evtbd_ring[rdptr]; 2142 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb); 2143 desc->len = (u16)skb->len; 2144 desc->flags = 0; 2145 skb = NULL; 2146 } else { 2147 mwifiex_dbg(adapter, ERROR, 2148 "info: ERROR: buf still valid at index %d, <%p, %p>\n", 2149 rdptr, card->evt_buf_list[rdptr], skb); 2150 } 2151 2152 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) { 2153 card->evtbd_rdptr = ((card->evtbd_rdptr & 2154 reg->evt_rollover_ind) ^ 2155 reg->evt_rollover_ind); 2156 } 2157 2158 mwifiex_dbg(adapter, EVENT, 2159 "info: Updated <Rd: 0x%x, Wr: 0x%x>", 2160 card->evtbd_rdptr, wrptr); 2161 2162 /* Write the event ring read pointer in to reg->evt_rdptr */ 2163 if (mwifiex_write_reg(adapter, reg->evt_rdptr, 2164 card->evtbd_rdptr)) { 2165 mwifiex_dbg(adapter, ERROR, 2166 "event_complete: failed to read reg->evt_rdptr\n"); 2167 return -1; 2168 } 2169 2170 mwifiex_dbg(adapter, EVENT, 2171 "info: Check Events Again\n"); 2172 ret = mwifiex_pcie_process_event_ready(adapter); 2173 2174 return ret; 2175 } 2176 2177 /* Combo firmware image is a combination of 2178 * (1) combo crc heaer, start with CMD5 2179 * (2) bluetooth image, start with CMD7, end with CMD6, data wrapped in CMD1. 2180 * (3) wifi image. 2181 * 2182 * This function bypass the header and bluetooth part, return 2183 * the offset of tail wifi-only part. If the image is already wifi-only, 2184 * that is start with CMD1, return 0. 2185 */ 2186 2187 static int mwifiex_extract_wifi_fw(struct mwifiex_adapter *adapter, 2188 const void *firmware, u32 firmware_len) { 2189 const struct mwifiex_fw_data *fwdata; 2190 u32 offset = 0, data_len, dnld_cmd; 2191 int ret = 0; 2192 bool cmd7_before = false, first_cmd = false; 2193 2194 while (1) { 2195 /* Check for integer and buffer overflow */ 2196 if (offset + sizeof(fwdata->header) < sizeof(fwdata->header) || 2197 offset + sizeof(fwdata->header) >= firmware_len) { 2198 mwifiex_dbg(adapter, ERROR, 2199 "extract wifi-only fw failure!\n"); 2200 ret = -1; 2201 goto done; 2202 } 2203 2204 fwdata = firmware + offset; 2205 dnld_cmd = le32_to_cpu(fwdata->header.dnld_cmd); 2206 data_len = le32_to_cpu(fwdata->header.data_length); 2207 2208 /* Skip past header */ 2209 offset += sizeof(fwdata->header); 2210 2211 switch (dnld_cmd) { 2212 case MWIFIEX_FW_DNLD_CMD_1: 2213 if (offset + data_len < data_len) { 2214 mwifiex_dbg(adapter, ERROR, "bad FW parse\n"); 2215 ret = -1; 2216 goto done; 2217 } 2218 2219 /* Image start with cmd1, already wifi-only firmware */ 2220 if (!first_cmd) { 2221 mwifiex_dbg(adapter, MSG, 2222 "input wifi-only firmware\n"); 2223 return 0; 2224 } 2225 2226 if (!cmd7_before) { 2227 mwifiex_dbg(adapter, ERROR, 2228 "no cmd7 before cmd1!\n"); 2229 ret = -1; 2230 goto done; 2231 } 2232 offset += data_len; 2233 break; 2234 case MWIFIEX_FW_DNLD_CMD_5: 2235 first_cmd = true; 2236 /* Check for integer overflow */ 2237 if (offset + data_len < data_len) { 2238 mwifiex_dbg(adapter, ERROR, "bad FW parse\n"); 2239 ret = -1; 2240 goto done; 2241 } 2242 offset += data_len; 2243 break; 2244 case MWIFIEX_FW_DNLD_CMD_6: 2245 first_cmd = true; 2246 /* Check for integer overflow */ 2247 if (offset + data_len < data_len) { 2248 mwifiex_dbg(adapter, ERROR, "bad FW parse\n"); 2249 ret = -1; 2250 goto done; 2251 } 2252 offset += data_len; 2253 if (offset >= firmware_len) { 2254 mwifiex_dbg(adapter, ERROR, 2255 "extract wifi-only fw failure!\n"); 2256 ret = -1; 2257 } else { 2258 ret = offset; 2259 } 2260 goto done; 2261 case MWIFIEX_FW_DNLD_CMD_7: 2262 first_cmd = true; 2263 cmd7_before = true; 2264 break; 2265 default: 2266 mwifiex_dbg(adapter, ERROR, "unknown dnld_cmd %d\n", 2267 dnld_cmd); 2268 ret = -1; 2269 goto done; 2270 } 2271 } 2272 2273 done: 2274 return ret; 2275 } 2276 2277 /* 2278 * This function downloads the firmware to the card. 2279 * 2280 * Firmware is downloaded to the card in blocks. Every block download 2281 * is tested for CRC errors, and retried a number of times before 2282 * returning failure. 2283 */ 2284 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter, 2285 struct mwifiex_fw_image *fw) 2286 { 2287 int ret; 2288 u8 *firmware = fw->fw_buf; 2289 u32 firmware_len = fw->fw_len; 2290 u32 offset = 0; 2291 struct sk_buff *skb; 2292 u32 txlen, tx_blocks = 0, tries, len, val; 2293 u32 block_retry_cnt = 0; 2294 struct pcie_service_card *card = adapter->card; 2295 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 2296 2297 if (!firmware || !firmware_len) { 2298 mwifiex_dbg(adapter, ERROR, 2299 "No firmware image found! Terminating download\n"); 2300 return -1; 2301 } 2302 2303 mwifiex_dbg(adapter, INFO, 2304 "info: Downloading FW image (%d bytes)\n", 2305 firmware_len); 2306 2307 if (mwifiex_pcie_disable_host_int(adapter)) { 2308 mwifiex_dbg(adapter, ERROR, 2309 "%s: Disabling interrupts failed.\n", __func__); 2310 return -1; 2311 } 2312 2313 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE); 2314 if (!skb) { 2315 ret = -ENOMEM; 2316 goto done; 2317 } 2318 2319 ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_13_REG, &val); 2320 if (ret) { 2321 mwifiex_dbg(adapter, FATAL, "Failed to read scratch register 13\n"); 2322 goto done; 2323 } 2324 2325 /* PCIE FLR case: extract wifi part from combo firmware*/ 2326 if (val == MWIFIEX_PCIE_FLR_HAPPENS) { 2327 ret = mwifiex_extract_wifi_fw(adapter, firmware, firmware_len); 2328 if (ret < 0) { 2329 mwifiex_dbg(adapter, ERROR, "Failed to extract wifi fw\n"); 2330 goto done; 2331 } 2332 offset = ret; 2333 mwifiex_dbg(adapter, MSG, 2334 "info: dnld wifi firmware from %d bytes\n", offset); 2335 } 2336 2337 /* Perform firmware data transfer */ 2338 do { 2339 u32 ireg_intr = 0; 2340 2341 /* More data? */ 2342 if (offset >= firmware_len) 2343 break; 2344 2345 for (tries = 0; tries < MAX_POLL_TRIES; tries++) { 2346 ret = mwifiex_read_reg(adapter, reg->cmd_size, 2347 &len); 2348 if (ret) { 2349 mwifiex_dbg(adapter, FATAL, 2350 "Failed reading len from boot code\n"); 2351 goto done; 2352 } 2353 if (len) 2354 break; 2355 usleep_range(10, 20); 2356 } 2357 2358 if (!len) { 2359 break; 2360 } else if (len > MWIFIEX_UPLD_SIZE) { 2361 mwifiex_dbg(adapter, ERROR, 2362 "FW download failure @ %d, invalid length %d\n", 2363 offset, len); 2364 ret = -1; 2365 goto done; 2366 } 2367 2368 txlen = len; 2369 2370 if (len & BIT(0)) { 2371 block_retry_cnt++; 2372 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) { 2373 mwifiex_dbg(adapter, ERROR, 2374 "FW download failure @ %d, over max\t" 2375 "retry count\n", offset); 2376 ret = -1; 2377 goto done; 2378 } 2379 mwifiex_dbg(adapter, ERROR, 2380 "FW CRC error indicated by the\t" 2381 "helper: len = 0x%04X, txlen = %d\n", 2382 len, txlen); 2383 len &= ~BIT(0); 2384 /* Setting this to 0 to resend from same offset */ 2385 txlen = 0; 2386 } else { 2387 block_retry_cnt = 0; 2388 /* Set blocksize to transfer - checking for 2389 last block */ 2390 if (firmware_len - offset < txlen) 2391 txlen = firmware_len - offset; 2392 2393 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) / 2394 card->pcie.blksz_fw_dl; 2395 2396 /* Copy payload to buffer */ 2397 memmove(skb->data, &firmware[offset], txlen); 2398 } 2399 2400 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len); 2401 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl); 2402 2403 /* Send the boot command to device */ 2404 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) { 2405 mwifiex_dbg(adapter, ERROR, 2406 "Failed to send firmware download command\n"); 2407 ret = -1; 2408 goto done; 2409 } 2410 2411 /* Wait for the command done interrupt */ 2412 for (tries = 0; tries < MAX_POLL_TRIES; tries++) { 2413 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS, 2414 &ireg_intr)) { 2415 mwifiex_dbg(adapter, ERROR, 2416 "%s: Failed to read\t" 2417 "interrupt status during fw dnld.\n", 2418 __func__); 2419 mwifiex_unmap_pci_memory(adapter, skb, 2420 DMA_TO_DEVICE); 2421 ret = -1; 2422 goto done; 2423 } 2424 if (!(ireg_intr & CPU_INTR_DOOR_BELL)) 2425 break; 2426 usleep_range(10, 20); 2427 } 2428 if (ireg_intr & CPU_INTR_DOOR_BELL) { 2429 mwifiex_dbg(adapter, ERROR, "%s: Card failed to ACK download\n", 2430 __func__); 2431 mwifiex_unmap_pci_memory(adapter, skb, 2432 DMA_TO_DEVICE); 2433 ret = -1; 2434 goto done; 2435 } 2436 2437 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE); 2438 2439 offset += txlen; 2440 } while (true); 2441 2442 mwifiex_dbg(adapter, MSG, 2443 "info: FW download over, size %d bytes\n", offset); 2444 2445 ret = 0; 2446 2447 done: 2448 dev_kfree_skb_any(skb); 2449 return ret; 2450 } 2451 2452 /* 2453 * This function checks the firmware status in card. 2454 */ 2455 static int 2456 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num) 2457 { 2458 int ret = 0; 2459 u32 firmware_stat; 2460 struct pcie_service_card *card = adapter->card; 2461 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 2462 u32 tries; 2463 2464 /* Mask spurios interrupts */ 2465 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK, 2466 HOST_INTR_MASK)) { 2467 mwifiex_dbg(adapter, ERROR, 2468 "Write register failed\n"); 2469 return -1; 2470 } 2471 2472 mwifiex_dbg(adapter, INFO, 2473 "Setting driver ready signature\n"); 2474 if (mwifiex_write_reg(adapter, reg->drv_rdy, 2475 FIRMWARE_READY_PCIE)) { 2476 mwifiex_dbg(adapter, ERROR, 2477 "Failed to write driver ready signature\n"); 2478 return -1; 2479 } 2480 2481 /* Wait for firmware initialization event */ 2482 for (tries = 0; tries < poll_num; tries++) { 2483 if (mwifiex_read_reg(adapter, reg->fw_status, 2484 &firmware_stat)) 2485 ret = -1; 2486 else 2487 ret = 0; 2488 2489 mwifiex_dbg(adapter, INFO, "Try %d if FW is ready <%d,%#x>", 2490 tries, ret, firmware_stat); 2491 2492 if (ret) 2493 continue; 2494 if (firmware_stat == FIRMWARE_READY_PCIE) { 2495 ret = 0; 2496 break; 2497 } else { 2498 msleep(100); 2499 ret = -1; 2500 } 2501 } 2502 2503 return ret; 2504 } 2505 2506 /* This function checks if WLAN is the winner. 2507 */ 2508 static int 2509 mwifiex_check_winner_status(struct mwifiex_adapter *adapter) 2510 { 2511 u32 winner = 0; 2512 int ret = 0; 2513 struct pcie_service_card *card = adapter->card; 2514 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 2515 2516 if (mwifiex_read_reg(adapter, reg->fw_status, &winner)) { 2517 ret = -1; 2518 } else if (!winner) { 2519 mwifiex_dbg(adapter, INFO, "PCI-E is the winner\n"); 2520 adapter->winner = 1; 2521 } else { 2522 mwifiex_dbg(adapter, ERROR, 2523 "PCI-E is not the winner <%#x>", winner); 2524 } 2525 2526 return ret; 2527 } 2528 2529 /* 2530 * This function reads the interrupt status from card. 2531 */ 2532 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter, 2533 int msg_id) 2534 { 2535 u32 pcie_ireg; 2536 unsigned long flags; 2537 struct pcie_service_card *card = adapter->card; 2538 2539 if (card->msi_enable) { 2540 spin_lock_irqsave(&adapter->int_lock, flags); 2541 adapter->int_status = 1; 2542 spin_unlock_irqrestore(&adapter->int_lock, flags); 2543 return; 2544 } 2545 2546 if (!mwifiex_pcie_ok_to_access_hw(adapter)) 2547 return; 2548 2549 if (card->msix_enable && msg_id >= 0) { 2550 pcie_ireg = BIT(msg_id); 2551 } else { 2552 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, 2553 &pcie_ireg)) { 2554 mwifiex_dbg(adapter, ERROR, "Read register failed\n"); 2555 return; 2556 } 2557 2558 if ((pcie_ireg == 0xFFFFFFFF) || !pcie_ireg) 2559 return; 2560 2561 2562 mwifiex_pcie_disable_host_int(adapter); 2563 2564 /* Clear the pending interrupts */ 2565 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS, 2566 ~pcie_ireg)) { 2567 mwifiex_dbg(adapter, ERROR, 2568 "Write register failed\n"); 2569 return; 2570 } 2571 } 2572 2573 if (!adapter->pps_uapsd_mode && 2574 adapter->ps_state == PS_STATE_SLEEP && 2575 mwifiex_pcie_ok_to_access_hw(adapter)) { 2576 /* Potentially for PCIe we could get other 2577 * interrupts like shared. Don't change power 2578 * state until cookie is set 2579 */ 2580 adapter->ps_state = PS_STATE_AWAKE; 2581 adapter->pm_wakeup_fw_try = false; 2582 del_timer(&adapter->wakeup_timer); 2583 } 2584 2585 spin_lock_irqsave(&adapter->int_lock, flags); 2586 adapter->int_status |= pcie_ireg; 2587 spin_unlock_irqrestore(&adapter->int_lock, flags); 2588 mwifiex_dbg(adapter, INTR, "ireg: 0x%08x\n", pcie_ireg); 2589 } 2590 2591 /* 2592 * Interrupt handler for PCIe root port 2593 * 2594 * This function reads the interrupt status from firmware and assigns 2595 * the main process in workqueue which will handle the interrupt. 2596 */ 2597 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context) 2598 { 2599 struct mwifiex_msix_context *ctx = context; 2600 struct pci_dev *pdev = ctx->dev; 2601 struct pcie_service_card *card; 2602 struct mwifiex_adapter *adapter; 2603 2604 card = pci_get_drvdata(pdev); 2605 2606 if (!card->adapter) { 2607 pr_err("info: %s: card=%p adapter=%p\n", __func__, card, 2608 card ? card->adapter : NULL); 2609 goto exit; 2610 } 2611 adapter = card->adapter; 2612 2613 if (test_bit(MWIFIEX_SURPRISE_REMOVED, &adapter->work_flags)) 2614 goto exit; 2615 2616 if (card->msix_enable) 2617 mwifiex_interrupt_status(adapter, ctx->msg_id); 2618 else 2619 mwifiex_interrupt_status(adapter, -1); 2620 2621 mwifiex_queue_main_work(adapter); 2622 2623 exit: 2624 return IRQ_HANDLED; 2625 } 2626 2627 /* 2628 * This function checks the current interrupt status. 2629 * 2630 * The following interrupts are checked and handled by this function - 2631 * - Data sent 2632 * - Command sent 2633 * - Command received 2634 * - Packets received 2635 * - Events received 2636 * 2637 * In case of Rx packets received, the packets are uploaded from card to 2638 * host and processed accordingly. 2639 */ 2640 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter) 2641 { 2642 int ret; 2643 u32 pcie_ireg = 0; 2644 unsigned long flags; 2645 struct pcie_service_card *card = adapter->card; 2646 2647 spin_lock_irqsave(&adapter->int_lock, flags); 2648 if (!card->msi_enable) { 2649 /* Clear out unused interrupts */ 2650 pcie_ireg = adapter->int_status; 2651 } 2652 adapter->int_status = 0; 2653 spin_unlock_irqrestore(&adapter->int_lock, flags); 2654 2655 if (card->msi_enable) { 2656 if (mwifiex_pcie_ok_to_access_hw(adapter)) { 2657 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, 2658 &pcie_ireg)) { 2659 mwifiex_dbg(adapter, ERROR, 2660 "Read register failed\n"); 2661 return -1; 2662 } 2663 2664 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) { 2665 if (mwifiex_write_reg(adapter, 2666 PCIE_HOST_INT_STATUS, 2667 ~pcie_ireg)) { 2668 mwifiex_dbg(adapter, ERROR, 2669 "Write register failed\n"); 2670 return -1; 2671 } 2672 if (!adapter->pps_uapsd_mode && 2673 adapter->ps_state == PS_STATE_SLEEP) { 2674 adapter->ps_state = PS_STATE_AWAKE; 2675 adapter->pm_wakeup_fw_try = false; 2676 del_timer(&adapter->wakeup_timer); 2677 } 2678 } 2679 } 2680 } 2681 2682 if (pcie_ireg & HOST_INTR_DNLD_DONE) { 2683 mwifiex_dbg(adapter, INTR, "info: TX DNLD Done\n"); 2684 ret = mwifiex_pcie_send_data_complete(adapter); 2685 if (ret) 2686 return ret; 2687 } 2688 if (pcie_ireg & HOST_INTR_UPLD_RDY) { 2689 mwifiex_dbg(adapter, INTR, "info: Rx DATA\n"); 2690 ret = mwifiex_pcie_process_recv_data(adapter); 2691 if (ret) 2692 return ret; 2693 } 2694 if (pcie_ireg & HOST_INTR_EVENT_RDY) { 2695 mwifiex_dbg(adapter, INTR, "info: Rx EVENT\n"); 2696 ret = mwifiex_pcie_process_event_ready(adapter); 2697 if (ret) 2698 return ret; 2699 } 2700 if (pcie_ireg & HOST_INTR_CMD_DONE) { 2701 if (adapter->cmd_sent) { 2702 mwifiex_dbg(adapter, INTR, 2703 "info: CMD sent Interrupt\n"); 2704 adapter->cmd_sent = false; 2705 } 2706 /* Handle command response */ 2707 ret = mwifiex_pcie_process_cmd_complete(adapter); 2708 if (ret) 2709 return ret; 2710 } 2711 2712 mwifiex_dbg(adapter, INTR, 2713 "info: cmd_sent=%d data_sent=%d\n", 2714 adapter->cmd_sent, adapter->data_sent); 2715 if (!card->msi_enable && !card->msix_enable && 2716 adapter->ps_state != PS_STATE_SLEEP) 2717 mwifiex_pcie_enable_host_int(adapter); 2718 2719 return 0; 2720 } 2721 2722 /* 2723 * This function downloads data from driver to card. 2724 * 2725 * Both commands and data packets are transferred to the card by this 2726 * function. 2727 * 2728 * This function adds the PCIE specific header to the front of the buffer 2729 * before transferring. The header contains the length of the packet and 2730 * the type. The firmware handles the packets based upon this set type. 2731 */ 2732 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type, 2733 struct sk_buff *skb, 2734 struct mwifiex_tx_param *tx_param) 2735 { 2736 if (!skb) { 2737 mwifiex_dbg(adapter, ERROR, 2738 "Passed NULL skb to %s\n", __func__); 2739 return -1; 2740 } 2741 2742 if (type == MWIFIEX_TYPE_DATA) 2743 return mwifiex_pcie_send_data(adapter, skb, tx_param); 2744 else if (type == MWIFIEX_TYPE_CMD) 2745 return mwifiex_pcie_send_cmd(adapter, skb); 2746 2747 return 0; 2748 } 2749 2750 /* Function to dump PCIE scratch registers in case of FW crash 2751 */ 2752 static int 2753 mwifiex_pcie_reg_dump(struct mwifiex_adapter *adapter, char *drv_buf) 2754 { 2755 char *p = drv_buf; 2756 char buf[256], *ptr; 2757 int i; 2758 u32 value; 2759 struct pcie_service_card *card = adapter->card; 2760 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 2761 int pcie_scratch_reg[] = {PCIE_SCRATCH_12_REG, 2762 PCIE_SCRATCH_14_REG, 2763 PCIE_SCRATCH_15_REG}; 2764 2765 if (!p) 2766 return 0; 2767 2768 mwifiex_dbg(adapter, MSG, "PCIE register dump start\n"); 2769 2770 if (mwifiex_read_reg(adapter, reg->fw_status, &value)) { 2771 mwifiex_dbg(adapter, ERROR, "failed to read firmware status"); 2772 return 0; 2773 } 2774 2775 ptr = buf; 2776 mwifiex_dbg(adapter, MSG, "pcie scratch register:"); 2777 for (i = 0; i < ARRAY_SIZE(pcie_scratch_reg); i++) { 2778 mwifiex_read_reg(adapter, pcie_scratch_reg[i], &value); 2779 ptr += sprintf(ptr, "reg:0x%x, value=0x%x\n", 2780 pcie_scratch_reg[i], value); 2781 } 2782 2783 mwifiex_dbg(adapter, MSG, "%s\n", buf); 2784 p += sprintf(p, "%s\n", buf); 2785 2786 mwifiex_dbg(adapter, MSG, "PCIE register dump end\n"); 2787 2788 return p - drv_buf; 2789 } 2790 2791 /* This function read/write firmware */ 2792 static enum rdwr_status 2793 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag) 2794 { 2795 int ret, tries; 2796 u8 ctrl_data; 2797 u32 fw_status; 2798 struct pcie_service_card *card = adapter->card; 2799 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 2800 2801 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status)) 2802 return RDWR_STATUS_FAILURE; 2803 2804 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl, 2805 reg->fw_dump_host_ready); 2806 if (ret) { 2807 mwifiex_dbg(adapter, ERROR, 2808 "PCIE write err\n"); 2809 return RDWR_STATUS_FAILURE; 2810 } 2811 2812 for (tries = 0; tries < MAX_POLL_TRIES; tries++) { 2813 mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data); 2814 if (ctrl_data == FW_DUMP_DONE) 2815 return RDWR_STATUS_SUCCESS; 2816 if (doneflag && ctrl_data == doneflag) 2817 return RDWR_STATUS_DONE; 2818 if (ctrl_data != reg->fw_dump_host_ready) { 2819 mwifiex_dbg(adapter, WARN, 2820 "The ctrl reg was changed, re-try again!\n"); 2821 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl, 2822 reg->fw_dump_host_ready); 2823 if (ret) { 2824 mwifiex_dbg(adapter, ERROR, 2825 "PCIE write err\n"); 2826 return RDWR_STATUS_FAILURE; 2827 } 2828 } 2829 usleep_range(100, 200); 2830 } 2831 2832 mwifiex_dbg(adapter, ERROR, "Fail to pull ctrl_data\n"); 2833 return RDWR_STATUS_FAILURE; 2834 } 2835 2836 /* This function dump firmware memory to file */ 2837 static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter) 2838 { 2839 struct pcie_service_card *card = adapter->card; 2840 const struct mwifiex_pcie_card_reg *creg = card->pcie.reg; 2841 unsigned int reg, reg_start, reg_end; 2842 u8 *dbg_ptr, *end_ptr, *tmp_ptr, fw_dump_num, dump_num; 2843 u8 idx, i, read_reg, doneflag = 0; 2844 enum rdwr_status stat; 2845 u32 memory_size; 2846 int ret; 2847 2848 if (!card->pcie.can_dump_fw) 2849 return; 2850 2851 for (idx = 0; idx < adapter->num_mem_types; idx++) { 2852 struct memory_type_mapping *entry = 2853 &adapter->mem_type_mapping_tbl[idx]; 2854 2855 if (entry->mem_ptr) { 2856 vfree(entry->mem_ptr); 2857 entry->mem_ptr = NULL; 2858 } 2859 entry->mem_size = 0; 2860 } 2861 2862 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump start ==\n"); 2863 2864 /* Read the number of the memories which will dump */ 2865 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag); 2866 if (stat == RDWR_STATUS_FAILURE) 2867 return; 2868 2869 reg = creg->fw_dump_start; 2870 mwifiex_read_reg_byte(adapter, reg, &fw_dump_num); 2871 2872 /* W8997 chipset firmware dump will be restore in single region*/ 2873 if (fw_dump_num == 0) 2874 dump_num = 1; 2875 else 2876 dump_num = fw_dump_num; 2877 2878 /* Read the length of every memory which will dump */ 2879 for (idx = 0; idx < dump_num; idx++) { 2880 struct memory_type_mapping *entry = 2881 &adapter->mem_type_mapping_tbl[idx]; 2882 memory_size = 0; 2883 if (fw_dump_num != 0) { 2884 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag); 2885 if (stat == RDWR_STATUS_FAILURE) 2886 return; 2887 2888 reg = creg->fw_dump_start; 2889 for (i = 0; i < 4; i++) { 2890 mwifiex_read_reg_byte(adapter, reg, &read_reg); 2891 memory_size |= (read_reg << (i * 8)); 2892 reg++; 2893 } 2894 } else { 2895 memory_size = MWIFIEX_FW_DUMP_MAX_MEMSIZE; 2896 } 2897 2898 if (memory_size == 0) { 2899 mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n"); 2900 ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl, 2901 creg->fw_dump_read_done); 2902 if (ret) { 2903 mwifiex_dbg(adapter, ERROR, "PCIE write err\n"); 2904 return; 2905 } 2906 break; 2907 } 2908 2909 mwifiex_dbg(adapter, DUMP, 2910 "%s_SIZE=0x%x\n", entry->mem_name, memory_size); 2911 entry->mem_ptr = vmalloc(memory_size + 1); 2912 entry->mem_size = memory_size; 2913 if (!entry->mem_ptr) { 2914 mwifiex_dbg(adapter, ERROR, 2915 "Vmalloc %s failed\n", entry->mem_name); 2916 return; 2917 } 2918 dbg_ptr = entry->mem_ptr; 2919 end_ptr = dbg_ptr + memory_size; 2920 2921 doneflag = entry->done_flag; 2922 mwifiex_dbg(adapter, DUMP, "Start %s output, please wait...\n", 2923 entry->mem_name); 2924 2925 do { 2926 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag); 2927 if (RDWR_STATUS_FAILURE == stat) 2928 return; 2929 2930 reg_start = creg->fw_dump_start; 2931 reg_end = creg->fw_dump_end; 2932 for (reg = reg_start; reg <= reg_end; reg++) { 2933 mwifiex_read_reg_byte(adapter, reg, dbg_ptr); 2934 if (dbg_ptr < end_ptr) { 2935 dbg_ptr++; 2936 continue; 2937 } 2938 mwifiex_dbg(adapter, ERROR, 2939 "pre-allocated buf not enough\n"); 2940 tmp_ptr = 2941 vzalloc(memory_size + MWIFIEX_SIZE_4K); 2942 if (!tmp_ptr) 2943 return; 2944 memcpy(tmp_ptr, entry->mem_ptr, memory_size); 2945 vfree(entry->mem_ptr); 2946 entry->mem_ptr = tmp_ptr; 2947 tmp_ptr = NULL; 2948 dbg_ptr = entry->mem_ptr + memory_size; 2949 memory_size += MWIFIEX_SIZE_4K; 2950 end_ptr = entry->mem_ptr + memory_size; 2951 } 2952 2953 if (stat != RDWR_STATUS_DONE) 2954 continue; 2955 2956 mwifiex_dbg(adapter, DUMP, 2957 "%s done: size=0x%tx\n", 2958 entry->mem_name, dbg_ptr - entry->mem_ptr); 2959 break; 2960 } while (true); 2961 } 2962 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump end ==\n"); 2963 } 2964 2965 static void mwifiex_pcie_device_dump_work(struct mwifiex_adapter *adapter) 2966 { 2967 adapter->devdump_data = vzalloc(MWIFIEX_FW_DUMP_SIZE); 2968 if (!adapter->devdump_data) { 2969 mwifiex_dbg(adapter, ERROR, 2970 "vzalloc devdump data failure!\n"); 2971 return; 2972 } 2973 2974 mwifiex_drv_info_dump(adapter); 2975 mwifiex_pcie_fw_dump(adapter); 2976 mwifiex_prepare_fw_dump_info(adapter); 2977 mwifiex_upload_device_dump(adapter); 2978 } 2979 2980 static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter) 2981 { 2982 struct pcie_service_card *card = adapter->card; 2983 2984 /* We can't afford to wait here; remove() might be waiting on us. If we 2985 * can't grab the device lock, maybe we'll get another chance later. 2986 */ 2987 pci_try_reset_function(card->dev); 2988 } 2989 2990 static void mwifiex_pcie_work(struct work_struct *work) 2991 { 2992 struct pcie_service_card *card = 2993 container_of(work, struct pcie_service_card, work); 2994 2995 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, 2996 &card->work_flags)) 2997 mwifiex_pcie_device_dump_work(card->adapter); 2998 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, 2999 &card->work_flags)) 3000 mwifiex_pcie_card_reset_work(card->adapter); 3001 } 3002 3003 /* This function dumps FW information */ 3004 static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter) 3005 { 3006 struct pcie_service_card *card = adapter->card; 3007 3008 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, 3009 &card->work_flags)) 3010 schedule_work(&card->work); 3011 } 3012 3013 static void mwifiex_pcie_card_reset(struct mwifiex_adapter *adapter) 3014 { 3015 struct pcie_service_card *card = adapter->card; 3016 3017 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags)) 3018 schedule_work(&card->work); 3019 } 3020 3021 static int mwifiex_pcie_alloc_buffers(struct mwifiex_adapter *adapter) 3022 { 3023 struct pcie_service_card *card = adapter->card; 3024 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 3025 int ret; 3026 3027 card->cmdrsp_buf = NULL; 3028 ret = mwifiex_pcie_create_txbd_ring(adapter); 3029 if (ret) { 3030 mwifiex_dbg(adapter, ERROR, "Failed to create txbd ring\n"); 3031 goto err_cre_txbd; 3032 } 3033 3034 ret = mwifiex_pcie_create_rxbd_ring(adapter); 3035 if (ret) { 3036 mwifiex_dbg(adapter, ERROR, "Failed to create rxbd ring\n"); 3037 goto err_cre_rxbd; 3038 } 3039 3040 ret = mwifiex_pcie_create_evtbd_ring(adapter); 3041 if (ret) { 3042 mwifiex_dbg(adapter, ERROR, "Failed to create evtbd ring\n"); 3043 goto err_cre_evtbd; 3044 } 3045 3046 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter); 3047 if (ret) { 3048 mwifiex_dbg(adapter, ERROR, "Failed to allocate cmdbuf buffer\n"); 3049 goto err_alloc_cmdbuf; 3050 } 3051 3052 if (reg->sleep_cookie) { 3053 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter); 3054 if (ret) { 3055 mwifiex_dbg(adapter, ERROR, "Failed to allocate sleep_cookie buffer\n"); 3056 goto err_alloc_cookie; 3057 } 3058 } else { 3059 card->sleep_cookie_vbase = NULL; 3060 } 3061 3062 return 0; 3063 3064 err_alloc_cookie: 3065 mwifiex_pcie_delete_cmdrsp_buf(adapter); 3066 err_alloc_cmdbuf: 3067 mwifiex_pcie_delete_evtbd_ring(adapter); 3068 err_cre_evtbd: 3069 mwifiex_pcie_delete_rxbd_ring(adapter); 3070 err_cre_rxbd: 3071 mwifiex_pcie_delete_txbd_ring(adapter); 3072 err_cre_txbd: 3073 return ret; 3074 } 3075 3076 static void mwifiex_pcie_free_buffers(struct mwifiex_adapter *adapter) 3077 { 3078 struct pcie_service_card *card = adapter->card; 3079 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 3080 3081 if (reg->sleep_cookie) 3082 mwifiex_pcie_delete_sleep_cookie_buf(adapter); 3083 3084 mwifiex_pcie_delete_cmdrsp_buf(adapter); 3085 mwifiex_pcie_delete_evtbd_ring(adapter); 3086 mwifiex_pcie_delete_rxbd_ring(adapter); 3087 mwifiex_pcie_delete_txbd_ring(adapter); 3088 } 3089 3090 /* 3091 * This function initializes the PCI-E host memory space, WCB rings, etc. 3092 */ 3093 static int mwifiex_init_pcie(struct mwifiex_adapter *adapter) 3094 { 3095 struct pcie_service_card *card = adapter->card; 3096 int ret; 3097 struct pci_dev *pdev = card->dev; 3098 3099 pci_set_drvdata(pdev, card); 3100 3101 ret = pci_enable_device(pdev); 3102 if (ret) 3103 goto err_enable_dev; 3104 3105 pci_set_master(pdev); 3106 3107 ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); 3108 if (ret) { 3109 pr_err("dma_set_mask(32) failed: %d\n", ret); 3110 goto err_set_dma_mask; 3111 } 3112 3113 ret = pci_request_region(pdev, 0, DRV_NAME); 3114 if (ret) { 3115 pr_err("req_reg(0) error\n"); 3116 goto err_req_region0; 3117 } 3118 card->pci_mmap = pci_iomap(pdev, 0, 0); 3119 if (!card->pci_mmap) { 3120 pr_err("iomap(0) error\n"); 3121 ret = -EIO; 3122 goto err_iomap0; 3123 } 3124 ret = pci_request_region(pdev, 2, DRV_NAME); 3125 if (ret) { 3126 pr_err("req_reg(2) error\n"); 3127 goto err_req_region2; 3128 } 3129 card->pci_mmap1 = pci_iomap(pdev, 2, 0); 3130 if (!card->pci_mmap1) { 3131 pr_err("iomap(2) error\n"); 3132 ret = -EIO; 3133 goto err_iomap2; 3134 } 3135 3136 pr_notice("PCI memory map Virt0: %pK PCI memory map Virt2: %pK\n", 3137 card->pci_mmap, card->pci_mmap1); 3138 3139 ret = mwifiex_pcie_alloc_buffers(adapter); 3140 if (ret) 3141 goto err_alloc_buffers; 3142 3143 if (pdev->device == PCIE_DEVICE_ID_MARVELL_88W8897) 3144 adapter->ignore_btcoex_events = true; 3145 3146 return 0; 3147 3148 err_alloc_buffers: 3149 pci_iounmap(pdev, card->pci_mmap1); 3150 err_iomap2: 3151 pci_release_region(pdev, 2); 3152 err_req_region2: 3153 pci_iounmap(pdev, card->pci_mmap); 3154 err_iomap0: 3155 pci_release_region(pdev, 0); 3156 err_req_region0: 3157 err_set_dma_mask: 3158 pci_disable_device(pdev); 3159 err_enable_dev: 3160 return ret; 3161 } 3162 3163 /* 3164 * This function cleans up the allocated card buffers. 3165 */ 3166 static void mwifiex_cleanup_pcie(struct mwifiex_adapter *adapter) 3167 { 3168 struct pcie_service_card *card = adapter->card; 3169 struct pci_dev *pdev = card->dev; 3170 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 3171 u32 fw_status; 3172 3173 /* Perform the cancel_work_sync() only when we're not resetting 3174 * the card. It's because that function never returns if we're 3175 * in reset path. If we're here when resetting the card, it means 3176 * that we failed to reset the card (reset failure path). 3177 */ 3178 if (!card->pci_reset_ongoing) { 3179 mwifiex_dbg(adapter, MSG, "performing cancel_work_sync()...\n"); 3180 cancel_work_sync(&card->work); 3181 mwifiex_dbg(adapter, MSG, "cancel_work_sync() done\n"); 3182 } else { 3183 mwifiex_dbg(adapter, MSG, 3184 "skipped cancel_work_sync() because we're in card reset failure path\n"); 3185 } 3186 3187 mwifiex_read_reg(adapter, reg->fw_status, &fw_status); 3188 if (fw_status == FIRMWARE_READY_PCIE) { 3189 mwifiex_dbg(adapter, INFO, 3190 "Clearing driver ready signature\n"); 3191 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000)) 3192 mwifiex_dbg(adapter, ERROR, 3193 "Failed to write driver not-ready signature\n"); 3194 } 3195 3196 pci_disable_device(pdev); 3197 3198 pci_iounmap(pdev, card->pci_mmap); 3199 pci_iounmap(pdev, card->pci_mmap1); 3200 pci_release_region(pdev, 2); 3201 pci_release_region(pdev, 0); 3202 3203 mwifiex_pcie_free_buffers(adapter); 3204 } 3205 3206 static int mwifiex_pcie_request_irq(struct mwifiex_adapter *adapter) 3207 { 3208 int ret, i, j; 3209 struct pcie_service_card *card = adapter->card; 3210 struct pci_dev *pdev = card->dev; 3211 3212 if (card->pcie.reg->msix_support) { 3213 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) 3214 card->msix_entries[i].entry = i; 3215 ret = pci_enable_msix_exact(pdev, card->msix_entries, 3216 MWIFIEX_NUM_MSIX_VECTORS); 3217 if (!ret) { 3218 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) { 3219 card->msix_ctx[i].dev = pdev; 3220 card->msix_ctx[i].msg_id = i; 3221 3222 ret = request_irq(card->msix_entries[i].vector, 3223 mwifiex_pcie_interrupt, 0, 3224 "MWIFIEX_PCIE_MSIX", 3225 &card->msix_ctx[i]); 3226 if (ret) 3227 break; 3228 } 3229 3230 if (ret) { 3231 mwifiex_dbg(adapter, INFO, "request_irq fail: %d\n", 3232 ret); 3233 for (j = 0; j < i; j++) 3234 free_irq(card->msix_entries[j].vector, 3235 &card->msix_ctx[i]); 3236 pci_disable_msix(pdev); 3237 } else { 3238 mwifiex_dbg(adapter, MSG, "MSIx enabled!"); 3239 card->msix_enable = 1; 3240 return 0; 3241 } 3242 } 3243 } 3244 3245 if (pci_enable_msi(pdev) != 0) 3246 pci_disable_msi(pdev); 3247 else 3248 card->msi_enable = 1; 3249 3250 mwifiex_dbg(adapter, INFO, "msi_enable = %d\n", card->msi_enable); 3251 3252 card->share_irq_ctx.dev = pdev; 3253 card->share_irq_ctx.msg_id = -1; 3254 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED, 3255 "MRVL_PCIE", &card->share_irq_ctx); 3256 if (ret) { 3257 pr_err("request_irq failed: ret=%d\n", ret); 3258 return -1; 3259 } 3260 3261 return 0; 3262 } 3263 3264 /* 3265 * This function gets the firmware name for downloading by revision id 3266 * 3267 * Read revision id register to get revision id 3268 */ 3269 static void mwifiex_pcie_get_fw_name(struct mwifiex_adapter *adapter) 3270 { 3271 int revision_id = 0; 3272 int version, magic; 3273 struct pcie_service_card *card = adapter->card; 3274 3275 switch (card->dev->device) { 3276 case PCIE_DEVICE_ID_MARVELL_88W8766P: 3277 strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME); 3278 break; 3279 case PCIE_DEVICE_ID_MARVELL_88W8897: 3280 mwifiex_write_reg(adapter, 0x0c58, 0x80c00000); 3281 mwifiex_read_reg(adapter, 0x0c58, &revision_id); 3282 revision_id &= 0xff00; 3283 switch (revision_id) { 3284 case PCIE8897_A0: 3285 strcpy(adapter->fw_name, PCIE8897_A0_FW_NAME); 3286 break; 3287 case PCIE8897_B0: 3288 strcpy(adapter->fw_name, PCIE8897_B0_FW_NAME); 3289 break; 3290 default: 3291 strcpy(adapter->fw_name, PCIE8897_DEFAULT_FW_NAME); 3292 3293 break; 3294 } 3295 break; 3296 case PCIE_DEVICE_ID_MARVELL_88W8997: 3297 mwifiex_read_reg(adapter, 0x8, &revision_id); 3298 mwifiex_read_reg(adapter, 0x0cd0, &version); 3299 mwifiex_read_reg(adapter, 0x0cd4, &magic); 3300 revision_id &= 0xff; 3301 version &= 0x7; 3302 magic &= 0xff; 3303 if (revision_id == PCIE8997_A1 && 3304 magic == CHIP_MAGIC_VALUE && 3305 version == CHIP_VER_PCIEUART) 3306 strcpy(adapter->fw_name, PCIEUART8997_FW_NAME_V4); 3307 else 3308 strcpy(adapter->fw_name, PCIEUSB8997_FW_NAME_V4); 3309 break; 3310 default: 3311 break; 3312 } 3313 } 3314 3315 /* 3316 * This function registers the PCIE device. 3317 * 3318 * PCIE IRQ is claimed, block size is set and driver data is initialized. 3319 */ 3320 static int mwifiex_register_dev(struct mwifiex_adapter *adapter) 3321 { 3322 struct pcie_service_card *card = adapter->card; 3323 3324 /* save adapter pointer in card */ 3325 card->adapter = adapter; 3326 3327 if (mwifiex_pcie_request_irq(adapter)) 3328 return -1; 3329 3330 adapter->tx_buf_size = card->pcie.tx_buf_size; 3331 adapter->mem_type_mapping_tbl = card->pcie.mem_type_mapping_tbl; 3332 adapter->num_mem_types = card->pcie.num_mem_types; 3333 adapter->ext_scan = card->pcie.can_ext_scan; 3334 mwifiex_pcie_get_fw_name(adapter); 3335 3336 return 0; 3337 } 3338 3339 /* 3340 * This function unregisters the PCIE device. 3341 * 3342 * The PCIE IRQ is released, the function is disabled and driver 3343 * data is set to null. 3344 */ 3345 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter) 3346 { 3347 struct pcie_service_card *card = adapter->card; 3348 struct pci_dev *pdev = card->dev; 3349 int i; 3350 3351 if (card->msix_enable) { 3352 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) 3353 synchronize_irq(card->msix_entries[i].vector); 3354 3355 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) 3356 free_irq(card->msix_entries[i].vector, 3357 &card->msix_ctx[i]); 3358 3359 card->msix_enable = 0; 3360 pci_disable_msix(pdev); 3361 } else { 3362 mwifiex_dbg(adapter, INFO, 3363 "%s(): calling free_irq()\n", __func__); 3364 free_irq(card->dev->irq, &card->share_irq_ctx); 3365 3366 if (card->msi_enable) 3367 pci_disable_msi(pdev); 3368 } 3369 card->adapter = NULL; 3370 } 3371 3372 /* 3373 * This function initializes the PCI-E host memory space, WCB rings, etc., 3374 * similar to mwifiex_init_pcie(), but without resetting PCI-E state. 3375 */ 3376 static void mwifiex_pcie_up_dev(struct mwifiex_adapter *adapter) 3377 { 3378 struct pcie_service_card *card = adapter->card; 3379 struct pci_dev *pdev = card->dev; 3380 3381 /* tx_buf_size might be changed to 3584 by firmware during 3382 * data transfer, we should reset it to default size. 3383 */ 3384 adapter->tx_buf_size = card->pcie.tx_buf_size; 3385 3386 mwifiex_pcie_alloc_buffers(adapter); 3387 3388 pci_set_master(pdev); 3389 } 3390 3391 /* This function cleans up the PCI-E host memory space. */ 3392 static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter) 3393 { 3394 struct pcie_service_card *card = adapter->card; 3395 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 3396 struct pci_dev *pdev = card->dev; 3397 3398 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000)) 3399 mwifiex_dbg(adapter, ERROR, "Failed to write driver not-ready signature\n"); 3400 3401 pci_clear_master(pdev); 3402 3403 adapter->seq_num = 0; 3404 3405 mwifiex_pcie_free_buffers(adapter); 3406 } 3407 3408 static struct mwifiex_if_ops pcie_ops = { 3409 .init_if = mwifiex_init_pcie, 3410 .cleanup_if = mwifiex_cleanup_pcie, 3411 .check_fw_status = mwifiex_check_fw_status, 3412 .check_winner_status = mwifiex_check_winner_status, 3413 .prog_fw = mwifiex_prog_fw_w_helper, 3414 .register_dev = mwifiex_register_dev, 3415 .unregister_dev = mwifiex_unregister_dev, 3416 .enable_int = mwifiex_pcie_enable_host_int, 3417 .disable_int = mwifiex_pcie_disable_host_int_noerr, 3418 .process_int_status = mwifiex_process_int_status, 3419 .host_to_card = mwifiex_pcie_host_to_card, 3420 .wakeup = mwifiex_pm_wakeup_card, 3421 .wakeup_complete = mwifiex_pm_wakeup_card_complete, 3422 3423 /* PCIE specific */ 3424 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete, 3425 .event_complete = mwifiex_pcie_event_complete, 3426 .update_mp_end_port = NULL, 3427 .cleanup_mpa_buf = NULL, 3428 .init_fw_port = mwifiex_pcie_init_fw_port, 3429 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf, 3430 .card_reset = mwifiex_pcie_card_reset, 3431 .reg_dump = mwifiex_pcie_reg_dump, 3432 .device_dump = mwifiex_pcie_device_dump, 3433 .down_dev = mwifiex_pcie_down_dev, 3434 .up_dev = mwifiex_pcie_up_dev, 3435 }; 3436 3437 module_pci_driver(mwifiex_pcie); 3438 3439 MODULE_AUTHOR("Marvell International Ltd."); 3440 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION); 3441 MODULE_VERSION(PCIE_VERSION); 3442 MODULE_LICENSE("GPL v2"); 3443