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