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